codeforphilly__paws-data-pipeline METASEP

src/client/src/pages/DataView360/View/components/VolunteerHistory.js METASEP
import React, { Component } from 'react';
import {
    Paper,
    Table,
    TableContainer,
    TableHead,
    TableBody,
    TableRow,
    TableCell,
    Container,
} from '@material-ui/core';
import _ from 'lodash';
import moment from 'moment';
import TimelineIcon from '@material-ui/icons/Timeline';
import DataTableHeader from './DataTableHeader';


const SHIFTS_TO_SHOW = 3;

class VolunteerHistory extends Component {

    createShiftRows(shifts) {
        const shiftsFiltered = _.filter(shifts, function(s) { return s.from !== "Invalid date"});
        const shiftsSorted = _.sortBy(shiftsFiltered, shift => {
            return new moment(shift.from_date).format("YYYY-MM-DD");
        }).reverse();

        const lastShifts = shiftsSorted.slice(0, SHIFTS_TO_SHOW)
        
        const result = _.map(lastShifts, (shift, index) => {
            shift.from_date = moment.utc(shift.from_date).format("YYYY-MM-DD")
            return(<TableRow key={index}>
                    <TableCell>{shift.from_date}</TableCell>
                    <TableCell>{shift.assignment}</TableCell>
                </TableRow>);

        });

        return result;
    }

    render() {

        return (
            <React.Fragment>
                <Container component={Paper} style={{"marginTop": "1em"}}>
                    <DataTableHeader headerText={`Volunteer History (Most Recent ${SHIFTS_TO_SHOW})`} 
                        emojiIcon={<TimelineIcon color='primary' fontSize='inherit'/>}
                    />
                    <TableContainer component={Paper} style={{"marginBottom":"1em"}} variant='outlined'>
                        <Table>
                            <TableHead>
                                <TableRow>
                                    <TableCell>Date</TableCell>
                                    <TableCell>Assignment</TableCell>
                                </TableRow>
                            </TableHead>
                            <TableBody>
                                { this.props.volunteerShifts &&  this.createShiftRows(this.props.volunteerShifts) }
                            </TableBody>
                        </Table>
                    </TableContainer>
                </Container>
            </React.Fragment>
        );
    }
}


export default VolunteerHistory;
src/client/src/pages/DataView360/View/components/VolunteerActivity.js METASEP
import React, { Component } from 'react';
import {
    Paper,
    Table,
    TableContainer,
    TableHead,
    TableBody,
    TableRow,
    TableCell,
    Container,
} from '@material-ui/core';
import EmojiPeopleIcon from '@material-ui/icons/EmojiPeople';
import DataTableHeader from './DataTableHeader';


class VolunteerActivity extends Component {

    render() {
        return (
            <React.Fragment>
                <Container component={Paper} style={{"marginTop": "1em"}}>
                    <DataTableHeader headerText={"Volunteer Activity"} 
                        emojiIcon={<EmojiPeopleIcon color='primary' fontSize='inherit'/>}
                    />
                    <TableContainer component={Paper} style={{"marginBottom": "1em"}} variant='outlined'>
                        <Table>
                            <TableHead>
                                <TableRow>
                                    <TableCell>Volunteer activity start</TableCell>
                                    <TableCell>Life hours</TableCell>
                                    <TableCell>YTD hours</TableCell>
                                </TableRow>
                            </TableHead>
                            <TableBody>
                                { this.props.volunteer && (
                                <TableRow>
                                    <TableCell>{(this.props.volunteer.start_date) ? this.props.volunteer.start_date : "N/A"}</TableCell>
                                    <TableCell>{(this.props.volunteer.life_hours) ? this.props.volunteer.life_hours.toFixed(2) : 0}</TableCell>
                                    <TableCell>{(this.props.volunteer.ytd_hours) ? this.props.volunteer.ytd_hours.toFixed(2) : 0}</TableCell>
                                </TableRow>
                                )}
                            </TableBody>
                        </Table>
                    </TableContainer>
                </Container>
            </React.Fragment>
        );
    }
}


export default VolunteerActivity;
src/client/src/pages/DataView360/View/components/Volunteer.js METASEP
import React, { Component } from 'react';
import _ from 'lodash';
import VolunteerActivity from './VolunteerActivity';
import VolunteerHistory from './VolunteerHistory';


class Volunteer extends Component {

    render() {
        return (
            <React.Fragment>
                <VolunteerActivity volunteer={this.props.volunteer} />
                <VolunteerHistory volunteerShifts={this.props.volunteerShifts} />
            </React.Fragment>
        );
    }
}

export default Volunteer;
src/client/src/pages/DataView360/View/components/SupportOverview.js METASEP
import React, { Component } from 'react';
import { Box, Container, Divider, Paper, Typography } from '@material-ui/core';
import { withStyles } from '@material-ui/core/styles';

import Grid from "@material-ui/core/Grid";

const customStyles = theme => ({
    spacingRows: {
        padding: 2
    },
    spaceIcon: {
        marginTop: 2
    }
});

class SupportOverview extends Component {

    createRowData(data) {
        const isDonor = data.first_donation_date || data.number_of_gifts > 0
        if (!isDonor) {
            return [{"title": "First Gift Date", "value": "N/A"}]
        }
        const rows = [
            { "title": "First Gift Date", "value": data.first_donation_date },
            { "title": "First Gift Amount", "value": `$${data.first_gift_amount.toFixed(2)}`},
            { "title": "Lifetime Giving", "value": `$${data.total_giving.toFixed(2)}`},
            { "title": "Total # of Gifts", "value": data.number_of_gifts},
            { "title": "Largest Gift", "value": `$${data.largest_gift.toFixed(2)}`},
            { "title": "Recurring Donor?", "value": data.is_recurring ? "Yes" : "No"},
            { "title": "RFM Score", "value": data.rfm_score }
            // { "title": "PAWS Legacy Society?", "value": "test" }
        ]
        return rows;
    }

    createRows(classes, data) {
        return data.map((row) => (
            <Grid container className={classes.spacingRows} direction={'row'} spacing={2} justify={'space-between'} key={row.title} >
                <Grid item>
                    <Typography variant={'body2'} style={{ "fontWeight": "bold" }}>
                        {row.title}
                    </Typography>
                </Grid>
                <Grid item>
                    {(row.rfm_color) 
                    ? <Typography variant={'body2'} align={"right"} style={{ "background": row.rfm_color, "color": row.rfm_text_color }}>
                        {row.value}
                    </Typography>
                    : <Typography variant={'body2'} align={"right"}>
                        {row.value}
                    </Typography>}
                </Grid>
            </Grid>
        ));
    }

    render() {
        const { classes, data } = this.props;
        const rows = this.createRowData(data);

        return (
            <Paper elevation={2} style={{ padding: '1em' }}>
                <Container className={classes.containerInfo}>
                    <Grid container direction={'column'}>
                        <Grid container className={classes.spacingRows} direction={'row'} justify='center'>
                            <Grid item style={{ "background": data.rfm_color, "borderRadius": "5px", "color": data.rfm_text_color, "paddingLeft": "1rem", "paddingRight": "1rem" }}>
                                <Typography variant={'subtitle1'}>
                                    <b>Support Overview</b>
                                    <p style={{"fontSize": "0.875rem", "textAlign": "center" }}>{data.rfm_label}</p>
                                </Typography>
                            </Grid>
                        </Grid>
                        <Box pb={2}>
                            <Divider />
                        </Box>
                        {this.createRows(classes, rows)}
                    </Grid>
                </Container>

            </Paper>
        );
    }
}

export default withStyles(customStyles)(SupportOverview);
src/client/src/pages/DataView360/View/components/Fosters.js METASEP
import React, { Component } from 'react';
import {
    IconButton,
    Paper,
    Table,
    TableContainer,
    TableHead,
    TableBody,
    TableRow,
    TableCell,
    Container
} from '@material-ui/core';
import LinkIcon from '@material-ui/icons/Link';
import _ from 'lodash';
import moment from "moment";
import Grid from "@material-ui/core/Grid";
import PetsIcon from "@material-ui/icons/Pets";

import DataTableHeader from './DataTableHeader';
import { showAnimalAge } from '../../../../utils/utils'

const PET_COUNT = 3;

class Fosters extends Component {

    getLatestPets(animals) {
        const latestPets = _.sortBy(animals, animal => {
            return animal.Events.Time
        }).reverse()

        return latestPets.slice(0, PET_COUNT)
    }

    combineAnimalAndEvents(animals, events) {
        let combined = {}
        for (const id in animals) {
            if (_.includes(_.keys(events), id)) {
                let sortedEvents = _.sortBy(events[id], ['Time'])
                combined[id] = { ...animals[id], "Events": sortedEvents }
            }
        }
        return combined
    }

    createRows(data) {
        const result = _.map(data, (row, index) => {
            const photo = row.Photos[0]
            return (
                <TableRow key={index}>
                    <TableCell align="center">{row.Name}</TableCell>
                    <TableCell align="center">{row.Type}</TableCell>
                    <TableCell align="center">{moment.unix(row.Events[0].Time).format("DD MMM YYYY")}</TableCell>
                    <TableCell align="center">{moment.unix(row.Events[1].Time).format("DD MMM YYYY")}</TableCell>
                    <TableCell align="center">{showAnimalAge(row.DOBUnixTime)}</TableCell>
                    <TableCell align="center">{<img src={photo} alt="animal" style={{ "maxWidth": "100px" }} />}</TableCell>
                </TableRow>
            );
        });

        return result;
    }

    render() {
        const { pets, events, headerText, shelterluvShortId } = this.props;
        const combined = this.combineAnimalAndEvents(pets, events)
        const numOfPets = _.size(combined);
        const latestPets = this.getLatestPets(combined);
        const headerAddition = (numOfPets > PET_COUNT) ? " (Most Recent " + PET_COUNT + ")" : ""
        const shelterLuvPersonURL = `https://www.shelterluv.com/phlp-p-${shelterluvShortId}`;

        return (
            <Container component={Paper} style={{ "marginTop": "1em" }}>
                <DataTableHeader
                    headerText={headerText + headerAddition}
                    emojiIcon={<PetsIcon color='primary' fontSize='inherit' />}
                >
                    <Grid item>
                        <IconButton style={{ 'padding': 0, 'paddingLeft': 5 }} color="primary" aria-label="link" href={shelterLuvPersonURL} target="_blank">
                            <LinkIcon />
                        </IconButton>
                    </Grid>
                </DataTableHeader>
                <TableContainer component={Paper} style={{ "marginBottom": "1em" }}>
                    <Table>
                        <TableHead>
                            <TableRow>
                                <TableCell align="center">Name</TableCell>
                                <TableCell align="center">Animal Type</TableCell>
                                <TableCell align="center">Start Date</TableCell>
                                <TableCell align="center">End Date</TableCell>
                                <TableCell align="center">Age</TableCell>
                                <TableCell align="center">Photo</TableCell>
                            </TableRow>
                        </TableHead>
                        <TableBody>
                            {latestPets && this.createRows(latestPets)}
                        </TableBody>
                    </Table>
                </TableContainer>
            </Container>
        );
    }
}


export default Fosters;
src/client/src/pages/DataView360/View/components/EventsModal.js METASEP
import React, { Component, Fragment } from 'react';
import {
    Paper,
    Table,
    TableContainer,
    TableHead,
    TableBody,
    TableRow,
    TableCell,
} from '@material-ui/core';
import { withStyles } from '@material-ui/core/styles';
import _ from 'lodash';


const customStyles = theme => ({
    spaceIcon: {
        marginTop: 3,
        marginRight: 3
    },
    headerCell: {
        fontWeight: "bold",
    },
    paper: {
        position: 'absolute',
        width: 400,
        backgroundColor: theme.palette.background.paper,
        border: '2px solid #000',
        boxShadow: theme.shadows[5],
        padding: theme.spacing(2, 4, 3),
    }
});

class EventsModal extends Component {

    render() {

        return (
            <Fragment>
                <TableContainer component={Paper} style={{ "marginBottom": "1em" }} variant='outlined'>
                    <Table>
                        <TableHead>
                            <TableRow>
                                <TableCell align="center">Subtype</TableCell>
                                <TableCell align="center">Time</TableCell>
                                <TableCell align="center">Type</TableCell>
                                <TableCell align="center">User</TableCell>
                            </TableRow>
                        </TableHead>
                        <TableBody>
                            {_.map(this.props.data, (adoptionInfo, index) => {
                                return <TableRow key={index}>
                                    <TableCell align="center">{adoptionInfo["Subtype"]}</TableCell>
                                    <TableCell align="center">{adoptionInfo["Time"]}</TableCell>
                                    <TableCell align="center">{adoptionInfo["Type"]}</TableCell>
                                    <TableCell align="center">{adoptionInfo["User"]}</TableCell>
                                </TableRow>
                            })}
                        </TableBody>
                    </Table>
                </TableContainer>
            </Fragment>)
    }
}

export default withStyles(customStyles)(EventsModal);
src/client/src/pages/DataView360/View/components/Donations.js METASEP
import React, {Component} from 'react';
import {
    Paper,
    Table,
    TableContainer,
    TableHead,
    TableBody,
    TableRow,
    TableCell,
    Container
} from '@material-ui/core';
import _ from 'lodash';
import moment from 'moment';
import AttachMoneyIcon from '@material-ui/icons/AttachMoney';
import DataTableHeader from "./DataTableHeader";

const ROWS_TO_SHOW = 3

class Donations extends Component {
    constructor(props) {
        super(props);

        this.createRows = this.createRows.bind(this);
    }

    createRows(donations) {
        const donationsSorted = _.sortBy(donations, donation => {
            return new moment(donation.close_date).format("YYYY-MM-DD");
        }).reverse();

        const latestDonations = donationsSorted.slice(0, ROWS_TO_SHOW);

        const result = _.map(latestDonations, (donation, index) => {
            return (<TableRow key={index}>
                <TableCell>{donation.close_date}</TableCell>
                <TableCell>${donation.amount.toFixed(2)}</TableCell>
                <TableCell>{donation.type}</TableCell>
                <TableCell>{donation.primary_campaign_source}</TableCell>
            </TableRow>);
        });

        return result;
    }

    render() {
        const headerText = `Financial Support Activity (Most Recent ${ROWS_TO_SHOW})`
        return (
            <Container component={Paper} style={{"marginTop": "1em"}}>
                <DataTableHeader
                    headerText={headerText}
                    emojiIcon={<AttachMoneyIcon color='primary' fontSize='inherit' />}
                />

                <TableContainer component={Paper} variant='outlined' style={{"marginBottom": "1em"}}>
                    <Table>
                        <TableHead>
                            <TableRow>
                                <TableCell>Date of Donation</TableCell>
                                <TableCell>Amount</TableCell>
                                <TableCell>Donation Type</TableCell>
                                <TableCell>Primary Campaign Source</TableCell>
                            </TableRow>
                        </TableHead>
                        <TableBody>
                            {this.props.donations && this.createRows(this.props.donations)}
                        </TableBody>
                    </Table>
                </TableContainer>
            </Container>
        );
    }
}


export default Donations;
src/client/src/pages/DataView360/View/components/DataTableHeader.js METASEP
import React from 'react';
import {
    Typography,
} from '@material-ui/core';
import Grid from "@material-ui/core/Grid";
import Box from "@material-ui/core/Box";


function DataTableHeader(props) {
    const { headerText, emojiIcon } = props;
    return (
        <Typography variant='subtitle1'>
            <Box pt={1}>
                <Grid container direction={'row'} alignItems="center" alignContent="center">
                    <Grid item>
                        <Box pt={1.2}>
                            {emojiIcon}
                        </Box>

                    </Grid>
                    <Grid item>
                        {headerText}
                    </Grid>
                    <Grid item>
                        {props.children}
                    </Grid>
                </Grid>
            </Box>

        </Typography>
    );
}

export default DataTableHeader;
src/client/src/pages/DataView360/View/components/ContactInfo.js METASEP
import React, {Component} from 'react';
import {Box, Divider, Paper, Typography} from '@material-ui/core';
import PhoneIcon from '@material-ui/icons/Phone';
import MailOutlineIcon from '@material-ui/icons/MailOutline';
import HomeIcon from '@material-ui/icons/Home';

import _ from 'lodash';
import {formatPhoneNumber} from "../../../../utils/utils";
import Grid from "@material-ui/core/Grid";


const SOURCE_TYPES = ["salesforcecontacts", "volgistics", "shelterluvpeople"]


class ContactInfo extends Component {

    populate_participant_with_data_source(participant, participantData) {
        return {
            first_name: _.get(participantData, "first_name") || _.get(participant, "first_name") || "",
            last_name: _.get(participantData, "last_name") || _.get(participant, "last_name") || "",
            email: _.get(participantData, "email") || _.get(participant, "email") || "",
            mobile: _.get(participantData, "mobile") || _.get(participant, "mobile") || "",
            city: _.get(participantData, "city") || _.get(participant, "city") || "",
            street_and_number: _.get(participantData, "street_and_number") || _.get(participant, "street_and_number") || "",
            zip: _.get(participantData, "zip") || _.get(participant, "zip") || "",
            state: _.get(participantData, "state") || _.get(participant, "state") || ""
        };
    }

    //populates by the order of the source types array
    populate_participant_data(participantArray) {
        let retVal = {};

        _.map(SOURCE_TYPES, source_type => {
            const participant_source_data = _.find(participantArray, {"source_type": source_type});
            retVal = this.populate_participant_with_data_source(participant_source_data, retVal);
        });

        return retVal
    }


    render() {
        let participantArray = _.get(this.props, "participant");
        let participantData = this.populate_participant_data(participantArray);

        return (
            <Paper elevation={2} style={{padding: '2em'}}>
                <Grid container direction={'column'} spacing={1}>
                    <Grid item>
                        <Box display="flex" justifyContent="center">
                            <Typography
                                variant={'h6'}>{participantData.first_name + ' ' + participantData.last_name}
                            </Typography>
                        </Box>
                        <Box pb={2}>
                            <Divider/>
                        </Box>
                    </Grid>
                    <Grid container item direction={'row'} spacing={1} alignItems="center">
                        <Grid item>
                            <PhoneIcon color='primary' fontSize='small'/>
                        </Grid>
                        <Grid item>
                            <Typography variant={'body2'}>{formatPhoneNumber(participantData.mobile)}
                            </Typography>
                        </Grid>
                    </Grid>
                    <Grid container item direction={'row'} spacing={1} alignItems="center">
                        <Grid item>
                            <MailOutlineIcon color='primary' fontSize='small'/>
                        </Grid>
                        <Grid item>
                            <Typography variant={'body2'}>
                                {participantData.email}
                            </Typography>
                        </Grid>
                    </Grid>
                    <Grid container item direction={'column'} alignItems="flex-start">
                        <Grid container item direction="row" alignItems="center" spacing={1}>
                            <Grid item>
                                <HomeIcon color='primary' fontSize='small'/>
                            </Grid>
                            <Grid item>
                                <Typography variant={'body2'}>
                                    {participantData.street_and_number}
                                </Typography>
                            </Grid>
                        </Grid>
                        <Grid container item direction="row" spacing={1} style={{paddingLeft: 37}}>
                            <Grid item>
                                <Typography variant={'body2'}>
                                    {participantData.city + ', ' + participantData.state + ' ' + participantData.zip}
                                </Typography>
                            </Grid>
                        </Grid>
                    </Grid>
                </Grid>

            </Paper>
        );
    }
}

export default ContactInfo;
src/client/src/pages/DataView360/View/components/CollapsibleTable.js METASEP
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Box from '@material-ui/core/Box';
import Collapse from '@material-ui/core/Collapse';
import IconButton from '@material-ui/core/IconButton';
import Table from '@material-ui/core/Table';
import TableBody from '@material-ui/core/TableBody';
import TableCell from '@material-ui/core/TableCell';
import TableContainer from '@material-ui/core/TableContainer';
import TableHead from '@material-ui/core/TableHead';
import TableRow from '@material-ui/core/TableRow';
import Typography from '@material-ui/core/Typography';
import Paper from '@material-ui/core/Paper';
import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
import KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp';

import _ from 'lodash';
import moment from "moment";
import {showAnimalAge} from "../../../../utils/utils";

const useRowStyles = makeStyles({
    root: {
        '& > *': {
            borderBottom: 'unset',
        },
    },
});


function Row(props) {
    const [open, setOpen] = React.useState(false);
    const classes = useRowStyles();
    const { row, events } = props;
    const photo = row.Photos[0]
    return (
        <React.Fragment>
            <TableRow className={classes.root}>
                <TableCell>
                    <IconButton aria-label="expand row" size="small" onClick={() => setOpen(!open)}>
                        {open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
                    </IconButton>
                </TableCell>
                <TableCell component="th" scope="row">
                    {row.Name}
                </TableCell>
                <TableCell align="center">{row.Type}</TableCell>
                <TableCell align="center">{row.Breed}</TableCell>
                <TableCell align="center">{showAnimalAge(row.DOBUnixTime)}</TableCell>
                <TableCell align="center">{<img src={photo} alt="animal" style={{ "maxWidth": "100px" }} />}</TableCell>
            </TableRow>
            <TableRow>
                <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}>
                    <Collapse in={open} timeout="auto" unmountOnExit>
                        <Box margin={1}>
                            <Typography variant="h6" gutterBottom component="div">
                                History
                            </Typography>
                            <Table size="small" aria-label="purchases">
                                <TableHead>
                                    <TableRow>
                                        <TableCell align="center">Subtype</TableCell>
                                        <TableCell align="center">Date</TableCell>
                                        <TableCell align="center">Type</TableCell>
                                        <TableCell align="center">User</TableCell>
                                    </TableRow>
                                </TableHead>
                                <TableBody>
                                    {events.map((historyRow) => (
                                        <TableRow key={historyRow.Time}>
                                            <TableCell component="th" scope="row">
                                                {historyRow.Subtype}
                                            </TableCell>
                                            <TableCell align="center">{moment.unix(historyRow.Time).format("DD MMM YYYY")}</TableCell>
                                            <TableCell align="center">{historyRow.Type}</TableCell>
                                            <TableCell align="center">{historyRow.User}</TableCell>
                                        </TableRow>
                                    ))}
                                </TableBody>
                            </Table>
                        </Box>
                    </Collapse>
                </TableCell>
            </TableRow>
        </React.Fragment>
    );
}

export default function CollapsibleTable(props) {
    const data = props.data;
    let events = props.events;
    const rows = _.values(data)
    return (
        <TableContainer component={Paper} variant='outlined' style={{"marginBottom": "1em"}}>
            <Table aria-label="collapsible table">
                <TableHead>
                    <TableRow>
                        <TableCell />
                        <TableCell align="center">Name</TableCell>
                        <TableCell align="center">Animal Type</TableCell>
                        <TableCell align="center">Breed</TableCell>
                        <TableCell align="center">Age</TableCell>
                        <TableCell align="center">Photo</TableCell>
                    </TableRow>
                </TableHead>
                <TableBody>
                    {rows.map((row) => {
                        const eventsData = events[row["Internal-ID"]];
                        return (eventsData && <Row key={row["Internal-ID"]} row={row} events={eventsData}/>)
                    })}
                </TableBody>
            </Table>
        </TableContainer>
    );
}
src/client/src/pages/DataView360/View/components/AnimalInfo.js METASEP
import React, { Component } from 'react';
import {
    Paper,
    Container,
    IconButton
} from '@material-ui/core';
import LinkIcon from '@material-ui/icons/Link';
import _ from 'lodash';
import Grid from "@material-ui/core/Grid";
import PetsIcon from "@material-ui/icons/Pets";

import CollapsibleTable from './CollapsibleTable';
import DataTableHeader from './DataTableHeader';


const PET_COUNT = 5;

class AnimalInfo extends Component {

    getLatestPets(petObject, events) {

        function customizer(objValue, srcValue) {
            if (_.isObject(objValue) && _.isObject(srcValue)) {
                // sort according to date of most recent event
                return _.set(objValue, 'Events', _.orderBy(srcValue, ['Time'], ['desc']));
            }
        }

        let result = _.mergeWith(petObject, events, customizer);
        let nonEmptyEvents = _.filter(result, function(pet) { return pet["Events"] && _.size(pet["Events"]) > 0 });
        result = [..._.orderBy(nonEmptyEvents, ['Events[0].Time'], ['desc'])]
        return result.slice(0, PET_COUNT);
    }

    render() {
        const numOfPets = _.size(this.props.pets);
        const events = this.props.events;
        const latestPets = this.getLatestPets(this.props.pets, events);
        const headerText = this.props.headerText;
        const headerAddition = (numOfPets > PET_COUNT) ? " (Showing " + PET_COUNT + " Pets out of " + numOfPets + ")" : ""
        const shelterLuvPersonURL = `https://www.shelterluv.com/phlp-p-${this.props.shelterluv_id}`;

        return (
            <Container component={Paper} style={{ "marginTop": "1em" }}>
                <DataTableHeader headerText={headerText + headerAddition}
                    emojiIcon={<PetsIcon color='primary' fontSize='inherit'/>}
                >
                    <Grid item>
                        <IconButton style={{ 'padding': 0, 'paddingLeft': 5 }} color="primary" aria-label="link" href={shelterLuvPersonURL} target="_blank">
                            <LinkIcon />
                        </IconButton>
                    </Grid>
                </DataTableHeader>
                <CollapsibleTable data={latestPets} events={events} />
            </Container>
        );
    }
}


export default AnimalInfo;
src/client/src/pages/DataView360/View/components/Adoptions.js METASEP
import React, { Component } from 'react';
import {
    IconButton,
    Paper,
    Table,
    TableContainer,
    TableHead,
    TableBody,
    TableRow,
    TableCell,
    Container
} from '@material-ui/core';
import LinkIcon from '@material-ui/icons/Link';
import { withStyles } from '@material-ui/core/styles';
import _ from 'lodash';
import moment from "moment";
import Grid from "@material-ui/core/Grid";
import PetsIcon from "@material-ui/icons/Pets";
import DataTableHeader from './DataTableHeader';
import { showAnimalAge } from '../../../../utils/utils'


const customStyles = theme => ({
    paper: {
        position: 'absolute',
        width: 400,
        backgroundColor: theme.palette.background.paper,
        border: '2px solid #000',
        boxShadow: theme.shadows[5],
        padding: theme.spacing(2, 4, 3),
    }
});

const PET_COUNT = 3;

class Adoptions extends Component {

    getLatestPets(animals) {
        const latestPets = _.sortBy(animals, animal => {
            return (animal.Events && animal.Events.Time) ? animal.Events.Time : 1
            
        }).reverse()

        return latestPets.slice(0, PET_COUNT)
    }

    createRows(data) {
        const result = _.map(data, (row, index) => {
            const photo = row.Photos[0]
            const eventDate = (row.Events && row.Events.Time) ? moment.unix(row.Events.Time).format("YYYY-MM-DD") : ''



            return (
                <TableRow key={index}>
                    <TableCell align="center">{row.Name}</TableCell>
                    <TableCell align="center">{row.Type}</TableCell>
                    <TableCell align="center">{eventDate}</TableCell>
                    <TableCell align="center">{showAnimalAge(row.DOBUnixTime)}</TableCell>
                    <TableCell align="center">{<img src={photo} alt="animal" style={{ "maxWidth": "100px" }} />}</TableCell>
                </TableRow>
            );
        });

        return result;
    }

    combineAnimalAndEvents(animals, events) {
        let combined = {}
        for (const id in animals) {
            if (_.includes(_.keys(events), id)) {
                combined[id] = { ...animals[id], "Events": events[id][0] }
            }
        }
        return combined
    }

    render() {
        const { pets, events, headerText, shelterluvShortId } = this.props;
        const combined = this.combineAnimalAndEvents(pets, events)
        const numOfPets = _.size(combined);
        const latestPets = this.getLatestPets(combined);
        const headerAddition = (numOfPets > PET_COUNT) ? " (Most Recent " + PET_COUNT + ")" : ""
        const shelterLuvPersonURL = `https://www.shelterluv.com/phlp-p-${shelterluvShortId}`;

        return (
            <Container component={Paper} style={{ "marginTop": "1em" }}>
                <DataTableHeader
                    headerText={headerText + headerAddition}
                    emojiIcon={<PetsIcon color='primary' fontSize='inherit' />}
                >
                    <Grid item>
                        <IconButton style={{ 'padding': 0, 'paddingLeft': 5 }} color="primary" aria-label="link" href={shelterLuvPersonURL} target="_blank">
                            <LinkIcon />
                        </IconButton>
                    </Grid>
                </DataTableHeader>
                <TableContainer component={Paper} variant='outlined' style={{ "marginBottom": "1em" }}>
                    <Table>
                        <TableHead>
                            <TableRow>
                                <TableCell align="center">Name</TableCell>
                                <TableCell align="center">Animal Type</TableCell>
                                <TableCell align="center">Adoption Date</TableCell>
                                <TableCell align="center">Age</TableCell>
                                <TableCell align="center">Photo</TableCell>
                            </TableRow>
                        </TableHead>
                        <TableBody>
                            {latestPets && this.createRows(latestPets)}
                        </TableBody>
                    </Table>
                </TableContainer>
            </Container>
        );
    }
}


export default withStyles(customStyles)(Adoptions);
src/client/src/pages/DataView360/Search/components/SearchBar.js METASEP
import React, {Component} from 'react';
import {Button, TextField, IconButton, Grid, Paper} from '@material-ui/core';
import SearchIcon from '@material-ui/icons/Search';

import _ from 'lodash';
import {withStyles} from "@material-ui/core/styles";

const customStyles = theme => ({
    paper: {
        padding: theme.spacing(2)
    }
});


class SearchBar extends Component {
    constructor(props) {
        super(props);

        this.state = {
            alertMinChars: true,
            participantSearch: '',
            isSearchBusy: false
        }

        this.handleParticipantSearch = this.handleParticipantSearch.bind(this);
        this.handleParticipantKeyStroke = this.handleParticipantKeyStroke.bind(this);

    }

    handleParticipantKeyStroke(event) {
        let searchStr = _.get(event, 'target.value');

        if (_.isEmpty(searchStr) !== true) {
            const searchStrSplitted = searchStr.split(' ');
            let shouldShowAlert = false;

            if (_.size(searchStrSplitted) === 2) {
                shouldShowAlert = _.size(searchStrSplitted[0]) < 2 || _.size(searchStrSplitted[1]) < 2;
            } else if (_.size(searchStrSplitted) === 1) {
                shouldShowAlert = _.size(searchStrSplitted[0]) < 2;
            }

            this.setState({alertMinChars: shouldShowAlert});
        }
        this.setState({participantSearch: searchStr});
    }

    searchParticipant(event) {
        return (

            <form onSubmit={this.handleParticipantSearch}>
                <Grid container directio={"row"} justify="space-between">
                    <Grid item sm={10}>
                        <TextField fullWidth autoFocus
                                   error={this.state.alertMinChars}
                                   helperText={this.state.alertMinChars ? "Requires 3 search characters for first and last name" : ""}
                                   id="participant-search"
                                   label="Search by First, Last or Full Name"
                                   value={this.state.participantSearch}
                                   variant="outlined"
                                   onChange={this.handleParticipantKeyStroke}/>
                    </Grid>
                    <Grid item>
                        <Button type="submit" disabled={this.state.alertMinChars}>
                            <IconButton component="span">
                                <SearchIcon/>
                            </IconButton>
                        </Button>
                    </Grid>
                </Grid>


            </form>
        );
    }

    async handleParticipantSearch(event) {
        event.preventDefault();
        if (_.isEmpty(this.state.participantSearch) !== true) {
            this.props.handleSearchChange(this.state.participantSearch);
        }
    };

    render() {
        const {classes} = this.props;

        return (
            <Grid container direction={"column"}>
                <Grid container direction={"row"} justify={"center"}>
                    <Grid item xs={9}>
                        <Paper className={classes.paper}>
                            {this.searchParticipant()}
                        </Paper>
                    </Grid>
                </Grid>
            </Grid>
        )
    }
}

export default withStyles(customStyles)(SearchBar);
src/client/src/pages/DataView360/View/View360.js METASEP
import React, {Component} from 'react';
import {withStyles} from '@material-ui/core/styles';
import {withRouter, matchPath} from "react-router";

import {
    Paper,
    Container,
    Button,
    Grid,
    Backdrop,
    CircularProgress,
    Typography
} from '@material-ui/core';

import _ from 'lodash';
import moment from 'moment';
import Adoptions from './components/Adoptions';
import ContactInfo from './components/ContactInfo';
import Donations from './components/Donations';
// import AnimalInfo from './components/AnimalInfo';
import SupportOverview from './components/SupportOverview';
// import Fosters from './components/Fosters';
import VolunteerActivity from './components/VolunteerActivity';
import VolunteerHistory from './components/VolunteerHistory';
import Box from "@material-ui/core/Box";


const customStyles = theme => ({
    stickyContainer: {
        position: 'sticky',
        top: 100
    },
    tablesCol: {
        minWidth: '600px'
    }
});

class View360 extends Component {
    constructor(props) {
        super(props);

        this.state = {
            participantData: {},
            animalData: {},
            adoptionEvents: {},
            fosterEvents: {},
            matchId: undefined,
            isDataBusy: false,
        }

        this.onBackClick = this.onBackClick.bind(this);
    }

    async componentDidMount() {
        await this.setState({
            isDataBusy: true,
            showSearchBar: false,
            matchId: _.last(this.props.location.pathname.split('/'))
        });

        let response = await fetch(`/api/360/${this.state.matchId}`,
            {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': 'Bearer ' + this.props.access_token
                }
            });
        response = await response.json();

        let shelterluvInfo = await fetch(`/api/person/${this.state.matchId}/animals`,
            {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': 'Bearer ' + this.props.access_token
                }
            });
        shelterluvInfo = await shelterluvInfo.json()
        const shelterluvShortId = shelterluvInfo["person_details"]["shelterluv_short_id"]
        let animalInfo = shelterluvInfo["animal_details"]

        const animalIds = _.keys(animalInfo);

        let adoptionEvents = {};
        let fosterEvents = {};

        for (let id of animalIds) {
            let events = await this.getAnimalEvents(id, this.state.matchId);
            
            adoptionEvents[id] = _.filter(events[id], function(e) {
                return e["Type"] && e["Type"] === "Outcome.Adoption"
            });
            fosterEvents[id] = _.filter(events[id], function(e) {
                return e["Type"] && e["Type"].toLowerCase().includes("foster");
            });
        }

        let supportOverviewData = await fetch(`/api/person/${this.state.matchId}/support`,
            {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': 'Bearer ' + this.props.access_token
                }
            });
        supportOverviewData = await supportOverviewData.json()
        
        this.setState({
            participantData: {...response.result, "shelterluvShortId" : shelterluvShortId},
            animalData: animalInfo,
            adoptionEvents: adoptionEvents,
            fosterEvents: fosterEvents,
            isDataBusy: false,
            supportOverviewData: supportOverviewData
        });

    }

    async getAnimalEvents(animalId, matchId) {
        let response = await fetch(`/api/person/${matchId}/animal/${animalId}/events`,
            {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': 'Bearer ' + this.props.access_token
                }
            });
        return await response.json()
    }

    onBackClick() {
        const url =  JSON.parse(this.props.location.state.state).url;

        const match = matchPath(url, {
            path: url,
            exact: true
        });

        this.props.history.push(match.url, this.props.location.state.state);
    }

    render() {
        const {classes} = this.props;

        return (
            <Container>
                <Box display="flex" justifyContent="center" pb={3}>
                    <Typography variant={"h2"}>Person 360 View</Typography>
                </Box>
                {(_.isEmpty(this.state.participantData) !== true &&
                    this.state.isDataBusy !== true && (
                        <Paper elevation={1} style={{"padding": "2em"}}>

                            <Grid container direction={"row"} spacing={3}>
                                <Grid item xs={4}>
                                    <Grid className={classes.stickyContainer} container direction={"column"}
                                          alignItems={"center"}>
                                        <Grid item>
                                            <ContactInfo
                                                participant={_.get(this.state, 'participantData.contact_details')}/>
                                        </Grid>
                                        <Grid item style={{"marginTop": "1em"}}>
                                            <SupportOverview data={_.get(this.state, 'supportOverviewData')}/>
                                        </Grid>
                                        <Grid item style={{"padding": "1em"}}>
                                            <Button style={{"minWidth": "180"}} elevation={2} variant="contained"
                                                    color="primary"
                                                    onClick={() => {
                                                        this.onBackClick()
                                                    }}>Back to Results
                                            </Button>
                                        </Grid>
                                    </Grid>

                                </Grid>
                                <Grid item xs={8} className={classes.tablesCol}>
                                    <Grid container direction="column" style={{"marginTop": "1em"}}>
                                        <Donations donations={_.get(this.state, 'participantData.donations')}/>
                                        <Adoptions pets={_.get(this.state, 'animalData')}
                                                    events={_.get(this.state, 'adoptionEvents')}
                                                    headerText={"Adoption Records"}
                                                    shelterluvShortId={_.get(this.state, 'participantData.shelterluvShortId')}

                                        />
                                        {/* <Fosters pets={_.get(this.state, 'animalData')}
                                                    events={_.get(this.state, 'fosterEvents')}
                                                    headerText={"Foster Records"}
                                                    shelterluvShortId={_.get(this.state, 'participantData.shelterluvShortId')}
                                        /> */}
                                        <VolunteerActivity volunteer={_.first(_.get(this.state, 'participantData.activity'))} />
                                        <VolunteerHistory volunteerShifts={_.get(this.state, 'participantData.shifts')} />
                                    </Grid>
                                </Grid>
                            </Grid>
                        </Paper>))}
                {this.state.isDataBusy === true && (
                    <Backdrop open={this.state.isLoading !== false}>
                        <CircularProgress size={60}/>
                    </Backdrop>
                )}
            </Container>
        );
    }
}

export default withRouter(withStyles(customStyles)(View360));
src/client/src/pages/DataView360/Search/Search.js METASEP
import React from 'react';
import {matchPath} from "react-router";
import {useHistory} from "react-router-dom";
import {makeStyles} from '@material-ui/styles';

import {
    Paper,
    Container,
    Table,
    TableBody,
    TableCell,
    TableContainer,
    TableHead,
    TableRow,
    Typography,
    Box,
    Backdrop,
    CircularProgress
} from '@material-ui/core';

import _, {lowerCase} from 'lodash';
import SearchBar from './components/SearchBar';
import {formatPhoneNumber} from "../../../utils/utils";
import Grid from "@material-ui/core/Grid";

const useStyles = makeStyles({
    table: {
        "&:hover": {
            backgroundColor: "#E6F7FF",
            cursor: "pointer"
        }
    },
    tableRowEven: {
        backgroundColor: "#FFFFFF"
    },
    tableRowOdd: {
        backgroundColor: "#E8E8E8"
    },
    container: {
        maxHeight: 600,
    },
    narrowCell: {
        'width': '150px',
    }
});

export const Search360 = (props) => {
    const history = useHistory();
    const classes = useStyles();

    const [searchParticipant, setSearchParticipant] = React.useState('');
    const [isLoading, setIsLoading] = React.useState(false);
    const [participantList, setParticipantList] = React.useState(undefined);


    React.useEffect(() => {
        (async () => {
            let state = _.get(history, 'location.state');
            if (_.isEmpty(state) !== true) {
                let stateData = JSON.parse(state);
                await setSearchParticipant(stateData.participant);
                await setParticipantList(stateData.participantList)
            }
        })();
    }, []);

    const onRowClick = (matching_id) => {
        const match = matchPath(`/360view/view/${matching_id}`, {
            path: "/360view/view/:matching_id",
            exact: true,
            params: {matching_id}
        });
        history.push(match.url, {
            state: JSON.stringify((
                {
                    participant: searchParticipant,
                    participantList: participantList,
                    url: `/360view/search`
                }
            ))
        })
    }

    const namesToLowerCase = (participant) => {
        let first_name = participant.first_name
        let last_name = participant.last_name

        return {
            ...participant,
            lower_first_name: lowerCase(first_name),
            lower_last_name: lowerCase(last_name)
        }
    }

    const renderParticipantsTable = () => {
        const tableRowColors = [classes.tableRowEven, classes.tableRowOdd]

        let participantListGrouped = _.map(participantList, namesToLowerCase)
        participantListGrouped = _.groupBy(participantListGrouped, "matching_id");
        participantListGrouped = _.orderBy(participantListGrouped, ['0.lower_last_name', '0.lower_first_name']);

        return (
            <Grid container direction={"column"}>
                <Grid container direction={"row"} justify={"center"}>
                    <Grid item>
                        <Box pt={2} pb={4}>
                            <Typography>You searched for <b>{searchParticipant}</b></Typography>
                        </Box>

                    </Grid>
                </Grid>
                <Grid container direction={"row"}>
                    <Paper>
                        <TableContainer className={classes.container}>
                            <Table className={classes.table} size="small" stickyHeader aria-label="sticky table">
                                <TableHead>
                                    <TableRow>
                                        <TableCell width="5%">Match ID</TableCell>
                                        <TableCell width="5%">First Name</TableCell>
                                        <TableCell width="5%">Last Name</TableCell>
                                        <TableCell width="5%">Email</TableCell>
                                        <TableCell width="10%">Mobile</TableCell>
                                        <TableCell width="10%">RFM Score</TableCell>
                                        <TableCell width="10%">Source</TableCell>
                                        <TableCell width="10%">ID in Source</TableCell>
                                    </TableRow>
                                </TableHead>
                                <TableBody>
                                    {
                                        _.map(participantListGrouped, (row_group, index) => {
                                            return _.map(row_group, (row, idx) => {
                                                return <TableRow key={`${row.source_id}${idx}`}
                                                                 className={[classes.table, tableRowColors[index % _.size(tableRowColors)]].join(" ")}
                                                                 onClick={() => onRowClick(row.matching_id)}>
                                                    <TableCell>{row.matching_id}</TableCell>
                                                    <TableCell>{row.first_name}</TableCell>
                                                    <TableCell>{row.last_name}</TableCell>
                                                    <TableCell>{row.email}</TableCell>
                                                    <TableCell>{formatPhoneNumber(row.mobile)}</TableCell>
                                                    <TableCell
                                                               style={{
                                                                   backgroundColor: row.rfm_color,
                                                                   color: row.rfm_text_color
                                                               }}>
                                                        {row.rfm_score} ({row.rfm_label})
                                                    </TableCell>
                                                    <TableCell>{row.source_type}</TableCell>
                                                    <TableCell>{row.source_id}</TableCell>
                                                </TableRow>
                                            })
                                        })
                                    }
                                </TableBody>
                            </Table>
                        </TableContainer>
                    </Paper>
                </Grid>
            </Grid>
        )
    }

    const handleSearchChange = async (search_participant) => {
        setIsLoading(true);
        setSearchParticipant(search_participant);

        let response = await fetch(`/api/contacts/${search_participant}`,
            {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': 'Bearer ' + props.access_token
                }
            }
        );
        response = await response.json();

        await setParticipantList(response.result);

        setIsLoading(false);
    }

    return (
        <Container maxWidth={"lg"}>
            <Box display="flex" justifyContent="center" pb={3}>
                <Typography variant={"h2"}>PAWS Contact Search</Typography>
            </Box>
            <SearchBar participant={searchParticipant}
                       handleParticipantChange={onRowClick}
                       handleSearchChange={handleSearchChange}/>

            {isLoading === true ?
                <Backdrop open={isLoading !== false}>
                    <CircularProgress size={60}/>
                </Backdrop> :
                (participantList && _.isEmpty(participantList) !== true) ?
                    renderParticipantsTable()
                    : participantList && _.isEmpty(participantList) === true &&
                    <Box display="flex" justifyContent="center" pt={5}>
                        <Typography variant={"h5"}>No Results</Typography>
                    </Box>
            }
        </Container>
    );
}

src/client/src/pages/RFM/RFM.js METASEP
import React from 'react';
import {matchPath} from "react-router";

import {
    Backdrop,
    Button,
    CircularProgress,
    Container,
    Paper,
    Table,
    TableBody,
    TableCell,
    TableContainer,
    TableHead,
    TableRow
} from '@material-ui/core';
import _ from 'lodash';
import Typography from "@material-ui/core/Typography";
import Grid from "@material-ui/core/Grid";
import Box from "@material-ui/core/Box";
import {makeStyles} from "@material-ui/styles";
import {formatPhoneNumber} from "../../utils/utils";
import {useHistory} from "react-router-dom";

const RFM_LIMIT = 100

const useStyles = makeStyles({
    container: {
        maxHeight: 600,
    },
    tableRow: {
        "&:hover": {
            backgroundColor: "#E6F7FF",
            cursor: "pointer"
        }
    },
});

export function RFM(props) {
    const classes = useStyles();
    const history = useHistory();

    const [labels, setLabels] = React.useState([]);
    const [selectedLabel, setSelectedLabel] = React.useState("");
    const [participants, setParticipants] = React.useState(undefined);
    const [isLoading, setIsLoading] = React.useState(false);

    React.useEffect(() => {
        setIsLoading(true);

        (async () => {
            let labelsResponse = await fetch(`/api/rfm/labels`,
                {
                    method: 'GET',
                    headers: {
                        'Content-Type': 'application/json',
                        'Authorization': 'Bearer ' + props.access_token
                    }
                });
            labelsResponse = await labelsResponse.json();
            setLabels(labelsResponse.result);

            try {
                let state = JSON.parse(_.get(history, 'location.state'));
                let stateLabel = state.selectedLabel;
                if (stateLabel) {
                    await handleLabelChange(stateLabel);
                }
            } catch {
            }

            setIsLoading(false);

        })();
    }, []);

    const handleLabelChange = async (labelData) => {
        setIsLoading(true);

        try {
            setSelectedLabel(labelData);
            let participantsResponse = await fetch(`/api/rfm/${labelData.rfm_label}/${RFM_LIMIT}`,
                {
                    method: 'GET',
                    headers: {
                        'Content-Type': 'application/json',
                        'Authorization': 'Bearer ' + props.access_token
                    }
                });
            participantsResponse = await participantsResponse.json();

            setParticipants(_.uniqBy(participantsResponse.result, 'matching_id'));
        } finally {
            setIsLoading(false);
        }

    };

    const onRowClick = (matching_id) => {
        const match = matchPath(`/360view/view/${matching_id}`, {
            path: "/360view/view/:matching_id",
            exact: true,
            params: {matching_id}
        });
        history.push(match.url, {
            state: JSON.stringify((
                {
                    url: `/rfm`,
                    selectedLabel
                }
            ))
        })
    }

    return (
        <Container maxWidth={"xl"}>
            <Box display="flex" justifyContent="center" pb={5}>
                <Typography variant={"h2"}>RFM Scores</Typography>
            </Box>
            {isLoading === true ?
                <Backdrop open={isLoading !== false}>
                    <CircularProgress size={60}/>
                </Backdrop> :

                <Grid container item direction="row">
                    <Grid container item direction="column" sm={3}>
                        <Grid item>

                            {_.isEmpty(labels) !== true &&
                            <Grid item container direction="column" spacing={3}>
                                <Grid item>
                                    <Typography variant={"h5"}>
                                        RFM Labels
                                    </Typography>
                                </Grid>
                                <Grid container item direction="column" spacing={2}>
                                    {
                                        labels.map((labelData, index) => {
                                            return <Grid item key={index}>
                                                <Button onClick={() => handleLabelChange(labelData)}
                                                        style={{
                                                            backgroundColor: labelData.rfm_color,
                                                            minWidth: 300,
                                                            border: labelData === selectedLabel ? "solid" : "none",
                                                        }}>
                                                    <Typography style={{
                                                        color: labelData.rfm_text_color,
                                                        padding: 3
                                                    }}>
                                                        {labelData.rfm_label} ({labelData.count})
                                                    </Typography>
                                                </Button>
                                            </Grid>
                                        })
                                    }
                                </Grid>
                            </Grid>}

                        </Grid>
                    </Grid>
                    <Grid container item direction="column" sm={8}>
                        <Grid item>
                            {participants &&
                            <Grid container direction="column" spacing={10}>
                                <Grid item>
                                    <Typography variant={"h5"}>
                                        Showing {RFM_LIMIT} Results:
                                    </Typography>
                                </Grid>
                                <Grid item>
                                    <Paper>
                                        <TableContainer className={classes.container}>
                                            <Table size="small" stickyHeader aria-label="sticky table">
                                                <TableHead>
                                                    <TableRow>
                                                        <TableCell align="left">First Name</TableCell>
                                                        <TableCell align="left">Last Name</TableCell>
                                                        <TableCell align="left">Email</TableCell>
                                                        <TableCell align="left">Mobile</TableCell>
                                                        <TableCell align="left">RFM</TableCell>
                                                        <TableCell align="left">Salesforce ID</TableCell>
                                                    </TableRow>
                                                </TableHead>
                                                <TableBody>
                                                    {
                                                        _.map(participants, (row, index) => {
                                                            return <TableRow key={`${row.source_id}${index}`}
                                                                             onClick={() => onRowClick(row.matching_id)}
                                                                             className={classes.tableRow}>
                                                                <TableCell align="left">{row.first_name}</TableCell>
                                                                <TableCell align="left">{row.last_name}</TableCell>
                                                                <TableCell align="left">{row.email}</TableCell>
                                                                <TableCell
                                                                    align="left">{formatPhoneNumber(row.mobile)}</TableCell>
                                                                <TableCell
                                                                    align="left">{row.rfm_score} ({row.rfm_label})</TableCell>
                                                                <TableCell align="left">{row.source_id}</TableCell>
                                                            </TableRow>
                                                        })
                                                    }
                                                </TableBody>
                                            </Table>
                                        </TableContainer>
                                    </Paper>
                                </Grid>
                            </Grid>
                            }
                        </Grid>
                    </Grid>

                </Grid>

            }

        </Container>
    );

}
src/client/src/pages/Login/useToken.js METASEP
import { useState } from 'react';

export default function useToken() {
    const getToken = () => {
        const tokenString = sessionStorage.getItem('access_token');  // getItem(key)
        const userToken = JSON.parse(tokenString);

        return userToken?.access_token
    };


    const [access_token, setToken] = useState(getToken());

    const saveToken = userToken => {
        sessionStorage.setItem('access_token', JSON.stringify(userToken));
        setToken(userToken?.access_token);
    };


    return {
        setToken: saveToken,
        access_token
    }


}
src/client/src/pages/Login/Logout.js METASEP
import React from 'react';
import PropTypes from 'prop-types';
import { useHistory } from "react-router-dom";


export default function Logout({ setToken }) {
    
    setToken(null);
    let history = useHistory();
    history.push('/')

    return (
        <div></div>
    )
}

Logout.propTypes = {
    setToken: PropTypes.func.isRequired
};
src/client/src/pages/Login/Login.js METASEP
import React, {useState} from 'react';
import PropTypes from 'prop-types';
import {CardContent, Paper, TextField, Typography} from "@material-ui/core";
import Grid from "@material-ui/core/Grid";
import Button from "@material-ui/core/Button";

function checkLoginResponse(response) {
    let gotError = !response.ok;
    if (gotError) {
        throw new Error("Unable to log in - check username and password");
    }
    return response
}


async function loginUser(credentials) {
    return fetch('/api/user/login', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(credentials)
    })
        .then(checkLoginResponse)
        .then(data => data.json())
        .catch(error => document.getElementById('loginErrorMsg').innerHTML = error)

}

export default function Login({setToken}) {
    const [username, setUserName] = useState();
    const [password, setPassword] = useState();
    //const [authcode, setAuthCode] = useState();  // For future use

    const handleSubmit = async e => {
        e.preventDefault();
        const access_token = await loginUser({
            username,
            password
        });
        setToken(access_token);
    }

    return (
        <Grid container direction="column" alignItems="center" spacing={3}>
            <Grid item>
                <Typography variant={"h2"}>Please Log In</Typography>
            </Grid>
            <Grid item>
                <Paper style={{width: 500}}>
                    <CardContent>
                        <form onSubmit={handleSubmit}>
                            <Grid item container direction="column" spacing={3}>
                                <Grid item>
                                    <TextField fullWidth type="text" label="User Name"
                                               onChange={e => setUserName(e.target.value)}/>
                                </Grid>
                                <Grid item>
                                    <TextField fullWidth type="password" label="Password"
                                               onChange={e => setPassword(e.target.value)}/>
                                </Grid>
                                <Grid item>
                                    <Button color="primary" variant="contained" type="submit">Submit</Button>
                                </Grid>
                            </Grid>

                        </form>
                        <Typography style={{paddingTop: 10, color: 'red'}} id="loginErrorMsg"></Typography>
                    </CardContent>

                </Paper>
            </Grid>
        </Grid>
    )
}

Login.propTypes = {
    setToken: PropTypes.func.isRequired
};
src/client/src/pages/Check/Check.js METASEP
import React from 'react';
import { useHistory } from "react-router-dom";
import useToken from '../../pages/Login/useToken';
var jwt = require('jsonwebtoken');

// const { DateTime } = require("luxon");  /* Enable if you enable console logging below */ 


export default function Check({access_token}) {

    const {  setToken } = useToken();

    const [processStatus, setProcessStatus] = React.useState('loading');
    const [error, setError] = React.useState('');
    const [data, setData] = React.useState('');

    let history = useHistory()
 
     

   

    // get the decoded payload and header
    var decoded = jwt.decode(access_token, { complete: true });
    const userName = decoded?.payload.sub
    const userRole = decoded?.payload.role
    const expTime = decoded?.payload.exp
    // console.log('User: ' + userName + ' / Role:' + userRole + '->' +  processStatus + ' @ ' + DateTime.local().toFormat('HH:mm:ss.SSS'))

 

    React.useEffect(() => {



        function authCheck() {
            //   console.log('authCheck startfetch @ ' + DateTime.local().toFormat('HH:mm:ss.SSS'))
               fetch('/api/user/test_auth',
               {
                   method: 'GET',
                   headers: {
                       'Content-Type': 'application/json',
                       'Authorization': 'Bearer ' + access_token
                   }
               })
           
               .then((response) => {
                //   console.log('authCheck handle response @ ' + DateTime.local().toFormat('HH:mm:ss.SSS'))
                   if (!response.ok) {
                       //throw (String(response.status + ':' + response.statusText))
                       throw (response)
                   }
                   return response.json()
               } )
               .then((data) => {
                 //  console.log('authCheck data  @ ' + DateTime.local().toFormat('HH:mm:ss.SSS'))
                   setProcessStatus('complete');
                   setData(data);
               })
               .catch((e) => {
                   let errCode = e.status
                   let errText = e.statusText
           
                   setToken(null)  // Clear the token to force login again
                   let errStr = String(e)
                   setProcessStatus('error');
                   setError(errStr);
                   console.log(errCode + ':' + errText)
                   history.push('/')
                   return e
               });
           
           }  //













        if (! access_token){
           console.log("In Check w/o a token")
        }

   // console.log('Running authCheck @ ' + DateTime.local().toFormat('HH:mm:ss.SSS'))
     authCheck();
   //  console.log('After authCheck @ ' + DateTime.local().toFormat('HH:mm:ss.SSS'))

           
    }, 
    // eslint-disable-next-line 
    [ processStatus, access_token, history ]);

    // if (processStatus === 'loading') {
    //     console.log('Check: if pc=l loading...')
    //     return <p>loading..</p>;
    // }

    if (processStatus === 'error') {
        console.log('error')
        return <p>ERROR: <i>{error}</i></p>;
    }



    // console.log("About to return")
    return (
        <div>
            <h2>Check</h2>
            <ul>
               
            <li>User: {userName}</li>
            <li>Role: {userRole}</li>
            <li>JWT expires: {-(Date.now()/1000 - expTime).toFixed(1)} secs</li>
            <li>{data}</li>

            </ul>
            {userRole === 'admin' &&
                <h2>Welcome, admin!</h2>
            }
        </div>
    );



};


src/client/src/assets/font/font.css METASEP
@font-face {
    font-family: 'Noway Round Regular';
    font-style: normal;
    font-weight: normal;
    font-display: swap;
    src: local('Noway Round Regular'), url('./NowayRound-Regular.woff') format('woff');
}
src/client/src/assets/font/NowayRound-Regular.woff METASEP

src/helm-chart/templates/tests/test-connection.yaml METASEP
apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "helm-chart.fullname" . }}-test-connection"
  labels:
    {{- include "helm-chart.labels" . | nindent 4 }}
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['{{ include "helm-chart.fullname" . }}:{{ .Values.service.port }}']
  restartPolicy: Never

src/client/src/utils/utils.js METASEP
import moment from "moment";

export function formatPhoneNumber(phoneNumberString) {
    let retVal;

    if (phoneNumberString) {
        const match = phoneNumberString.match(/^(\d{3})(\d{3})(\d{4})$/)

        if (match) {
            retVal = '(' + match[1] + ') ' + match[2] + '-' + match[3];
        }
    }

    return retVal;
}

export function getAnimalAge(epochTime) {
    let dateOfBirth = moment(epochTime * 1000);
    return moment().diff(dateOfBirth, 'years');
}

export function showAnimalAge(epochTime) {
    const age = getAnimalAge(epochTime)
    return (age === 1) ? `${age} year` : `${age} years`
}
src/client/src/theme/defaultTheme.js METASEP
import {createMuiTheme} from '@material-ui/core/styles';


const defaultTheme = createMuiTheme({
    palette: {
        primary: {
            main: '#90caf9',
            contrastText: '#fff',
        },
        secondary: {
            main: '#d9adfa',
            contrastText: '#000',
        },

    },
    typography: {
        fontFamily: 'Roboto',
        htmlFontSize: 16,
        h1: {
            fontSize: '3em',
            fontWeight: 700
        },
        h2: {
            fontSize: '2.5em',
            fontWeight: 700
        },
        h3: {
            fontSize: '2em',
            fontWeight: 700
        },
        h4: {
            fontSize: '1.7em',
            fontWeight: 700
        },
        h5: {
            fontSize: '1.5em',
            fontWeight: 700
        },
        h6: {
            fontSize: '1em',
            fontWeight: 700
        },
        subtitle1: {
            fontSize: '1.5em',
        },
        button: {
            fontSize: '0.8em',
            fontWeight: 700
        },
    }
});

defaultTheme.overrides = {
    MuiSvgIcon: {
        root: {
            padding: 5
        }
    },
    MuiBackdrop: {
        root: {
            zIndex: defaultTheme.zIndex.drawer + 1,
            color: '#fff',
        }
    },
    MuiTableCell: {
        head: {
            fontWeight: "bold"
        }
    },
};

export default defaultTheme;
src/client/src/pages/Home.js METASEP
import React, { Component } from 'react';
import startImage from '../assets/startImage.jpg';
import Grid from '@material-ui/core/Grid';
import {Typography} from "@material-ui/core";


class HomePage extends Component {
    render() {
        return (
            <Grid container direction="column" alignItems="center" spacing={4}>
                <Grid item>
                    <Typography variant="h1" >Welcome PAWS User</Typography>
                </Grid>
                <Grid item>
                    <img src={startImage} alt="animal-friends" width="300" height="300"/>
                </Grid>
            </Grid>
        );
    }
}

export default HomePage;
src/client/src/pages/Admin.js METASEP
import React from 'react';
import {
    Grid,
    Paper,
    Button,
    TableHead,
    Backdrop,
    CircularProgress,
    CardContent,
    TableRow,
    TableContainer,
    TableCell,
    TableBody,
    Table, Container, Typography
} from "@material-ui/core";

import _ from 'lodash';
import moment from "moment";
import {Alert} from "@material-ui/lab";
import Box from "@material-ui/core/Box";
import {makeStyles} from "@material-ui/styles";

const useStyles = makeStyles({});

export default function Admin(props) {
    const [isLoading, setIsLoading] = React.useState(undefined);
    const [statistics, setStatistics] = React.useState(undefined);
    const [filesInput, setFilesInput] = React.useState(undefined);
    const [fileListHtml, setFileListHtml] = React.useState(undefined);
    const [lastExecution, setLastExecution] = React.useState(undefined);
    const [isNewFileExist, setIsNewFileExist] = React.useState(false);


    React.useEffect(() => {
        (async () => {
            await refreshPage();
        })()
    }, [])

    const refreshPage = async () => {
        setIsLoading(true);

        const filesData = await fetch("/api/listCurrentFiles",
            {
                method: 'GET',
                headers: {
                    'Authorization': 'Bearer ' + props.access_token
                }
            });
        const filesResponse = await filesData.json();

        setFileListHtml(filesResponse);

        const statsData = await fetch("/api/statistics",
            {
                method: 'GET',
                headers: {
                    'Authorization': 'Bearer ' + props.access_token
                }
            });
        const statsResponse = await statsData.json()

        handleGetStatistics(statsResponse);
        determineNewFileExist(statsResponse, filesResponse);

        setIsLoading(false);
    }

    // sets newFileExists to true if one of the files was uploaded after last execution
    const determineNewFileExist = (statsResponse, filesResponse) => {
        let lastExecutionTime = statsResponse.executionTime;

        let filesUploadedAfterExecution =_.filter(filesResponse, fileName => {
            let fileTimestampAndType = fileName.substring(fileName.indexOf('-') + 1)
            let fileTimestamp = fileTimestampAndType.split('.')[0]
            let fileTimestampMoment = moment(fileTimestamp, "YYYY-MM-DD--HH-mm-ss");

            let result = moment(fileTimestampMoment).isAfter(lastExecutionTime);

            return result;
        });

        if (_.isEmpty(filesUploadedAfterExecution) === false) {
            setIsNewFileExist(true);
        }
        else {
            setIsNewFileExist(false);
        }
    }

    const handleUpload = async (event) => {
        event.preventDefault();

        setIsLoading(true);

        let formData = new FormData();

        let files = _.get(event, 'target.[0].files');
        _.forEach(files, element => {
            formData.append('file', element, element.name)
        })

        await fetch("/api/file", {
            method: 'POST',
            body: formData,
            headers: {
                'Authorization': 'Bearer ' + props.access_token
            }
        })

        setIsLoading(false);
        setFilesInput(undefined);

        await refreshPage();
    };

    const handleExecute = async (event) => {
        event.preventDefault();

        setIsLoading(true);

        await fetch('/api/execute',
            {
                method: 'POST',
                headers: {
                    'Authorization': 'Bearer ' + props.access_token
                }
            });

        await refreshPage();
    }

    const handleGetStatistics = (statsResponse) => {
        if (statsResponse !== 'executing') {
            setStatistics(_.toPairsIn(statsResponse.stats));
            setLastExecution(statsResponse.executionTime)

        } else {
            setStatistics(statsResponse);
        }
    }

    return (
        <Container>
            <Box display="flex" justifyContent="center" pb={3}>
                <Typography variant={"h2"}>Admin Portal</Typography>
            </Box>
            {isLoading === true ?
                <Backdrop open={true}>
                    <CircularProgress size={60}/>
                </Backdrop> :
                <Paper elevation={1} style={{"padding": "2em"}}>
                    {statistics === 'Running' && <Alert severity="info">Execution is in Progress...</Alert>}

                    <Grid container item spacing={5} direction="row" style={{padding: 20}}>
                        <Grid container item direction="column" spacing={3} sm={6}>
                            <Grid item>
                                <Typography variant="h5">Latest Files</Typography>
                            </Grid>
                            <Grid item>
                                {_.isEmpty(fileListHtml) !== true &&
                                    <TableContainer component={Paper}>
                                        <Table aria-label="simple table">
                                            <TableHead>
                                                <TableRow>
                                                    <TableCell><b>File Type</b></TableCell>
                                                    <TableCell><b>Last Updated</b></TableCell>
                                                </TableRow>
                                            </TableHead>
                                            <TableBody>
                                                {_.map(fileListHtml, (file, index) => {
                                                    const fileName = file.split("-")[0];
                                                    let fileDate = file.split("-").slice(1).join().split(".")[0];
                                                    let fileDateOnlyNumbers = fileDate.replaceAll(",", "");
                                                    let fileDateFormatted = moment(fileDateOnlyNumbers, "YYYYMMDDhmmss").local().format("MMMM Do YYYY, h:mm:ss a");

                                                    return (
                                                        <TableRow key={index}>
                                                            <TableCell>{fileName}</TableCell>
                                                            <TableCell>{fileDateFormatted}</TableCell>
                                                        </TableRow>
                                                    )
                                                })
                                                }
                                            </TableBody>
                                        </Table>
                                    </TableContainer>}
                            </Grid>
                            <Grid item>
                                <Paper>
                                    <CardContent>
                                        <Typography variant="h5">Upload Files</Typography>
                                        <form onSubmit={handleUpload}>
                                            <input type="file" id="fileItemsID"
                                                   value={filesInput}
                                                   multiple
                                            />
                                            <Button type="submit" variant="contained" color="primary"
                                                    disabled={statistics === 'Running'}>
                                                Upload
                                            </Button>
                                        </form>
                                    </CardContent>
                                </Paper>
                            </Grid>
                        </Grid>
                        <Grid container item direction="column" spacing={3} sm={6}>
                            <Grid item>
                                <Typography variant="h5">Last Match Analysis</Typography>
                            </Grid>
                            <Grid item>
                                {_.isEmpty(statistics) !== true &&
                                    statistics !== 'Running' &&
                                    <TableContainer component={Paper}>
                                        <Table aria-label="simple table">
                                            <TableBody>
                                                <TableRow key='time'>
                                                    <TableCell align="left" component="th" scope="row">
                                                        <b>Last Analysis</b>
                                                    </TableCell>
                                                    <TableCell align="left">
                                                        <b>
                                                            {moment(lastExecution, "dddd MMMM Do h:mm:ss YYYY").local().format("MMMM Do YYYY, h:mm:ss a")}
                                                        </b>
                                                    </TableCell>
                                                </TableRow>
                                                {statistics.map((row, index) => (
                                                    <TableRow key={index}>
                                                        <TableCell align="left" component="th" scope="row">
                                                            {row[0]}
                                                        </TableCell>
                                                        <TableCell align="left">{row[1]}</TableCell>
                                                    </TableRow>
                                                ))}
                                            </TableBody>
                                        </Table>
                                    </TableContainer>
                                }
                            </Grid>
                            <Grid item>
                                <Paper style={{padding: 5, marginTop: 10}}>
                                    <CardContent>
                                        <Typography variant="h5" styles={{paddingBottom: 5}}>Run New Analysis</Typography>
                                        <form onSubmit={handleExecute}>
                                            <Button type="submit" variant="contained" color="primary"
                                                    disabled={statistics === 'Running'}>
                                                Run Data Analysis
                                            </Button>
                                        </form>
                                    </CardContent>
                                </Paper>
                            </Grid>

                        </Grid>
                    </Grid>
                </Paper>
            }

        </Container>
    );
}
src/client/src/pages/About.js METASEP
import React from 'react';
import {Container, Divider} from '@material-ui/core';
import _ from 'lodash';
import Typography from "@material-ui/core/Typography";
import Grid from "@material-ui/core/Grid";

const DEVELOPERS = [
    "Uri Rotem",
    "Cris Simpson",
    "Ben Bucior",
    "Stephen Poserina",
    "Mike Crnkovich",
    "Mike Damert",
    "Dave Salorio",
    "Mike Bailey",
    "Donna St. Louis",
    "Joe Illuminati",
    "Andrew Bishop",
    "Akshat Vas",
    "Dan Kelley",
]

const PROJECT_MANAGERS = [
    "JW Truver",
    "Daniel Romero",
    "Eudora Linde",
    "Meg Niman"
]

const PROJECT_LEADS = [
    "Karla Fettich",
    "Chris Kohl"
]

const EXTERNAL_COLLABORATORS = [
    "Weston Welch",
    "Tan Tan Chen",
    "Faith Benamy",
    "Jesse",
    "Chris Alfano"
]

const SUPPORTERS = [
    "Code for Philly",
    "Linode"
]

const getList = (listName) => {
    return (
        <ul>
            {_.map(listName, item => {
                return (<li>
                        <Typography>
                            {item}
                        </Typography>
                    </li>
                )
            })}
        </ul>
    );
};


export default function About() {
    return (
        <Container maxWidth={"md"} style={{"padding": "1em"}}>
            <Grid container direction="column" spacing={1}>

                <Grid item>
                    <Typography variant={"h2"}>
                        <a href="https://codeforphilly.org/projects/paws_data_pipeline" target="_blank"
                           rel="noopener noreferrer">
                            The PAWS Data Pipeline
                        </a>
                    </Typography>
                </Grid>
                <Grid item>
                    <Typography>
                        The PAWS data pipeline (PDP) is community-driven and developed software that serves the
                        Philadelphia Animal Welfare Society (PAWS), Philadelphia’s largest animal rescue partner
                        and no-kill animal shelter. It is a project that began on Nov 24, 2019 and is being built
                        through a volunteer effort coordinated by Code for Philly. PDP is free and open source
                        software. The volunteers that have worked on this project come from diverse backgrounds,
                        but are connected through a shared love for animals and a passion for technology.
                    </Typography>
                </Grid>
                <Grid item>
                    <Divider/>
                </Grid>
                <Grid item>
                    <Typography>{_.size(DEVELOPERS) + _.size(PROJECT_MANAGERS) + _.size(PROJECT_LEADS) + _.size(EXTERNAL_COLLABORATORS)} individuals and {_.size(SUPPORTERS)} organisations supported and contributed to the PDP between
                        2019/11/24 and 2021/05/01:</Typography>
                </Grid>
                <Grid item>
                    <Typography variant={"h3"}>Developers</Typography>
                </Grid>
                {getList(DEVELOPERS)}
                <Grid item>
                    <Typography variant={"h3"}>Project Managers</Typography>
                </Grid>
                {getList(PROJECT_MANAGERS)}
                <Typography variant={"h3"}>Project leads</Typography>
                {getList(PROJECT_LEADS)}
                <Typography variant={"h3"}>External collaborators and supporters</Typography>
                {getList(EXTERNAL_COLLABORATORS)}
                <Typography variant={"h3"}>Organisations providing support</Typography>
                {getList(SUPPORTERS)}
            </Grid>
        </Container>

    );
}
src/client/src/components/TabPanel.js METASEP
import React from 'react';

/* Handles the visibility of each tab. By checking index against selected value in parent component */
function TabPanel (props) {
    const { children, value, index } = props;

    return (
        <div className="tab-panel" role="tabpanel" hidden={value !== index} id={`upload-download-reports-tab-${index}`}>
          {children}
        </div>

    )

}

export default TabPanel;
src/client/src/components/RefreshDlg.js METASEP
import React from 'react';
import Button from '@material-ui/core/Button';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';

import useToken from '../pages/Login/useToken';

import Refresh from './Refresh';
import defaultTheme from "../theme/defaultTheme";


export default function RefreshDlg(props) {
    const [open, setOpen] = React.useState(props.shouldOpen);
    const {access_token} = useToken();  // We want to use the passed-in top-level setToken

    const handleClose = async (shouldRefresh) => {
        // Could be closed with Yes, No, outclick (which equals No)
        setOpen(false);
        if (shouldRefresh) {
            const new_at = await Refresh(access_token);
            props.setToken(new_at);
        }
    };


    return (
        <div>
            <Dialog
                PaperProps={{
                    style: {
                        zIndex: defaultTheme.zIndex.drawer + 2
                    },
                }}
                open={open}
                aria-labelledby="alert-dialog-title"
                aria-describedby="alert-dialog-description"
                fullWidth
            >
                <DialogTitle id="alert-dialog-title">You are about to be logged out!</DialogTitle>
                <DialogContent>
                    <DialogContentText id="alert-dialog-description">
                        Stay logged in to keep working?
                    </DialogContentText>
                </DialogContent>
                <DialogActions>
                    <Button variant="outlined" onClick={() => handleClose(false)} color="primary">
                        No
                    </Button>
                    <Button variant="contained" onClick={() => handleClose(true)} color="primary"
                            autoFocus>
                        Yes
                    </Button>
                </DialogActions>
            </Dialog>
        </div>
    );
}

src/client/src/components/Refresh.js METASEP
export default async function Refresh(old_token) {
    
    // Use exisiting token to get a new fresh token

        const new_at = await fetch('/api/user/refresh',
        {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer ' + old_token
            }
        })

        .then((response) => {
            if (!response.ok) {
                //throw (String(response.status + ':' + response.statusText))
                throw (response)
            }
            return response.json()
        } )

        .catch((e) => {
            // If it failed there's not much to do, probably got here after expiration 
            return '{}'
        });

           
        return(new_at);

}


src/client/src/components/Header.js METASEP
import React, {Component} from "react";
import {Link as RouterLink} from "react-router-dom";
import {AppBar, Button, Toolbar, Typography} from "@material-ui/core";
import logo from '../assets/header-logo.png';
import Grid from "@material-ui/core/Grid";

class Header extends Component {
    render() {
        return (
            <AppBar position="static" elevation={1} color={this.props.headerType === 'Admin' ? 'secondary' : 'primary'}>
                <Toolbar>
                    <Grid container direction="row" justify="space-between" alignItems="center">
                        <Grid item>
                            <Button component={RouterLink} to="/">
                                <Grid container direction="row" spacing={2} justify="space-between" alignItems="center">
                                    <Grid item>
                                        <img src={logo} alt="logo" height={35}/>
                                    </Grid>
                                    <Grid item>
                                        <Typography variant="h5">PAWS Data Pipeline</Typography>
                                    </Grid>
                                </Grid>
                            </Button>
                        </Grid>
                        <Grid item>
                            {this.props.headerType === 'Admin' &&
                            <Button size="large" component={RouterLink} to="/admin">Admin</Button>}

                            {this.props.headerType !== 'Login' && <Button size="large" component={RouterLink} to="/360view/search">360
                                DataView</Button>
                            }
                            {this.props.headerType !== 'Login' && <Button size="large" component={RouterLink} to="/rfm">RFM
                                </Button>
                            }
                            <Button size="large" component={RouterLink} to="/about">About us</Button>
                            {this.props.headerType !== 'Login' &&
                            <Button size="large" component={RouterLink} to="/logout">Log Out</Button>}
                        </Grid>
                    </Grid>
                </Toolbar>
            </AppBar>
        );
    }

}

export default Header;


src/client/src/assets/startImage.jpg METASEP

src/client/src/assets/header-logo.png METASEP

src/client/public/images/paws-logo-64.png METASEP

src/client/public/images/logo.png METASEP

documentation/documentation-images/exec_status.svg METASEP
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="662px" height="661px" viewBox="-0.5 -0.5 662 661" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-05-30T21:08:35.659Z&quot; agent=&quot;5.0 (Windows)&quot; etag=&quot;IFYvMz14GIcdjvcz-OUr&quot; version=&quot;14.7.3&quot; type=&quot;github&quot;&gt;&lt;diagram id=&quot;WOZPnqDCfyKIEl3ywW5M&quot; name=&quot;Page-1&quot;&gt;7V1bc+I2FP41zLQPZHyHfQyQbB/Szra7002eMootwF1hsbYIsL++ki3Z+AKWHbDNZZKZWMdClvQdHX/ns0x6+nix+eyD5fxP7EDU0xRn09MnPU1TFU2hf5hlKyyKEVlmvutwW2L46v6CoiK3rlwHBqmKBGNE3GXaaGPPgzZJ2YDv43W62hSj9FWXYAZzhq82QHnrd9ch88g6NJXE/gd0Z3NxZTrA6MwCiMrcEMyBg9c7Jv2hp499jEl0tNiMIWKzJ+Yl+tzjnrNxx3zoEZkP/G1aaNb/Mfn1+H3zbHzzH/91vvW1qJV3gFZ8wLyzZCtmgPZ7yQ4JeGOm0ZwsEC2q9HA9dwn8ugQ2O7+mHkBtAQE+4TgqtEyBIcD1oM8/Y2OEwDJww8aiGnMXOU9gi1dEXEaURvlB8nG/Q5/AzY6JD/ozxAtI/C2tIs4KAIQLWry8TvA0htw238HS4DbAXWgWN53MMj3gE11h0nX5SacjJy5A/1DXBt5MZv7z8+v4ePkN+DNIuGGJXY9A/+GdTmrAbVMXoTFGmMHkYY9diOAlP4ngVHz2DROCF7zg88mKGw1nyhzRXzp3Y+XO7Jl0NGNaVpMy/WXVfTLGXkB86hysDQgCsoZBMegHfbfcE1pD2sghHS6P1ymikeCYmIfBDySYfxhOTKc17KU+mbuOAz15XPQ6uMSrshFczBwucAPtFXG92Q2WOHAWBMpmYbJOGyjPGh1daxsdtQI8l0Ie4tls7ZaiDm7s4RjsIfbeDtMHdZjD2kYQeK/Ac14RBs7FhsPYyztMItRPV8giKgDTGRohYvg18Ijq+LRPJOLb8mmIhNFJJmEobTMJMcs3JvFBHULeF9rDOq85LQChLn/Bt6rYvzvMIbS8QnT5HKICMN3hEHnJ6IZPlzjEFYoRVutihHYTI45DIc5AjNDyYsRFP8bQzkCC0PIShI0XSwQJbAyXnqZPp1PNto8CDl1F+Afcadux3izTOglsnSEX+hUJFNXxaZ9c6KcVKDpJLopmveFtEjd94ijkQj8DfULP6xM2AkHgTrcXGwlj/+4wwdCvUZ+oAEx3KMQV6RPV8WmfQhhXSCHiW0h7++9uFOIoFMI4AwphXOEjDkM+ErYX+a6RQlQApjMUwiigEIMRIK8+m4J7euaZBRhNwdPX6MUKZnvpDWhN5YZkh8iGmZcFc/jYK/8dOhwG6Dn3fgjzJEq77DRMcOOSZzaXd0M6H1H5hZb7yp0yMLlhsuGzHRa2O4Uv0HfpyEJmEto8Okre3kAVBtageqdqpjAkDYal7W4p22TFG1mAV74NJWAn4m5eVhE6qReJDgZgs8AZhM2HCBD3fbetYg/hV/jCyEDifHE7nIP1VTXjZdHQ+ccSR8u1ZA4zLWXdNZqaXEPUkcB2pxpnK3t7bIg3wsR1dOVwv5RMv7LvPWXr5zbeHKxuGOnqg1R1ehCNL1mcMcQfiLwVHqNdSnJgtv4alpF/oHXUu9jVJAe1HpQ1jHX+jnj5ycGwDi4NM5X8k68rSA7kgelMcmAW6Ffp5ODlGpODykh2IDmQ0MTK8oG9fKCUV3ORpiNsWR9kHnrqNcmyLlKu+D2xTF/2kOVjMUgzL7I0CKp46SCDqkT2FEn5rcGfRW2YaaIu/Lp4u6wp+CWe/pxwTcvmyqJXHV39/dqrP9OQmWnn1OhL7H0tVXgSSSbWX4TCcyxFRtaf9riJtBjTFX/SPtX1J0tLNRS/K9SUQ0noEacLJ/LS27DT4aQ2/Ma+l86bgl9CGDkh/N1CVcvqVrUXdYYjWKdD9el99J+rrtHLz7H7oswX7vNo0T+PDQi5TKrAiaQ1xia3MBbOuUSqdVMYyzDf783tCIyF/Sn6Ti8LsTG+0YMZiZYLjWjcSi8SnziqT5Rs1X+YsJ8jaiR1wCtnaSeTRAr7U5Q858Ejq+CG3n702pAqC/tXlAtn0HQgvVGhG5zlcDaqVxb2TyK5rbWXQRyzLJcnvfs3MYjsOLVZYSdV3pMYR28ziS8OZTsnHBDM464WEt0P6arlEsygTTIdk2ehk2UTW1kybWWe0stKLlU3J1hW+jrq8PDugUGWgQ6q1ReZ/t5xZzZlmOn+fHh7QuEKLFIDosA5xWHnkqVo/VxhcaIfhKkBew6kGstNclKE2t/+wvQcjYkwYK7LCksf2zAIft+JzNE19gRntnaewBtE6TUOkDvzWACAXihIjVhgdG2A7vmJBY2bYQj3Ie3lToROk9vJociaDu+9ONsojbjWwYjLFDdTpODxLp6PLT9RBU+nATxJdllhL8WlZJdN7m4vnHOJXX637LIWJxqW3iSbRVrs4duB2vVciug575OoA8ynUmCaJadqXlU7+/0rR8SlMzmhemIl7qzhaT/HUyW+El/uiUN5MtXiZoO7gZliEDGjqPEsIdeWJZcBlRM+Wkz+K0VUPfnnHvrD/w==&lt;/diagram&gt;&lt;/mxfile&gt;" resource="https://app.diagrams.net/#HCodeForPhilly%2Fpaws-data-pipeline%2F313-long-exec%2Fdocumentation%2Fdocumentation-images%2Fexec_status.svg"><defs/><g><rect x="0" y="140" width="480" height="40" fill="#ffffff" stroke="#000000" pointer-events="all"/><path d="M 160 140 L 160 180" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 320 140 L 320 180" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 140 M 480 140 M 480 180 M 0 180" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 140 M 160 140 M 160 180 M 0 180" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 160px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">start_flow</div></div></div></foreignObject><text x="80" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">start_flow</text></switch></g><path d="M 160 140 M 320 140 M 320 180 M 160 180" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 160px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">executing</div></div></div></foreignObject><text x="240" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">executing</text></switch></g><path d="M 320 140 M 480 140 M 480 180 M 320 180" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="0" y="220" width="480" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><path d="M 160 220 L 160 260" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 220 L 320 260" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 220 M 480 220 M 480 260 M 0 260" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 220 M 160 220 M 160 260 M 0 260" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 240px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">clean_and_load</div></div></div></foreignObject><text x="80" y="244" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">clean_and_load</text></switch></g><path d="M 160 220 M 320 220 M 320 260 M 160 260" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 240px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">executing</div></div></div></foreignObject><text x="240" y="244" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">executing</text></switch></g><path d="M 320 220 M 480 220 M 480 260 M 320 260" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 420 L 0 380 L 480 380 L 480 420" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 420 L 480 420" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 160 420 L 160 420" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 420 L 320 420" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 380 M 480 380 M 480 420 M 0 420" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 380 M 160 380 M 160 420 M 0 420" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 400px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">matching</div></div></div></foreignObject><text x="80" y="404" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">matching</text></switch></g><path d="M 160 380 M 320 380 M 320 420 M 160 420" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 400px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">executing</div></div></div></foreignObject><text x="240" y="404" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">executing</text></switch></g><path d="M 320 380 M 480 380 M 480 420 M 320 420" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="0" y="620" width="480" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><path d="M 160 620 L 160 660" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 620 L 320 660" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 620 M 480 620 M 480 660 M 0 660" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 620 M 160 620 M 160 660 M 0 660" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 640px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">flow</div></div></div></foreignObject><text x="80" y="644" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">flow</text></switch></g><rect x="160" y="620" width="160" height="40" fill="#fff2cc" stroke="none" pointer-events="none"/><path d="M 160 620 M 320 620 M 320 660 M 160 660" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 640px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">complete</div></div></div></foreignObject><text x="240" y="644" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">complete</text></switch></g><path d="M 320 620 M 480 620 M 480 660 M 320 660" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="0" y="300" width="480" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><path d="M 160 300 L 160 340" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 300 L 320 340" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 300 M 480 300 M 480 340 M 0 340" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 300 M 160 300 M 160 340 M 0 340" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 320px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">classify</div></div></div></foreignObject><text x="80" y="324" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">classify</text></switch></g><path d="M 160 300 M 320 300 M 320 340 M 160 340" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 320px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">executing</div></div></div></foreignObject><text x="240" y="324" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">executing</text></switch></g><path d="M 320 300 M 480 300 M 480 340 M 320 340" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="0" y="460" width="480" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><path d="M 160 460 L 160 500" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 460 L 320 500" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 460 M 480 460 M 480 500 M 0 500" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 460 M 160 460 M 160 500 M 0 500" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 480px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">matching</div></div></div></foreignObject><text x="80" y="484" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">matching</text></switch></g><path d="M 160 460 M 320 460 M 320 500 M 160 500" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 480px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">executing</div></div></div></foreignObject><text x="240" y="484" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">executing</text></switch></g><path d="M 320 460 M 480 460 M 480 500 M 320 500" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 480px; margin-left: 321px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">{at_row: X, of_rows: Y} </div></div></div></foreignObject><text x="400" y="484" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">{at_row: X, of_rows: Y} </text></switch></g><path d="M 404.16 457 Q 404 430 452 435 Q 500 440 510 470 Q 520 500 480 515 Q 440 530 422.28 509.79" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 418.82 505.84 L 426.06 508.8 L 422.28 509.79 L 420.8 513.41 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="0" y="540" width="480" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><path d="M 160 540 L 160 580" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 540 L 320 580" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 540 M 480 540 M 480 580 M 0 580" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 540 M 160 540 M 160 580 M 0 580" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 560px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">matching</div></div></div></foreignObject><text x="80" y="564" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">matching</text></switch></g><path d="M 160 540 M 320 540 M 320 580 M 160 580" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 560px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">executing</div></div></div></foreignObject><text x="240" y="564" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">executing</text></switch></g><path d="M 320 540 M 480 540 M 480 580 M 320 580" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 560px; margin-left: 321px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">{at_row: Y, of_rows: Y} </div></div></div></foreignObject><text x="400" y="564" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">{at_row: Y, of_rows: Y} </text></switch></g><path d="M 239.67 180 L 239.1 214.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 239.02 219.88 L 235.63 212.83 L 239.1 214.63 L 242.63 212.94 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 260 L 240 293.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 298.88 L 236.5 291.88 L 240 293.63 L 243.5 291.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 340 L 240 373.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 378.88 L 236.5 371.88 L 240 373.63 L 243.5 371.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 420 L 240 452.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 457.88 L 236.5 450.88 L 240 452.63 L 243.5 450.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 500 L 240 533.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240 538.88 L 236.5 531.88 L 240 533.63 L 243.5 531.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 239.67 580 L 239.11 613.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 239.02 618.88 L 235.64 611.82 L 239.11 613.63 L 242.63 611.94 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="0" y="0" width="480" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><path d="M 160 0 L 160 40" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 0 L 320 40" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 0 M 480 0 M 480 40 M 0 40" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="0" y="0" width="160" height="40" fill="#ededed" stroke="none" pointer-events="none"/><path d="M 0 0 M 160 0 M 160 40 M 0 40" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 20px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; "><b>stage</b></div></div></div></foreignObject><text x="80" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stage</text></switch></g><rect x="160" y="0" width="160" height="40" fill="#ededed" stroke="none" pointer-events="none"/><path d="M 160 0 M 320 0 M 320 40 M 160 40" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 20px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; "><b>status</b></div></div></div></foreignObject><text x="240" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">status</text></switch></g><rect x="320" y="0" width="160" height="40" fill="#ededed" stroke="none" pointer-events="none"/><path d="M 320 0 M 480 0 M 480 40 M 320 40" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 20px; margin-left: 321px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; "><b>details</b></div></div></div></foreignObject><text x="400" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">details</text></switch></g><path d="M 480 160 Q 540 160 570 205 Q 600 250 600 315 Q 600 380 580 470 Q 560 560 485.82 634.18" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="none"/><path d="M 481.58 638.42 L 484.41 629.93 L 485.82 634.18 L 490.07 635.59 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 363px; margin-left: 600px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 14px">(No files to process)</font></div></div></div></foreignObject><text x="600" y="367" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">(No files to process)</text></switch></g><rect x="0" y="60" width="480" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><path d="M 160 60 L 160 100" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 60 L 320 100" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 60 M 480 60 M 480 100 M 0 100" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 60 M 160 60 M 160 100 M 0 100" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 80px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">initiating</div></div></div></foreignObject><text x="80" y="84" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">initiating</text></switch></g><path d="M 160 60 M 320 60 M 320 100 M 160 100" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 80px; margin-left: 161px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; max-height: 36px; overflow: hidden; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">executing</div></div></div></foreignObject><text x="240" y="84" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">executing</text></switch></g><path d="M 320 60 M 480 60 M 480 100 M 320 100" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 239.75 100 L 239.75 133.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 239.75 138.88 L 236.25 131.88 L 239.75 133.63 L 243.25 131.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
documentation/documentation-images/SF-pic-1 METASEP

documentation/documentation-images/SF-Pic8 METASEP

documentation/documentation-images/SF-Pic7 METASEP

documentation/documentation-images/SF-Pic6 METASEP

documentation/documentation-images/SF-Pic5 METASEP

documentation/documentation-images/SF-Pic4 METASEP

documentation/documentation-images/SF-Pic3 METASEP

documentation/documentation-images/SF-Pic2 METASEP

documentation/documentation-images/ReadMe.md METASEP
The real directory for my images

src/helm-chart/templates/serviceaccount.yaml METASEP
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "helm-chart.serviceAccountName" . }}
  labels:
    {{- include "helm-chart.labels" . | nindent 4 }}
  {{- with .Values.serviceAccount.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
{{- end }}

src/helm-chart/templates/service.yaml METASEP
apiVersion: v1
kind: Service
metadata:
  name: {{ include "helm-chart.fullname" . }}
  labels:
    {{- include "helm-chart.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    {{- include "helm-chart.selectorLabels" . | nindent 4 }}

src/helm-chart/templates/pvc_server.yaml METASEP
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: {{ .Release.Name }}-server-data
  namespace: {{ .Release.Namespace }}
  labels:
    {{- include "helm-chart.selectorLabels" . | nindent 4 }}
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: {{ .Values.storage.server }}

src/helm-chart/templates/pvc.yaml METASEP
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: {{ .Release.Name }}-postgresql-data
  namespace: {{ .Release.Namespace }}
  labels:
    {{- include "helm-chart.selectorLabels" . | nindent 4 }}
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: {{ .Values.storage.pgdb }}


src/helm-chart/templates/ingress.yaml METASEP
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "helm-chart.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
    {{- include "helm-chart.labels" . | nindent 4 }}
  {{- with .Values.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
  {{- if .Values.ingress.tls }}
  tls:
    {{- range .Values.ingress.tls }}
    - hosts:
        {{- range .hosts }}
        - {{ . | quote }}
        {{- end }}
      secretName: {{ .secretName }}
    {{- end }}
  {{- end }}
  rules:
    {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
          {{- range .paths }}
          - path: {{ . }}
            pathType: Prefix
            backend:
              service:
                name: {{ $fullName }}
                port:
                  number: {{ $svcPort }}
          {{- end }}
    {{- end }}
  {{- end }}

src/helm-chart/templates/hpa.yaml METASEP
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: {{ include "helm-chart.fullname" . }}
  labels:
    {{- include "helm-chart.labels" . | nindent 4 }}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ include "helm-chart.fullname" . }}
  minReplicas: {{ .Values.autoscaling.minReplicas }}
  maxReplicas: {{ .Values.autoscaling.maxReplicas }}
  metrics:
    {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
    {{- end }}
    {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
    - type: Resource
      resource:
        name: memory
        targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
    {{- end }}
{{- end }}

src/helm-chart/templates/deployment.yaml METASEP
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "helm-chart.fullname" . }}
  labels:
    {{- include "helm-chart.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  strategy:
    type: Recreate
  selector:
    matchLabels:
      {{- include "helm-chart.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "helm-chart.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      hostAliases: 
        {{- .Values.hostAliases | toYaml  | nindent 8 }}
      volumes:
        - name: {{ .Release.Name }}-postgresql-data
          persistentVolumeClaim:
            claimName: {{ .Release.Name }}-postgresql-data
        - name: {{ .Release.Name }}-server-data
          persistentVolumeClaim:
            claimName: {{ .Release.Name }}-server-data
      serviceAccountName: {{ include "helm-chart.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        {{- with .Values.db }}
        - name: {{ $.Chart.Name }}-db
          image: "{{ .image.repository }}:{{ .image.tag | default $.Chart.AppVersion }}"
          imagePullPolicy: {{ .image.pullPolicy }}
          env:
            - name: POSTGRES_DB
              value: paws
          envFrom:
            - secretRef:
                name: db-pass
          ports:
            - name: postgresql
              containerPort: 5432
              protocol: TCP
          volumeMounts:
            - name: {{ $.Release.Name }}-postgresql-data
              mountPath: /var/lib/postgresql/data
              subPath: postgresql-data
        {{- end }}
        {{- with .Values.server }}
        - name: {{ $.Chart.Name }}-server
          image: "{{ .image.repository }}:{{ .image.tag | default $.Chart.AppVersion }}"
          imagePullPolicy: {{ .image.pullPolicy }}
          envFrom:
            - secretRef:
                name: api-server-pws
            - secretRef:
                name: db-pass
          ports:
            - containerPort: 5000
              protocol: TCP
          volumeMounts:
            - name: {{ $.Release.Name }}-server-data
              mountPath: /var/lib/server/data
              subPath: server-data
          livenessProbe:
            httpGet:
              path: /api/user/test
              port: 5000
          readinessProbe:
            httpGet:
              path: /api/user/test
              port: 5000
        {{- end }}
        {{- with .Values.client }}
        - name: {{ $.Chart.Name }}-client
          image: "{{ .image.repository }}:{{ .image.tag | default $.Chart.AppVersion }}"
          imagePullPolicy: {{ .image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
        {{- end }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

src/helm-chart/templates/_helpers.tpl METASEP
{{/*
Expand the name of the chart.
*/}}
{{- define "helm-chart.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "helm-chart.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "helm-chart.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Common labels
*/}}
{{- define "helm-chart.labels" -}}
helm.sh/chart: {{ include "helm-chart.chart" . }}
{{ include "helm-chart.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels
*/}}
{{- define "helm-chart.selectorLabels" -}}
app.kubernetes.io/name: {{ include "helm-chart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{/*
Create the name of the service account to use
*/}}
{{- define "helm-chart.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "helm-chart.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}

src/helm-chart/templates/NOTES.txt METASEP
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
  {{- range .paths }}
  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
  {{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "helm-chart.fullname" . }})
  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "helm-chart.fullname" . }}'
  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "helm-chart.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
  echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "helm-chart.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
{{- end }}

src/client/src/setupTests.js METASEP
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom/extend-expect';

src/client/src/setupProxy.js METASEP
const proxy = require('http-proxy-middleware');


module.exports = function(app) {
    app.use(proxy('/api/**', {
            target: process.env.IS_LOCAL === 'true' ? 'http://localhost:3333' : 'http://server:5000'
        }
    ));
}
src/client/src/serviceWorker.js METASEP
// This optional code is used to register a service worker.
// register() is not called by default.

// This lets the app load faster on subsequent visits in production, and gives
// it offline capabilities. However, it also means that developers (and users)
// will only see deployed updates on subsequent visits to a page, after all the
// existing tabs open on the page have been closed, since previously cached
// resources are updated in the background.

// To learn more about the benefits of this model and instructions on how to
// opt-in, read https://bit.ly/CRA-PWA

const isLocalhost = Boolean(
  window.location.hostname === 'localhost' ||
    // [::1] is the IPv6 localhost address.
    window.location.hostname === '[::1]' ||
    // 127.0.0.0/8 are considered localhost for IPv4.
    window.location.hostname.match(
      /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);

export function register(config) {
  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
    // The URL constructor is available in all browsers that support SW.
    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
    if (publicUrl.origin !== window.location.origin) {
      // Our service worker won't work if PUBLIC_URL is on a different origin
      // from what our page is served on. This might happen if a CDN is used to
      // serve assets; see https://github.com/facebook/create-react-app/issues/2374
      return;
    }

    window.addEventListener('load', () => {
      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;

      if (isLocalhost) {
        // This is running on localhost. Let's check if a service worker still exists or not.
        checkValidServiceWorker(swUrl, config);

        // Add some additional logging to localhost, pointing developers to the
        // service worker/PWA documentation.
        navigator.serviceWorker.ready.then(() => {
          console.log(
            'This web app is being served cache-first by a service ' +
              'worker. To learn more, visit https://bit.ly/CRA-PWA'
          );
        });
      } else {
        // Is not localhost. Just register service worker
        registerValidSW(swUrl, config);
      }
    });
  }
}

function registerValidSW(swUrl, config) {
  navigator.serviceWorker
    .register(swUrl)
    .then(registration => {
      registration.onupdatefound = () => {
        const installingWorker = registration.installing;
        if (installingWorker == null) {
          return;
        }
        installingWorker.onstatechange = () => {
          if (installingWorker.state === 'installed') {
            if (navigator.serviceWorker.controller) {
              // At this point, the updated precached content has been fetched,
              // but the previous service worker will still serve the older
              // content until all client tabs are closed.
              console.log(
                'New content is available and will be used when all ' +
                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
              );

              // Execute callback
              if (config && config.onUpdate) {
                config.onUpdate(registration);
              }
            } else {
              // At this point, everything has been precached.
              // It's the perfect time to display a
              // "Content is cached for offline use." message.
              console.log('Content is cached for offline use.');

              // Execute callback
              if (config && config.onSuccess) {
                config.onSuccess(registration);
              }
            }
          }
        };
      };
    })
    .catch(error => {
      console.error('Error during service worker registration:', error);
    });
}

function checkValidServiceWorker(swUrl, config) {
  // Check if the service worker can be found. If it can't reload the page.
  fetch(swUrl, {
    headers: { 'Service-Worker': 'script' },
  })
    .then(response => {
      // Ensure service worker exists, and that we really are getting a JS file.
      const contentType = response.headers.get('content-type');
      if (
        response.status === 404 ||
        (contentType != null && contentType.indexOf('javascript') === -1)
      ) {
        // No service worker found. Probably a different app. Reload the page.
        navigator.serviceWorker.ready.then(registration => {
          registration.unregister().then(() => {
            window.location.reload();
          });
        });
      } else {
        // Service worker found. Proceed as normal.
        registerValidSW(swUrl, config);
      }
    })
    .catch(() => {
      console.log(
        'No internet connection found. App is running in offline mode.'
      );
    });
}

export function unregister() {
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.ready
      .then(registration => {
        registration.unregister();
      })
      .catch(error => {
        console.error(error.message);
      });
  }
}

src/client/src/index.js METASEP
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { ThemeProvider } from '@material-ui/core/styles';
import * as serviceWorker from './serviceWorker';
import "./assets/font/font.css";
import defaultTheme from './theme/defaultTheme';


ReactDOM.render(
  <React.StrictMode>
    <ThemeProvider theme={defaultTheme}>
      <App/>
    </ThemeProvider>
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

src/client/src/App.test.js METASEP
import React from 'react';
import { render } from '@testing-library/react';
import App from './App';

test('renders learn react link', () => {
  const { getByText } = render(<App />);
  const linkElement = getByText(/learn react/i);
  expect(linkElement).toBeInTheDocument();
});

src/client/src/App.js METASEP
import React from 'react';

import {BrowserRouter as Router, Switch, Route, Redirect} from 'react-router-dom';

import Header from "./components/Header";

import Login from './pages/Login/Login';
import Logout from './pages/Login/Logout';
import HomePage from './pages/Home';
import Admin from './pages/Admin';
import {Search360} from './pages/DataView360/Search/Search';
import View360 from './pages/DataView360/View/View360';
import About from './pages/About';
import RefreshDlg from './components/RefreshDlg';
import Check from './pages/Check/Check';
import Refresh from './components/Refresh';

import useToken from './pages/Login/useToken';
import Box from "@material-ui/core/Box";
import {RFM} from "./pages/RFM/RFM";

let jwt = require('jsonwebtoken');

const REFRESH_POPUP_TIME = 300 // seconds

// Triggers token expiration check
const sleep = time => new Promise(resolve => setTimeout(resolve, time))
let expTimer = () => sleep(500).then(() => ({}));

const AuthContext = React.createContext();

function AuthProvider({children}) {
    const [state, setState] = React.useState({
        status: 'pending',
        error: null,
        user: null,
    })

    React.useEffect(() => {
        expTimer().then(
            user => setState({status: 'success', error: null, user})
        )
        expTimer = () => sleep(100000).then(() => ({}));
    },)

    return (
        <AuthContext.Provider value={state}>
            {state.status === 'pending' ? (
                'App ACP: Loading...'
            ) : state.status === 'error' ? (
                <div>
                    Oh no
                    <div>
                        <pre>{state.error.message}</pre>
                    </div>
                </div>
            ) : (
                children
            )}
        </AuthContext.Provider>
    )
}

function useAuthState() {
    const state = React.useContext(AuthContext)
    const isPending = state.status === 'pending'
    const isError = state.status === 'error'
    const isSuccess = state.status === 'success'
    const isAuthenticated = state.user && isSuccess
    return {
        ...state,
        isPending,
        isError,
        isSuccess,
        isAuthenticated,
    }
}


function AuthenticatedApp() {
    const {access_token, setToken} = useToken();

    let decoded = jwt.decode(access_token, {complete: true});

    const userRole = decoded?.payload.role;
    let expTime = decoded?.payload.exp - Date.now() / 1000;
    const jwtExpired = !expTime || expTime <= 0

    const popRefreshAlert = expTime > 0 && expTime < REFRESH_POPUP_TIME;  // Time in secs to pop up refresh dialog

    const headerType = userRole === 'admin' ? 'Admin' : 'Normal';

    return (
        <Router>

            <Box pb={4}>
                {!jwtExpired ? <Header headerType={headerType}/> : <Header headerType={'Login'}/>}
            </Box>
            {popRefreshAlert &&
            <RefreshDlg shouldOpen={true} setToken={setToken}/>} {/* Pop up the refresh dialog */}

            {jwtExpired &&
            <RefreshDlg shouldOpen={false} setToken={setToken}/>} { /* Too late, expired: close the dialog */}


            {  /* If not logged in, show login screen */
                (!access_token | jwtExpired) ?
                    <Switch>
                        <Route path="/about">
                            <About/>
                        </Route>
                        <Route>
                            <Login setToken={setToken}/>
                        </Route>
                    </Switch>

                    : <Switch>
                        <Route exact path="/login">
                            <Redirect to="/"/>
                        </Route>
                        <Route exact path="/">
                            <HomePage access_token={access_token}/>
                        </Route>
                        <Route path="/about">
                            <About/>
                        </Route>

                        {  /* If an admin, render Upload page       */
                            userRole === 'admin' &&
                            <Route path="/admin">
                                <Admin access_token={access_token}/>
                            </Route>
                        }


                        <Route path="/360view/search">
                            <Search360 access_token={access_token}/>
                        </Route>

                        <Route path="/360view/view">
                            <View360 access_token={access_token}/>
                        </Route>

                         <Route path="/rfm">
                            <RFM access_token={access_token}/>
                        </Route>

                        <Route path="/check">
                            <Check access_token={access_token}/>
                        </Route>

                        <Route path="/logout">
                            <Logout setToken={setToken}/>
                        </Route>

                        <Route path="/ref">
                            <Refresh/>
                        </Route>

                    </Switch>
            }

        </Router>
    )
}


function Home() {
    const {user} = useAuthState()
    /*eslint no-unused-vars: ["warn", { "varsIgnorePattern": "access_token" }]*/
    const {access_token, setToken} = useToken();
    return user ? <AuthenticatedApp/> : <Login setToken={setToken}/>
}

function App() {
    return (
        <AuthProvider>
            <Home/>
        </AuthProvider>
    )
}

export default App;

src/client/public/robots.txt METASEP
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

src/client/public/index.html METASEP
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="./public/images/paws-logo-64.png"/>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@700&display=swap" rel="stylesheet">
    <meta name="theme-color" content="#000000" />
    <meta
      name="PAWS Data Pipeline"
      content="Web site for PAWS Data Lake and 360 View"
    />
    <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `assets` folder during the build.
      Only files inside the `assets` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root assets URL.
      Learn how to configure a non-root assets URL by running `npm run build`.
    -->
    <title>PAWS Best Friend</title>
  </head>
  <body style="margin: 0; background-color: rgba(0, 0, 0, 0.015);">
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled pipeline into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
</html>

documentation/matching_rules.md METASEP
The logic for looking at duplicates from Karla/Meg discussion:

1. Create Master from Salesforce
2. Compare Volgistics to Master: If [fuzzy match on name above threshold] and [match on email] → combine records in Master
3. Compare Master to PetPoint: If [fuzzy match on name above threshold] and [match on email] → combine records in Master
4. Compare Master to ClinicHQ: If [fuzzy match on name above threshold] and [match on phone number] → combine records in Master

Trigger staff review: If [fuzzy match on name above threshold] and [no other matching data] → report for human review

Thresholds are TBD but should be some level where we can be reasonably certain the fuzzy match is correct most of the time.
Decided to trust name and email most. Addresses will likely create more problems with fuzzy matching, allowing people in the same household (but not the same person) to potentially be matched. Email is likely to be unique per person, though the same person *may* use multiple emails. 

documentation/SALESFORCE.md METASEP
# Getting into Chris's Salesforce Trailhead Sandbox

Two years ago I mocked up a bunch of stuff in a Salesforce training (Trailhead) instance.   They lasted 30 days back then.  So it's gone. My purpose was to see how non-SFDC data from other PAWS systems can be imported and associated with constituents (Salesforce Contacts) in SFDC.   Call it a Proof-of-Concept.  

I started another sandbox up a few months ago, and reloaded some of the data I used back then.  I also re-applied a number of customizations / configurations (although I did not take very good notes back then!).   

This gets you into that sandbox.   

The Non-Profit Success Pack (NPSP) is a set of Salesforce customizations intended to better serve Non-Profits.  
Installation of that seems to be 50/50 in this sandbox (which is all done in an automated fashion by SFDC automation), but it serves the purpose until we revive the Saleforce thread of this project and spend quality time with Weston getting a correct standbox in place.

The rest of this is showing the results of my proof-of-concept this time around.  I have some screenshots here to help you get in and look around.  Follow along.   I don't think you can mess anything up but please try not to anyway.

Go to www.salesforce.com
sign in as chris@brave-fox-riktj8.com    Password is code1234

You will come to a screen like this:  

![Pic1](https://github.com/CodeForPhilly/paws-data-pipeline/blob/cck-doc/documentation/documentation-images/SF-pic-1)

Click on that rubics cube looking thing to bring up the app chooser

![Pic2](https://github.com/CodeForPhilly/paws-data-pipeline/blob/cck-doc/documentation/documentation-images/SF-Pic2)

Then pick View All   (click where circled)

![Pic3](https://github.com/CodeForPhilly/paws-data-pipeline/blob/cck-doc/documentation/documentation-images/SF-Pic3)

Scroll Down (by scrolling up if you use a mac)

![Pic4](https://github.com/CodeForPhilly/paws-data-pipeline/blob/cck-doc/documentation/documentation-images/SF-Pic4)

Pick the Non Profit Success Pack NPSP - the one in the middle (it's the one with the Lightning Experience.. .cooler)

![Pic5](https://github.com/CodeForPhilly/paws-data-pipeline/blob/cck-doc/documentation/documentation-images/SF-Pic5)

This is a two part step.   First click on the Contacts tab at the top.   That should bring up recently used Contacts.  If not, click around to bring up recent contacts.  It should be an option under the Contacts tab if you hover or click for the pull-down menu.

Then click on our buddy Aaron.   Fake name and address

![Pic6](https://github.com/CodeForPhilly/paws-data-pipeline/blob/cck-doc/documentation/documentation-images/SF-Pic6)

This is Aaron's contact record.  Note two two "Related" pieces of information.   Volunteer info especially.  

In PAWS' real Salesforce instance, you'd see a ton of valuable info, including donation history, addresses, family relationships, etc.  

![Pic7](https://github.com/CodeForPhilly/paws-data-pipeline/blob/cck-doc/documentation/documentation-images/SF-Pic7)

If you hover over Volunteer Hours, it will pop up a list (it's a subset) of the shifts he's worked.   These are Volunteer Shift instances which I pulled from REAL Volgistics data (but just associated it with "Aaron").    There is some background work to do be done to set up the shift types.   But it can be done once and in the very rare instances where a new shift shows up we can have a maintenance step to load the new Volunteer Shifts (and if needed Volunteer Campaigns). 

![Pic8](https://github.com/CodeForPhilly/paws-data-pipeline/blob/cck-doc/documentation/documentation-images/SF-Pic8)

If you go back and scroll around the Contact record, you'll see all sorts of good info.  Donation History (which I haven't loaded any of), and the Volunteer info is at the bottom.   This is a POC to show what it might look like for PAWS to see not only donation info but also Volunteer activity.   And we can add Animals to this as well.  Weston has a mock-up of that done, although he doesn't have the Volunteer hours.   We can pull this together over time to get a real solid POC.   

I loaded all data via file import wizard available in Salesforce.  API in and out of this Saleforce instance also works.  It's a full developer edition.  I set up the key etc and proved connection via Python.  That code is in the SFDC-Playground folder

There's also a bit of Saleforce screen and form modification I did to pull the Volunteer info in.   Most of it happened automatically when I did it two years ago.  Not sure of the differences. 

documentation/PDP_UserFlow.png METASEP

documentation/PAWS_Digital_Ecosystem_v3_for_C4P.jpg METASEP

documentation/NARRATIVE.md METASEP
# PAWS Data Pipeline Narrative (updated 4/20/20)

## Overall Description

PAWS uses multiple software (cloud-based) systems to support its various operating needs.  Information on PAWS constituents is spread across these **Operational Systems** with varying levels of consistency (/inconsistency) in how they are represented.

This is supposed to be a diagram, but I am not sure how to get it to work
![alt text](https://github.com/CodeForPhilly/paws-data-pipeline.git/documentation/PAWS_Digital_Ecosystem_v3_for_C4P.jpg "Diagram")

Two objectives are:

1.  A 360-degree view of constituents is important for PAWS to be able
to (1) fully understand the depth and breadth of constituent engagement;(2) accurately acknowledge the various aspects of support provided by individuals; and (3) encourage, invite and inspire further engagement across PAWS' various programs and opportunities to extend involvement in and support for PAWS mission.

2.  PAWS is increasingly interested in using data to better understand,
measure, and tune their operating processes.  Each study requires harversting and wrangling data from one or more sources before any analyis can be done.  Having data from each system regularly extracted and prepped (cleaned, matched, etc) for analysis would speed such projects as they arise and directly support repeated analyses over time.  

## Systems View - Summary

PAWS uses multiple **Operational Systems** to support its various operating needs.

    Salesforce - Fund raising
    Volgistics - Volunteer management 
    Petpoint - Animal management
    ClinicHQ - medical records for clinic patients (animals)
    iContact - email marketing
    Trello - workflow management
    (there are more... just not pertinent to our initial work)
    
Information on PAWS constituents is spread across these various systems. Often the same constituent shows up in multiple systems with no guarantee as to how consistently they are represented (i.e. name, address, email, etc could be different, misspelled, or of different vintage - pre/post marriage, house move, etc).   Sometimes a constituent shows up on only one system.   All constituents are important.

Each of these **Operational Systems** is ideally suited to what it does. There is not a single system that can meet all various operating needs. Thus we are in a **multi-system** situation. 

## Envisioned Repositories
1. Salesforce's built-for purpose is as a constituent management system.  PAWS should use it in this way. Namely, all aspects of a constituent's relationship with PAWS should be **visible** in Salesforce tothe extent that such information helps to comprehend the 360-degree relationship (while **not** strictly duplicating **all** information in the various other Operational Systems).

2. It seems like a "Data Lake" would be valuable to hold detail information from all Operational Systems in a way that makes it readily available for ongoing analysis.   This would be used by data scientists to develop analyses and perhaps by PAWS staff running pre-developed scripts to update existing analyses.  This would not be an end-user reference system.   End-user access is via the Operational Systems, with Salesforce focused on constituent information. 
  
## Use Cases
### Use Case:  Data Loading
- PAWS Staff (or authorized volunteer) would export current-period transaction data from given **Operational Systems**.  (see note 1)
- PAWS Staff would upload exported data for further processing into the PAWS Data Pipeline.  (see note 1)
- A routine would be triggered to in-process the new datasets, flagging any exceptions and providing a way for interaction to clear conflicts / exceptions (see note 2)
- A routine would be triggered to load data to target systems.  This step is dependent upon clearing of conflicts from prior step.

Note 1:  for systems without API trigger capability, this could be automated through UI automation tools.    That's a TBD for later.  For systems with API capabilites, this could be scheduled without user involvement provided timeframe selection can be programmed.  When automated, uploading is similarly automatable.

Note 2:  presence of new files could be detected and routines automatically run.  Also, routines could be cron run at given times.

### Use Case: PAWS Staff Member Examines a Constituent
- PAWS could pull up a constituent in Salesforce and see thier contact information, their donation activity, their volunteer activity, their adoption and fostering activity, and their clinic visit activity - all at an appropriate level of detail.  
- From this single review of their **Contact** record in Salesforce, the user can assess the relationship.   
- They can go deeper in Salesforce for Donation Info and can look at other Operational systems for extended detail.  
- Where possible, hyperlinking to other Operational systems should be included in Salesforce to ease finding more details information.

### Use Case:  PAWS Identifies Constituents for Campaigns or Outreach
- PAWS staff person uses criteria to extract (or flag) constituents in Salesforce meeting certain criteria (e.g. volunteers that have not donated, new adopters in last 12 months, clinic visits in last six months, etc) with the intent to engage them further (solicit donation, inquire about interest in volunteering, etc).
- PAWS staff person takes this information and loads up an email marketing or mail-merges a U.S. Mail mailing.  

### Use Case: Data Scientist
- The data scientist and PAWS engage on the analysis needed
- The data scientist inspects the Data Lake for relevant data for the study at hand based upon source Operational
systems and analysis required
- If the data is not present, a project is initiated to identify, gather, and include such data in
the Data Lake
- If data is present, the Data Scientist uses Python, R, or other tools of choice to extract data and perform analysis

## Requirements for a Minimum Viable Product (MVP) 

The MVP is what will be presented to PAWS. Along the way to functional releases of production solution components, development will be through a series of requirements leading to Proof Points of functionality.  In this way we can iteratively build toward the solution without requiring all surrounding pieces (including to-be-developed pieces!) to be in place during the development cycle.


### Requirement 1 (R1):  Loading Files In/Out of Code-for-Philly (C4P) Infrastructure [NEARLY DONE]

The desired output is a **web interface** that allows PAWS Staff to 

1. Upload, download, and view a list of *unprocessed* data files in csv format; the following data sources are within scope: 
  a) Donor contact info (Salesforce)
  b) Volunteer contact info (Volgistics)
  b) Adopter contact info (PetPoint)
2. Download a variable set of *processed* datafiles (without doing the actual processing). 

### Requirement 2 (R2):  Creating a persistent database

The desired output is a **database** that 

1. Stores raw data from files uploaded in R1
2. Stores processed data to be used in subsequent requirements in the following tables
    2.1 Processed tables for all files in R1
    2.2 A Master Table to be used in R3, with PAWS Data Pipeline (PDP) identifiers and tags to quickly identify entries as ambiguous or unambiguous
    2.3 A Master Log (?) for all PAWS Staff resolution actions
3. Survives container restart

TODO:

- Create schema for Data Lake tables - one per data source (perhaps more)

### Requirement 3 (R3):  Data Lake Imports into Staging Tables

The desired output is a **script** that 

1. From uploaded datasets, identifies the data source and information being loaded
2. Processes raw data into standardized formats to be stored in R2, 2.1 
3. Makes decisions about how to handle iterative data loads
4. Load into data lake area for that data source (i.e. Volgistics, Petpoint, ...) 

### Requirement 4 (R4):  Identifying & Updating Contacts in Database [IN EARLY STAGES]

The desired output is a **script** that 

1. Identifies which individuals are the same across processed data sets from R3
2. Creates and updates entries in the Master Table following a set of business rules, including
2.1 For ambiguous contacts (uncertain if known or unknown), attach to Master Table entry a list of possible matches and/or matching issue

### Requirement 5 (R5):  Create a web interface to review and resolve ambiguous records

The desired output is **a web interface** that will allow PAWS staff to 

1. Review ambiguous records on-line
2. Record a resolution ("Accept PDP suggested match" OR "Provide Salesforce ID for true match") and log all activity
3. Review log of activity

- As contacts are matched (and resolved), create staging table in database of enriched records ready for further processing --> KF note: what is this staging table used for?

### Requirement 6 (R6): Create a web interface to examine data

The desired output is **a web interface** that will allow PAWS staff to 

1. Examine data stored in the Data Lake
2. Perform simple canned queries

### Requirement 7 (R7):  Create a web interface to view 360-degree view of a person

The desired output is **a web interface** that will allow PAWS staff to 

1. Run a set of pre-defined simple queries that combine data from sources into a constituent view (all records associated with a given contact)
2. View 360-degree view based upon data collected so far for a given person

### Test 1 (T1):  Run Iterative Data Loads (Simulate Real Use)

- Export data from PAWS systems at a lag of a few days
- For each export, run through Requirements R1-6 as they are envisioned to be run in production use.  Evaluate user experience, process integrity, results.  
- Cycle back on any issues and work to resolution.    

### Test 2 (T2):  Simulate Connected Data

- Develop set of test scenarios for 360-degree view
- Evaluate R7 based on these test scenarios

### MVP:  Salesforce Prototyping
- To be defined. When we've done the steps above we will know how our data relates and that we have a good constituent view. The final MVP will either require one additional step for sending these reports back to Salesforce, or it may be ready to be demo-ed to PAWS via the web interfaces created in the process. 

## Operational System Details

Each of the Operational Systems in use at PAWS is a source for data regarding constituents.   Each is explored below

### Salesforce
Salesforce receives donation information from **Classy**, PAWS' online donation platform.  An API connects Classy & Salesforce.  When new donations flow into Salesforce, it tries to match to existing Contacts using match logic in Classy and Salesforce.  If a match is found it associates the new donation with the existing Contact.   If a match is not found, it triggers creation of a new Contact and a corresponding Household (Organization object, repurposed and renamed to Household in the Salesforce Non-Profit Success Pack).

Donations can also be manually entered into Salesforce.  In this case, staff enters donation information accordingly, creating Contact and Household records if necessary to create the donor to associate the donation with.

The Development (i.e. Fund Raising) team w/in PAWS also utilizes **Call** and other objects w/in Salesforce to track their interactions with constituents (i.e. Contacts in Salesforce).  

Salesforce also receives (via API) notification from **iContact** when marketing / solicitation emails are sent and when contacts open them.    This is similarly matched/added by contact.   

All of the above information is stored as objects in Salesforce and are viewable via the Contact and Household objects.    E-Mail campaign information is also viewable via Campaigns w/in Salesforce.  

Presence of Donation information associated with a given contact indicates that the constituent is a donor to PAWS. 

Salesforce is mostly a target system for this project, wherein we are seeking to associate information from other Operational Systems to the consituents already in Salesforce and to add contacts and associated information from source systems where they do not already exist in Salesforce.     

Salesforce is a source system for known consituents (Contacts) into the *Matching Process*, to be discussed later in this document. 

Salesforce provides for file export and import as well as rich API-driven data import/export and process triggers.    
   
### Volgistics
All activities requiring volunteer staffing are set up in Volgistics by PAWS Volunteer Coordinator (a staff position).  

Volunteers are set up in Volgistics once they complete a volunteer orientation session.  Their ID is the email address they supply.   They are sent a link and must set up a password as part of their initial sign-in.  

Via the Volgistics website Volunteers can view open shifts in skill areas they have been oriented on and sign up as they wish.  Work shifts exist across all three PAWS locations, remote work (administrative activities), and hundreds of events held across Philadelphia and surrounding area.  

Volunteers log shifts and hours worked by either signing in on a tablet (running a Volgistics "app") at one of the three PAWS sites or by manually entering shifts worked via the Volgistics website.   

Volgistics does not have API capabilities.   

Volgistics does offer csv-based export triggered via it's web-based adminsitrative user interface.  For shifts worked, the file export is two files:  One file lists the volunteer identifying information (name, email address, etc, along with an ID number); the other file lists each shift worked with each shift record referencing the volunteer's ID number.  

Volgistics is a source system for this project.  By exporting volunteer shifts worked data it is possible to add these to Salesforce, matching to existing Contacts or adding Contacts (and associated Household) as required.  By doing this, a summary (and some detail) of Volunteer Shifts and Hours Worked is visible on constituent Contact recrods.   At a high level, presence of Volunteer Hours worked indicates that the constituent has been (and/or is currently) a PAWS Volunteer.  

It's envisoned that a PAWS staff member or a designated Volunteer would export new shifts-worked data from Volgistics for loading into the PAWS Data Pipeline, with these records ending up in the Data Lake in a format for analysis over time and into Salesforce as Volunteer Shifts worked associated with appropriately-matched Contacts via the *Matching Process*.    The file export may be scriptable via UI automation (simulating screen interactions) as a future innovation.   In any case, a location to upload the CSV files to is required, as is a way to trigger an import process.  

### Petpoint
Petpoint is used to track animals.   It is used by Philadelphia ACCT, the open-intake animal shelter and thus is also used by animal rescue organizations in the area since, through use of this common system, all demographic and health record information follows the animal through it's rescue-foster-adoption cycle.   An animal transfer between participating organizations is reflected via simple reassignment in Petpoint without the need for cross-system data transcription.  

Petpoint is used by animal welfare staff in all organizations that an animal passes through.   At PAWS, it is used by kennel, medical, foster, and adoption staffs for inquiry and logging of new information during the animal's time with PAWS. 

Animals in Petpoint have a unique "A" number (animal numbers start with an "A" followed by a string of numbers).  

Petpoint data must be better understood as part of this project.  Current thinking is below.

**The intent** is to use Petpoint data to show fostering and adopting history as part of a constituent's Contact record in Salesforce.   

Contact processing is fairly straightforward.  Extracting foster-parenting and adopting contact information from Petpoint, taking it through the *Matching Process*, and loading it into Salesforce would ensure that we have awareness of every fostering or adoptive person.   

Animals processing and associating them appropriately with contacts is more complex.  Animals can move between people.  A given animal can be fostered sequentially by multiple different people, an animal can be adopted, an adopted animal can be returned, and then that same animal can be fostered and/or adopted again.   Thus, merely listing the animal on a contact record won't show accurate information.   It is not a 1:1 person:animal relationship.

Updated Solution April 2020:
 - Animal adoption and fostering instances would be identified from Petpoint.  
 - Each adoption/fostering instance would be associated with the corresponding human contact from PAWS Data Pipeline master table (and thus linking to contact instances in Salesforce and other repositories)
 - A set of fields will be set up on the Salesforce Contact object for instances of adoptions/fosters
 - Adoption/Foster instances will be added to the appropriate contacts in Salesforce, listing the date of placement.

Notes on this approach:
 - a given animal can be associated with different people across time.  This is fine.
 - this solution shows animal placement events.  It does not show animal lifecycle nor does it assert currency of relationship between animal and contact.  It only asserts that an adoption/fostering placement occurred between animal and contact. 
 - this information is useful to show adoption/fostering HISTORY for contacts.   This is useful to profile the contact's relationship with PAWS.   

Elegant Solution (Future):
 - an "Animal" custom object would be configured within Salesforce.   
 - An extract from Petpoint would be processed to identify animals as a list of "A" numbers and cursory demographics on each animal (such as A12345 is Brutus and he's a Pit Mix dog). 
 - Animal data would be loaded into Salesforce.   
 - The extract from Petpoint would also be processed to identify who currently has the animal.   
 - That contact would be run through the *Matching Process* and when the corresponding Salesforce contact is identified (or a new one added if no match) a link record would be created to connect the animal and contact at this point in time with datetime stamping start-of-connection and eventual end of connection (for fosters or adoption returns).  
 - By viewing a contact in Salesforce you would see each animal that this contact has had a relationship with - both fostering and adopting.  This is valuable information to further understand how a constituent interacts with PAWS. 
 
 ### ClinicHQ
 ClinicHQ is used by PAWS low-cost clinic to track visits to the clinic and vet doctor notes. 
 
 Very little work has been done with ClinicHQ data.   
 
 It is envisioned that occurrences of clinic visits (not details, but logging that someone visited the clinic) could be pulled from ClinicHQ exports and loaded into Salesforce to further elaborate the relational contacts with that constituent.   
 
 More work must be done here.
 
 ### Trello
 Trello is used to manage many workflows at PAWS.   It's very easy to use and has been embraced by the adoption and fostering application vetting and animal/person matching process.  
 
 Unfortunately data in this system lacks precision when it comes to names, spellings, email addresses, etc.    Also, extracting the data and processing through the JSON output is complex.  
 
 This data has been used to analyze time-to-place animals including time-to-complete each step and overall touches.   It would be useful to format this data for easier ongoing analysis in the Data Lake.   There **does not** appear to be data here that would have utility as part of the Salesforce contact record.  

## The Matching Process

The Code for Philly PAWS team has spent considerable time on how best to match contacts across the various systems.    

Constituents each may be known differently in the various **Operational Systems** at PAWS.  Instead of insisting that PAWS refer to people consistently across all systems, we feel the more practical approach is to create a *Matching Table* that will contain the known identities of each constituent in every PAWS systems they appear in (Salesforce, Volgistics, Petpoint, ClinicHQ).  It would also contain a unique PAWS Data Pipeline identifier (number) for each constituent.

A matching routine can be run on contacts appearing on transactional records (donations, volunteer shifts, fostering, adopting, ...) from PAWS' **Operational Systems** as those records come into the PAWS Data Pipeline, identify whether the contact is clearly known already, clearly new, or that further inspection is needed to determine known or new.   

Contacts without matching certainty will require human review.   The best people to help resolve these is PAWS staff.  **Therefore, some report or online screen-based display of these must be made available.**  It will be important to show the underlying data and any possible matches that our process is contemplating.  For instance, if the contact's source is a donation the donation detail should be readily reviewable.   Likewise if it's a volunteer shift then the shift detail would help understand who it really is.  
 
The *Matching Table* would be maintained and curated over time.  Contacts may change (marry, divorce, move, change emails, etc) over time.   Continuity is required in these cases.  

## Downstream Processing

As discussed prior, transactional data coming into the PAWS Data Pipeline will be used for two purposes:  (a) creating a 360-degree constituent view in Salesforce and (b) populating a Data Lake for ongoing analytical work.   

Disambiguating the contact associated with each record being processed is common to both, and should be performed first (including any manual resolution that is needed).    In this way, the Salesforce contact form can be added to the records that are destined for Saleforce upload and the PAWS Data Pipeline identifier can be added for inclusion in the Data Lake.   Quite possibly more information from the Matching Table may be useful for Data Lake inclusion.  

### Salesforce 360-Degree View
A processing routine will be needed for each type of transactional record (donation, volunteer shift, adoption/foster, etc).   Data would originate through the outloads from source systems, go through the **Matching Process** and then be loaded appropriately into and linked within Salesforce.  

### Data Lake
A processing routine will be needed for each type of transactional record heading into the Data Lake.   This is where more complex records (Trello, if we get to it!) will be decoded and stored in a way that facilitates analysis (i.e. run through the JSON once, now, to ease analysis later).  







documentation/Hack Night PAWS Presentation PDF.pdf METASEP

documentation/Data Lake Conceptual Flows v2.pptx METASEP

documentation/Data Lake Conceptual Flows v2.jpg METASEP

src/scheduler/cronfile METASEP
#run python script every minutes
#* * * * * echo "hello cron" >> /proc/1/fd/1 2> /proc/1/fd/2 #testing
0 1 * * 6 curl http://paws-compose-server:5000/api/ingestRawData
# Don't remove the empty line at the end of this file. It is required to run the cron job


src/scheduler/Dockerfile METASEP
FROM alpine:3.6

# copy crontabs for root user
COPY cronfile /etc/crontabs/root
RUN apk --no-cache add curl

# start crond with log level 8 in foreground, output to stderr
CMD ["crond", "-f", "-d", "8"]
src/k8s_conf/kind_w_reg.sh METASEP
#!/bin/sh
#
# Adapted from:
# https://github.com/kubernetes-sigs/kind/commits/master/site/static/examples/kind-with-registry.sh
#
# Copyright 2020 The Kubernetes Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -o errexit

# desired cluster name; default is "kind"
KIND_CLUSTER_NAME="${KIND_CLUSTER_NAME:-kind}"

kind_version=$(kind version)
kind_network='kind'
reg_name='kind-registry'
reg_port='5000'
case "${kind_version}" in
  "kind v0.7."* | "kind v0.6."* | "kind v0.5."*)
    kind_network='bridge'
    ;;
esac

# create registry container unless it already exists
running="$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)"
if [ "${running}" != 'true' ]; then
  docker run \
    -d --restart=always -p "${reg_port}:5000" --name "${reg_name}" \
    registry:2
fi

reg_host="${reg_name}"
if [ "${kind_network}" = "bridge" ]; then
    reg_host="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' "${reg_name}")"
fi
echo "Registry Host: ${reg_host}"

# create a cluster with the local registry enabled in containerd
cat <<EOF | kind create cluster --name "${KIND_CLUSTER_NAME}" --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:${reg_port}"]
    endpoint = ["http://${reg_host}:5000"]
EOF

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-registry-hosting
  namespace: kube-public
data:
  localRegistryHosting.v1: |
    host: "localhost:${reg_port}"
    help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF

if [ "${kind_network}" != "bridge" ]; then
  containers=$(docker network inspect ${kind_network} -f "{{range .Containers}}{{.Name}} {{end}}")
  needs_connect="true"
  for c in $containers; do
    if [ "$c" = "${reg_name}" ]; then
      needs_connect="false"
    fi
  done
  if [ "${needs_connect}" = "true" ]; then               
    docker network connect "${kind_network}" "${reg_name}" || true
  fi
fi

src/k8s_conf/front_end.yaml METASEP
apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: \temp\kompose -f docker-compose.yml convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: client
  name: client
spec:
  ports:
    - name: "80"
      port: 80
      targetPort: 80
  selector:
    io.kompose.service: client
status:
  loadBalancer: {}

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: \temp\kompose -f docker-compose.yml convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: client
  name: client
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: client
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: \temp\kompose -f docker-compose.yml convert
        kompose.version: 1.21.0 (992df58d8)
      creationTimestamp: null
      labels:
        io.kompose.service: client
    spec:
      containers:
        - env:
            - name: CHOKIDAR_USEPOLLING
              value: "true"
            - name: PAWS_API_HOST
              value: "server"
          image: localhost:5000/src-client:latest
          imagePullPolicy: "IfNotPresent"
          name: paws-compose-client
          ports:
            - containerPort: 3000
          resources: {}
          stdin: true
      restartPolicy: Always
      serviceAccountName: ""
      volumes: null
      imagePullSecrets:
        - name: regcred
status: {}

src/k8s_conf/db_server.yaml METASEP
apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: \temp\kompose -f docker-compose.yml convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: paws-compose-db
  name: paws-compose-db
spec:
  ports:
    - name: "5432"
      port: 5432
      targetPort: 5432
  selector:
    io.kompose.service: paws-compose-db
status:
  loadBalancer: {}

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-configuration
  labels:
    app: postgres
data:
  POSTGRES_DB: paws
  POSTGRES_USER: postgres
  
---

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: \temp\kompose -f docker-compose.yml convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: paws-compose-db
  name: paws-compose-db
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: paws-compose-db
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: \temp\kompose -f docker-compose.yml convert
        kompose.version: 1.21.0 (992df58d8)
      creationTimestamp: null
      labels:
        io.kompose.service: paws-compose-db
    spec:
      containers:
        - env:
            - name: POSTGRES_DB
              value: paws
          envFrom:
            - secretRef:
                name: db-pass-762dk6hmhm
          image: postgres:11-alpine     # localhost:5000/postgres:11.3-alpine
          imagePullPolicy: ""
          name: paws-compose-db
          ports:
            - containerPort: 5432
          resources: {}
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgres
      restartPolicy: Always
      serviceAccountName: ""
      volumes:
        - name: postgres
          persistentVolumeClaim:
            claimName: postgres
status: {}

src/k8s_conf/api_server.yaml METASEP
apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: \temp\kompose -f docker-compose.yml convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: server
  name: server
spec:
  ports:
    - name: "5000"
      port: 5000
      targetPort: 5000
  selector:
    io.kompose.service: server
status:
  loadBalancer: {}

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: \temp\kompose -f docker-compose.yml convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: server
  name: server
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: server
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: \temp\kompose -f docker-compose.yml convert
        kompose.version: 1.21.0 (992df58d8)
      creationTimestamp: null
      labels:
        io.kompose.service: server
    spec:
      initContainers:
        - name: wait-for-db
          image: groundnuty/k8s-wait-for:v1.3
          imagePullPolicy: Always
          args:
            - "service"
            - "paws-compose-db"      

      containers:
        - env:
            - name: FLASK_ENV
              value: development
          image: localhost:5000/src-server:latest
          imagePullPolicy: "IfNotPresent"
          name: server #paws-compose-server
          ports:
            - containerPort: 5000
          resources: {}
          volumeMounts:
            - mountPath: /app/static/raw_data
              name: src-archive
          envFrom:
            - secretRef:
                name: api-server-pws-7c66bb2cf7
            - secretRef:
                name: db-pass-762dk6hmhm
      restartPolicy: Always
      serviceAccountName: ""
      imagePullSecrets:
        - name: regcred
      volumes:
        - name: src-archive
          persistentVolumeClaim:
            claimName: src-archive
status: {}

src/k8s_conf/_pv_claims.yaml METASEP
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: src-archive
  name: src-archive
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: postgres
  name: postgres
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}

src/helm-chart/values.yaml METASEP
# Default values for helm-chart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

server:
  image:
    repository: ghcr.io/codeforphilly/paws-data-pipeline/server
    pullPolicy: Always
    # Overrides the image tag whose default is the chart appVersion.
    tag: "2.34"

client:
  image:
    repository: ghcr.io/codeforphilly/paws-data-pipeline/client
    pullPolicy: Always
    # Overrides the image tag whose default is the chart appVersion.
    tag: "2.34"

db:
  image:
    repository: postgres
    pullPolicy: IfNotPresent
    # Overrides the image tag whose default is the chart appVersion.
    tag: "13.2-alpine"


storage:
  pgdb: 1Gi
  server: 1Gi

imagePullSecrets: 
  - name: regcred
nameOverride: "paws-datapipeline"
fullnameOverride: "paws-dp-chart"

serviceAccount:
  # Specifies whether a service account should be created
  create: true
  # Annotations to add to the service account
  annotations: {}
  # The name of the service account to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000
hostAliases:
  - ip: "127.0.0.1"
    hostnames:
        - "server"
        - "paws-compose-db"
        - "client"

service:
  type: NodePort #ClusterIP
  port: 80

ingress:
  enabled: false
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: chart-example.local
      paths: []
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

src/helm-chart/Chart.yaml METASEP
apiVersion: v2
name: paws-datapipeline
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
appVersion: 0.8.0

src/helm-chart/.helmignore METASEP
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/

src/client/package.json METASEP
{
    "name": "client",
    "version": "0.1.0",
    "private": true,
    "dependencies": {
        "@material-ui/core": "^4.9.14",
        "@material-ui/icons": "^4.9.1",
        "@material-ui/lab": "^4.0.0-alpha.53",
        "@material-ui/styles": "^4.11.4",
        "@testing-library/jest-dom": "^4.2.4",
        "@testing-library/react": "^9.5.0",
        "@testing-library/user-event": "^7.2.1",
        "jsonwebtoken": "^8.5.1",
        "lodash": "^4.17.20",
        "moment": "^2.29.1",
        "react": "^16.13.1",
        "react-dom": "^16.13.1",
        "react-router-dom": "^5.2.0",
        "react-scripts": "3.4.1"
    },
    "scripts": {
        "start": "IS_LOCAL=false react-scripts start",
        "start:local": "IS_LOCAL=true react-scripts start",
        "start-api": "cd api && ../../venv/bin/flask run --no-debugger",
        "build": "react-scripts build",
        "test": "react-scripts test",
        "eject": "react-scripts eject"
    },
    "eslintConfig": {
        "extends": "react-app"
    },
    "browserslist": {
        "production": [
            ">0.2%",
            "not dead",
            "not op_mini all"
        ],
        "development": [
            "last 1 chrome version",
            "last 1 firefox version",
            "last 1 safari version"
        ]
    }
}

src/client/package-lock.json METASEP
{
    "name": "client",
    "version": "0.1.0",
    "lockfileVersion": 2,
    "requires": true,
    "packages": {
        "": {
            "name": "client",
            "version": "0.1.0",
            "dependencies": {
                "@material-ui/core": "^4.9.14",
                "@material-ui/icons": "^4.9.1",
                "@material-ui/lab": "^4.0.0-alpha.53",
                "@material-ui/styles": "^4.11.4",
                "@testing-library/jest-dom": "^4.2.4",
                "@testing-library/react": "^9.5.0",
                "@testing-library/user-event": "^7.2.1",
                "jsonwebtoken": "^8.5.1",
                "lodash": "^4.17.20",
                "moment": "^2.29.1",
                "react": "^16.13.1",
                "react-dom": "^16.13.1",
                "react-router-dom": "^5.2.0",
                "react-scripts": "3.4.1"
            }
        },
        "node_modules/@babel/code-frame": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
            "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
            "dependencies": {
                "@babel/highlight": "^7.10.4"
            }
        },
        "node_modules/@babel/compat-data": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz",
            "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==",
            "dependencies": {
                "browserslist": "^4.12.0",
                "invariant": "^2.2.4",
                "semver": "^5.5.0"
            }
        },
        "node_modules/@babel/compat-data/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/@babel/core": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
            "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
            "dependencies": {
                "@babel/code-frame": "^7.8.3",
                "@babel/generator": "^7.9.0",
                "@babel/helper-module-transforms": "^7.9.0",
                "@babel/helpers": "^7.9.0",
                "@babel/parser": "^7.9.0",
                "@babel/template": "^7.8.6",
                "@babel/traverse": "^7.9.0",
                "@babel/types": "^7.9.0",
                "convert-source-map": "^1.7.0",
                "debug": "^4.1.0",
                "gensync": "^1.0.0-beta.1",
                "json5": "^2.1.2",
                "lodash": "^4.17.13",
                "resolve": "^1.3.2",
                "semver": "^5.4.1",
                "source-map": "^0.5.0"
            },
            "engines": {
                "node": ">=6.9.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/babel"
            }
        },
        "node_modules/@babel/core/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/@babel/core/node_modules/source-map": {
            "version": "0.5.7",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
            "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/@babel/generator": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
            "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
            "dependencies": {
                "@babel/types": "^7.11.0",
                "jsesc": "^2.5.1",
                "source-map": "^0.5.0"
            }
        },
        "node_modules/@babel/generator/node_modules/source-map": {
            "version": "0.5.7",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
            "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/@babel/helper-annotate-as-pure": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
            "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
            "dependencies": {
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
            "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
            "dependencies": {
                "@babel/helper-explode-assignable-expression": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-builder-react-jsx": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz",
            "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==",
            "dependencies": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-builder-react-jsx-experimental": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz",
            "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==",
            "dependencies": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-module-imports": "^7.10.4",
                "@babel/types": "^7.10.5"
            }
        },
        "node_modules/@babel/helper-compilation-targets": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz",
            "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==",
            "dependencies": {
                "@babel/compat-data": "^7.10.4",
                "browserslist": "^4.12.0",
                "invariant": "^2.2.4",
                "levenary": "^1.1.1",
                "semver": "^5.5.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0"
            }
        },
        "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/@babel/helper-create-class-features-plugin": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
            "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
            "dependencies": {
                "@babel/helper-function-name": "^7.10.4",
                "@babel/helper-member-expression-to-functions": "^7.10.5",
                "@babel/helper-optimise-call-expression": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-replace-supers": "^7.10.4",
                "@babel/helper-split-export-declaration": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0"
            }
        },
        "node_modules/@babel/helper-create-regexp-features-plugin": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
            "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==",
            "dependencies": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-regex": "^7.10.4",
                "regexpu-core": "^4.7.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0"
            }
        },
        "node_modules/@babel/helper-define-map": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
            "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
            "dependencies": {
                "@babel/helper-function-name": "^7.10.4",
                "@babel/types": "^7.10.5",
                "lodash": "^4.17.19"
            }
        },
        "node_modules/@babel/helper-explode-assignable-expression": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz",
            "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==",
            "dependencies": {
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-function-name": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
            "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
            "dependencies": {
                "@babel/helper-get-function-arity": "^7.10.4",
                "@babel/template": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-get-function-arity": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
            "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
            "dependencies": {
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-hoist-variables": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
            "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
            "dependencies": {
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-member-expression-to-functions": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
            "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
            "dependencies": {
                "@babel/types": "^7.11.0"
            }
        },
        "node_modules/@babel/helper-module-imports": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
            "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
            "dependencies": {
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-module-transforms": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
            "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
            "dependencies": {
                "@babel/helper-module-imports": "^7.10.4",
                "@babel/helper-replace-supers": "^7.10.4",
                "@babel/helper-simple-access": "^7.10.4",
                "@babel/helper-split-export-declaration": "^7.11.0",
                "@babel/template": "^7.10.4",
                "@babel/types": "^7.11.0",
                "lodash": "^4.17.19"
            }
        },
        "node_modules/@babel/helper-optimise-call-expression": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
            "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
            "dependencies": {
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-plugin-utils": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
            "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
        },
        "node_modules/@babel/helper-regex": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
            "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
            "dependencies": {
                "lodash": "^4.17.19"
            }
        },
        "node_modules/@babel/helper-remap-async-to-generator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz",
            "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==",
            "dependencies": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-wrap-function": "^7.10.4",
                "@babel/template": "^7.10.4",
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-replace-supers": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
            "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
            "dependencies": {
                "@babel/helper-member-expression-to-functions": "^7.10.4",
                "@babel/helper-optimise-call-expression": "^7.10.4",
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-simple-access": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
            "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
            "dependencies": {
                "@babel/template": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz",
            "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==",
            "dependencies": {
                "@babel/types": "^7.11.0"
            }
        },
        "node_modules/@babel/helper-split-export-declaration": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
            "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
            "dependencies": {
                "@babel/types": "^7.11.0"
            }
        },
        "node_modules/@babel/helper-validator-identifier": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
            "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
        },
        "node_modules/@babel/helper-wrap-function": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
            "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
            "dependencies": {
                "@babel/helper-function-name": "^7.10.4",
                "@babel/template": "^7.10.4",
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/helpers": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
            "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
            "dependencies": {
                "@babel/template": "^7.10.4",
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/highlight": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
            "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
            "dependencies": {
                "@babel/helper-validator-identifier": "^7.10.4",
                "chalk": "^2.0.0",
                "js-tokens": "^4.0.0"
            }
        },
        "node_modules/@babel/parser": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz",
            "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw==",
            "bin": {
                "parser": "bin/babel-parser.js"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/@babel/plugin-proposal-async-generator-functions": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
            "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-remap-async-to-generator": "^7.10.4",
                "@babel/plugin-syntax-async-generators": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-class-properties": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
            "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
            "dependencies": {
                "@babel/helper-create-class-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-decorators": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz",
            "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==",
            "dependencies": {
                "@babel/helper-create-class-features-plugin": "^7.8.3",
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-syntax-decorators": "^7.8.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-dynamic-import": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
            "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-dynamic-import": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-export-namespace-from": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz",
            "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-json-strings": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
            "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-json-strings": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz",
            "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
            "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-numeric-separator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
            "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-numeric-separator": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-object-rest-spread": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
            "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
                "@babel/plugin-transform-parameters": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-optional-catch-binding": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz",
            "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-optional-chaining": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz",
            "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
                "@babel/plugin-syntax-optional-chaining": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-private-methods": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz",
            "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==",
            "dependencies": {
                "@babel/helper-create-class-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-proposal-unicode-property-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
            "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==",
            "dependencies": {
                "@babel/helper-create-regexp-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "engines": {
                "node": ">=4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-async-generators": {
            "version": "7.8.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
            "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-class-properties": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
            "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-decorators": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz",
            "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-dynamic-import": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
            "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-export-namespace-from": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
            "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-flow": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz",
            "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-json-strings": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
            "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-jsx": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz",
            "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
            "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
            "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-numeric-separator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
            "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-object-rest-spread": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
            "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-optional-catch-binding": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
            "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-optional-chaining": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
            "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-top-level-await": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz",
            "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-syntax-typescript": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz",
            "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-arrow-functions": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz",
            "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-async-to-generator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz",
            "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==",
            "dependencies": {
                "@babel/helper-module-imports": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-remap-async-to-generator": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-block-scoped-functions": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz",
            "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-block-scoping": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz",
            "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-classes": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz",
            "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==",
            "dependencies": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-define-map": "^7.10.4",
                "@babel/helper-function-name": "^7.10.4",
                "@babel/helper-optimise-call-expression": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-replace-supers": "^7.10.4",
                "@babel/helper-split-export-declaration": "^7.10.4",
                "globals": "^11.1.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-computed-properties": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz",
            "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-destructuring": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz",
            "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-dotall-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz",
            "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==",
            "dependencies": {
                "@babel/helper-create-regexp-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-duplicate-keys": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz",
            "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-exponentiation-operator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz",
            "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==",
            "dependencies": {
                "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-flow-strip-types": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz",
            "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-syntax-flow": "^7.8.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-for-of": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz",
            "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-function-name": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz",
            "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==",
            "dependencies": {
                "@babel/helper-function-name": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-literals": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz",
            "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-member-expression-literals": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
            "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-modules-amd": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
            "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
            "dependencies": {
                "@babel/helper-module-transforms": "^7.10.5",
                "@babel/helper-plugin-utils": "^7.10.4",
                "babel-plugin-dynamic-import-node": "^2.3.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-modules-commonjs": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
            "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
            "dependencies": {
                "@babel/helper-module-transforms": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-simple-access": "^7.10.4",
                "babel-plugin-dynamic-import-node": "^2.3.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-modules-systemjs": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz",
            "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==",
            "dependencies": {
                "@babel/helper-hoist-variables": "^7.10.4",
                "@babel/helper-module-transforms": "^7.10.5",
                "@babel/helper-plugin-utils": "^7.10.4",
                "babel-plugin-dynamic-import-node": "^2.3.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-modules-umd": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz",
            "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==",
            "dependencies": {
                "@babel/helper-module-transforms": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz",
            "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==",
            "dependencies": {
                "@babel/helper-create-regexp-features-plugin": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0"
            }
        },
        "node_modules/@babel/plugin-transform-new-target": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz",
            "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-object-super": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz",
            "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-replace-supers": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-parameters": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz",
            "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==",
            "dependencies": {
                "@babel/helper-get-function-arity": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-property-literals": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz",
            "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-react-constant-elements": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz",
            "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-react-display-name": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz",
            "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-react-jsx": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz",
            "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==",
            "dependencies": {
                "@babel/helper-builder-react-jsx": "^7.10.4",
                "@babel/helper-builder-react-jsx-experimental": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-jsx": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-react-jsx-development": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz",
            "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==",
            "dependencies": {
                "@babel/helper-builder-react-jsx-experimental": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-jsx": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-react-jsx-self": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz",
            "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-jsx": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-react-jsx-source": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz",
            "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-jsx": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-react-pure-annotations": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz",
            "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==",
            "dependencies": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-regenerator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz",
            "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==",
            "dependencies": {
                "regenerator-transform": "^0.14.2"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-reserved-words": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz",
            "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-runtime": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz",
            "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==",
            "dependencies": {
                "@babel/helper-module-imports": "^7.8.3",
                "@babel/helper-plugin-utils": "^7.8.3",
                "resolve": "^1.8.1",
                "semver": "^5.5.1"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/@babel/plugin-transform-shorthand-properties": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz",
            "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-spread": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz",
            "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-sticky-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz",
            "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-regex": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-template-literals": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz",
            "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==",
            "dependencies": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-typeof-symbol": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz",
            "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-typescript": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz",
            "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==",
            "dependencies": {
                "@babel/helper-create-class-features-plugin": "^7.10.5",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-typescript": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-unicode-escapes": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz",
            "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/plugin-transform-unicode-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
            "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==",
            "dependencies": {
                "@babel/helper-create-regexp-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/preset-env": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz",
            "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==",
            "dependencies": {
                "@babel/compat-data": "^7.11.0",
                "@babel/helper-compilation-targets": "^7.10.4",
                "@babel/helper-module-imports": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
                "@babel/plugin-proposal-class-properties": "^7.10.4",
                "@babel/plugin-proposal-dynamic-import": "^7.10.4",
                "@babel/plugin-proposal-export-namespace-from": "^7.10.4",
                "@babel/plugin-proposal-json-strings": "^7.10.4",
                "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0",
                "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
                "@babel/plugin-proposal-numeric-separator": "^7.10.4",
                "@babel/plugin-proposal-object-rest-spread": "^7.11.0",
                "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
                "@babel/plugin-proposal-optional-chaining": "^7.11.0",
                "@babel/plugin-proposal-private-methods": "^7.10.4",
                "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
                "@babel/plugin-syntax-async-generators": "^7.8.0",
                "@babel/plugin-syntax-class-properties": "^7.10.4",
                "@babel/plugin-syntax-dynamic-import": "^7.8.0",
                "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
                "@babel/plugin-syntax-json-strings": "^7.8.0",
                "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
                "@babel/plugin-syntax-numeric-separator": "^7.10.4",
                "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
                "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
                "@babel/plugin-syntax-optional-chaining": "^7.8.0",
                "@babel/plugin-syntax-top-level-await": "^7.10.4",
                "@babel/plugin-transform-arrow-functions": "^7.10.4",
                "@babel/plugin-transform-async-to-generator": "^7.10.4",
                "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
                "@babel/plugin-transform-block-scoping": "^7.10.4",
                "@babel/plugin-transform-classes": "^7.10.4",
                "@babel/plugin-transform-computed-properties": "^7.10.4",
                "@babel/plugin-transform-destructuring": "^7.10.4",
                "@babel/plugin-transform-dotall-regex": "^7.10.4",
                "@babel/plugin-transform-duplicate-keys": "^7.10.4",
                "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
                "@babel/plugin-transform-for-of": "^7.10.4",
                "@babel/plugin-transform-function-name": "^7.10.4",
                "@babel/plugin-transform-literals": "^7.10.4",
                "@babel/plugin-transform-member-expression-literals": "^7.10.4",
                "@babel/plugin-transform-modules-amd": "^7.10.4",
                "@babel/plugin-transform-modules-commonjs": "^7.10.4",
                "@babel/plugin-transform-modules-systemjs": "^7.10.4",
                "@babel/plugin-transform-modules-umd": "^7.10.4",
                "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
                "@babel/plugin-transform-new-target": "^7.10.4",
                "@babel/plugin-transform-object-super": "^7.10.4",
                "@babel/plugin-transform-parameters": "^7.10.4",
                "@babel/plugin-transform-property-literals": "^7.10.4",
                "@babel/plugin-transform-regenerator": "^7.10.4",
                "@babel/plugin-transform-reserved-words": "^7.10.4",
                "@babel/plugin-transform-shorthand-properties": "^7.10.4",
                "@babel/plugin-transform-spread": "^7.11.0",
                "@babel/plugin-transform-sticky-regex": "^7.10.4",
                "@babel/plugin-transform-template-literals": "^7.10.4",
                "@babel/plugin-transform-typeof-symbol": "^7.10.4",
                "@babel/plugin-transform-unicode-escapes": "^7.10.4",
                "@babel/plugin-transform-unicode-regex": "^7.10.4",
                "@babel/preset-modules": "^0.1.3",
                "@babel/types": "^7.11.0",
                "browserslist": "^4.12.0",
                "core-js-compat": "^3.6.2",
                "invariant": "^2.2.2",
                "levenary": "^1.1.1",
                "semver": "^5.5.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/preset-env/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/@babel/preset-modules": {
            "version": "0.1.3",
            "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz",
            "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.0.0",
                "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
                "@babel/plugin-transform-dotall-regex": "^7.4.4",
                "@babel/types": "^7.4.4",
                "esutils": "^2.0.2"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/preset-react": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz",
            "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-transform-react-display-name": "^7.10.4",
                "@babel/plugin-transform-react-jsx": "^7.10.4",
                "@babel/plugin-transform-react-jsx-development": "^7.10.4",
                "@babel/plugin-transform-react-jsx-self": "^7.10.4",
                "@babel/plugin-transform-react-jsx-source": "^7.10.4",
                "@babel/plugin-transform-react-pure-annotations": "^7.10.4"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/preset-typescript": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz",
            "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-transform-typescript": "^7.9.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/@babel/runtime": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.0.tgz",
            "integrity": "sha512-qArkXsjJq7H+T86WrIFV0Fnu/tNOkZ4cgXmjkzAu3b/58D5mFIO8JH/y77t7C9q0OdDRdh9s7Ue5GasYssxtXw==",
            "dependencies": {
                "regenerator-runtime": "^0.13.4"
            }
        },
        "node_modules/@babel/runtime-corejs3": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.0.tgz",
            "integrity": "sha512-K0ioacsw8JgzDSPpUiGWokMvLzGvnZPXLrTsJfyHPrFsnp4yoKn+Ap/8NNZgWKZG9o5+qotH8tAa8AXn8gTN5A==",
            "dependencies": {
                "core-js-pure": "^3.0.0",
                "regenerator-runtime": "^0.13.4"
            }
        },
        "node_modules/@babel/template": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
            "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
            "dependencies": {
                "@babel/code-frame": "^7.10.4",
                "@babel/parser": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "node_modules/@babel/traverse": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz",
            "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==",
            "dependencies": {
                "@babel/code-frame": "^7.10.4",
                "@babel/generator": "^7.11.0",
                "@babel/helper-function-name": "^7.10.4",
                "@babel/helper-split-export-declaration": "^7.11.0",
                "@babel/parser": "^7.11.0",
                "@babel/types": "^7.11.0",
                "debug": "^4.1.0",
                "globals": "^11.1.0",
                "lodash": "^4.17.19"
            }
        },
        "node_modules/@babel/types": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
            "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
            "dependencies": {
                "@babel/helper-validator-identifier": "^7.10.4",
                "lodash": "^4.17.19",
                "to-fast-properties": "^2.0.0"
            }
        },
        "node_modules/@cnakazawa/watch": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
            "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
            "dependencies": {
                "exec-sh": "^0.3.2",
                "minimist": "^1.2.0"
            },
            "bin": {
                "watch": "cli.js"
            },
            "engines": {
                "node": ">=0.1.95"
            }
        },
        "node_modules/@csstools/convert-colors": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
            "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==",
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/@csstools/normalize.css": {
            "version": "10.1.0",
            "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz",
            "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
        },
        "node_modules/@emotion/hash": {
            "version": "0.8.0",
            "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
            "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
        },
        "node_modules/@hapi/address": {
            "version": "2.1.4",
            "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
            "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==",
            "deprecated": "Moved to 'npm install @sideway/address'"
        },
        "node_modules/@hapi/bourne": {
            "version": "1.3.2",
            "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
            "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
            "deprecated": "This version has been deprecated and is no longer supported or maintained"
        },
        "node_modules/@hapi/hoek": {
            "version": "8.5.1",
            "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
            "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
            "deprecated": "This version has been deprecated and is no longer supported or maintained"
        },
        "node_modules/@hapi/joi": {
            "version": "15.1.1",
            "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
            "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
            "deprecated": "Switch to 'npm install joi'",
            "dependencies": {
                "@hapi/address": "2.x.x",
                "@hapi/bourne": "1.x.x",
                "@hapi/hoek": "8.x.x",
                "@hapi/topo": "3.x.x"
            }
        },
        "node_modules/@hapi/topo": {
            "version": "3.1.6",
            "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
            "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
            "deprecated": "This version has been deprecated and is no longer supported or maintained",
            "dependencies": {
                "@hapi/hoek": "^8.3.0"
            }
        },
        "node_modules/@jest/console": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz",
            "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==",
            "dependencies": {
                "@jest/source-map": "^24.9.0",
                "chalk": "^2.0.1",
                "slash": "^2.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/core": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz",
            "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==",
            "dependencies": {
                "@jest/console": "^24.7.1",
                "@jest/reporters": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "ansi-escapes": "^3.0.0",
                "chalk": "^2.0.1",
                "exit": "^0.1.2",
                "graceful-fs": "^4.1.15",
                "jest-changed-files": "^24.9.0",
                "jest-config": "^24.9.0",
                "jest-haste-map": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-regex-util": "^24.3.0",
                "jest-resolve": "^24.9.0",
                "jest-resolve-dependencies": "^24.9.0",
                "jest-runner": "^24.9.0",
                "jest-runtime": "^24.9.0",
                "jest-snapshot": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-validate": "^24.9.0",
                "jest-watcher": "^24.9.0",
                "micromatch": "^3.1.10",
                "p-each-series": "^1.0.0",
                "realpath-native": "^1.1.0",
                "rimraf": "^2.5.4",
                "slash": "^2.0.0",
                "strip-ansi": "^5.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/core/node_modules/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==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/@jest/environment": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz",
            "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==",
            "dependencies": {
                "@jest/fake-timers": "^24.9.0",
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "jest-mock": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/fake-timers": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz",
            "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-mock": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/reporters": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz",
            "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==",
            "dependencies": {
                "@jest/environment": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "exit": "^0.1.2",
                "glob": "^7.1.2",
                "istanbul-lib-coverage": "^2.0.2",
                "istanbul-lib-instrument": "^3.0.1",
                "istanbul-lib-report": "^2.0.4",
                "istanbul-lib-source-maps": "^3.0.1",
                "istanbul-reports": "^2.2.6",
                "jest-haste-map": "^24.9.0",
                "jest-resolve": "^24.9.0",
                "jest-runtime": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-worker": "^24.6.0",
                "node-notifier": "^5.4.2",
                "slash": "^2.0.0",
                "source-map": "^0.6.0",
                "string-length": "^2.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/source-map": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz",
            "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==",
            "dependencies": {
                "callsites": "^3.0.0",
                "graceful-fs": "^4.1.15",
                "source-map": "^0.6.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/source-map/node_modules/callsites": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/@jest/test-result": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz",
            "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==",
            "dependencies": {
                "@jest/console": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/istanbul-lib-coverage": "^2.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/test-sequencer": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz",
            "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==",
            "dependencies": {
                "@jest/test-result": "^24.9.0",
                "jest-haste-map": "^24.9.0",
                "jest-runner": "^24.9.0",
                "jest-runtime": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/transform": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz",
            "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==",
            "dependencies": {
                "@babel/core": "^7.1.0",
                "@jest/types": "^24.9.0",
                "babel-plugin-istanbul": "^5.1.0",
                "chalk": "^2.0.1",
                "convert-source-map": "^1.4.0",
                "fast-json-stable-stringify": "^2.0.0",
                "graceful-fs": "^4.1.15",
                "jest-haste-map": "^24.9.0",
                "jest-regex-util": "^24.9.0",
                "jest-util": "^24.9.0",
                "micromatch": "^3.1.10",
                "pirates": "^4.0.1",
                "realpath-native": "^1.1.0",
                "slash": "^2.0.0",
                "source-map": "^0.6.1",
                "write-file-atomic": "2.4.1"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@jest/types": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
            "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
            "dependencies": {
                "@types/istanbul-lib-coverage": "^2.0.0",
                "@types/istanbul-reports": "^1.1.1",
                "@types/yargs": "^13.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@material-ui/core": {
            "version": "4.11.0",
            "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.0.tgz",
            "integrity": "sha512-bYo9uIub8wGhZySHqLQ833zi4ZML+XCBE1XwJ8EuUVSpTWWG57Pm+YugQToJNFsEyiKFhPh8DPD0bgupz8n01g==",
            "dependencies": {
                "@babel/runtime": "^7.4.4",
                "@material-ui/styles": "^4.10.0",
                "@material-ui/system": "^4.9.14",
                "@material-ui/types": "^5.1.0",
                "@material-ui/utils": "^4.10.2",
                "@types/react-transition-group": "^4.2.0",
                "clsx": "^1.0.4",
                "hoist-non-react-statics": "^3.3.2",
                "popper.js": "1.16.1-lts",
                "prop-types": "^15.7.2",
                "react-is": "^16.8.0",
                "react-transition-group": "^4.4.0"
            },
            "engines": {
                "node": ">=8.0.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/material-ui"
            },
            "peerDependencies": {
                "@types/react": "^16.8.6",
                "react": "^16.8.0",
                "react-dom": "^16.8.0"
            },
            "peerDependenciesMeta": {
                "@types/react": {
                    "optional": true
                }
            }
        },
        "node_modules/@material-ui/icons": {
            "version": "4.9.1",
            "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz",
            "integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==",
            "dependencies": {
                "@babel/runtime": "^7.4.4"
            },
            "engines": {
                "node": ">=8.0.0"
            },
            "peerDependencies": {
                "@material-ui/core": "^4.0.0",
                "@types/react": "^16.8.6",
                "react": "^16.8.0",
                "react-dom": "^16.8.0"
            },
            "peerDependenciesMeta": {
                "@types/react": {
                    "optional": true
                }
            }
        },
        "node_modules/@material-ui/lab": {
            "version": "4.0.0-alpha.56",
            "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.56.tgz",
            "integrity": "sha512-xPlkK+z/6y/24ka4gVJgwPfoCF4RCh8dXb1BNE7MtF9bXEBLN/lBxNTK8VAa0qm3V2oinA6xtUIdcRh0aeRtVw==",
            "dependencies": {
                "@babel/runtime": "^7.4.4",
                "@material-ui/utils": "^4.10.2",
                "clsx": "^1.0.4",
                "prop-types": "^15.7.2",
                "react-is": "^16.8.0"
            },
            "engines": {
                "node": ">=8.0.0"
            },
            "peerDependencies": {
                "@material-ui/core": "^4.9.10",
                "@types/react": "^16.8.6",
                "react": "^16.8.0",
                "react-dom": "^16.8.0"
            },
            "peerDependenciesMeta": {
                "@types/react": {
                    "optional": true
                }
            }
        },
        "node_modules/@material-ui/styles": {
            "version": "4.11.4",
            "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz",
            "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==",
            "dependencies": {
                "@babel/runtime": "^7.4.4",
                "@emotion/hash": "^0.8.0",
                "@material-ui/types": "5.1.0",
                "@material-ui/utils": "^4.11.2",
                "clsx": "^1.0.4",
                "csstype": "^2.5.2",
                "hoist-non-react-statics": "^3.3.2",
                "jss": "^10.5.1",
                "jss-plugin-camel-case": "^10.5.1",
                "jss-plugin-default-unit": "^10.5.1",
                "jss-plugin-global": "^10.5.1",
                "jss-plugin-nested": "^10.5.1",
                "jss-plugin-props-sort": "^10.5.1",
                "jss-plugin-rule-value-function": "^10.5.1",
                "jss-plugin-vendor-prefixer": "^10.5.1",
                "prop-types": "^15.7.2"
            },
            "engines": {
                "node": ">=8.0.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/material-ui"
            },
            "peerDependencies": {
                "@types/react": "^16.8.6 || ^17.0.0",
                "react": "^16.8.0 || ^17.0.0",
                "react-dom": "^16.8.0 || ^17.0.0"
            },
            "peerDependenciesMeta": {
                "@types/react": {
                    "optional": true
                }
            }
        },
        "node_modules/@material-ui/styles/node_modules/@material-ui/utils": {
            "version": "4.11.2",
            "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz",
            "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==",
            "dependencies": {
                "@babel/runtime": "^7.4.4",
                "prop-types": "^15.7.2",
                "react-is": "^16.8.0 || ^17.0.0"
            },
            "engines": {
                "node": ">=8.0.0"
            },
            "peerDependencies": {
                "react": "^16.8.0 || ^17.0.0",
                "react-dom": "^16.8.0 || ^17.0.0"
            }
        },
        "node_modules/@material-ui/system": {
            "version": "4.9.14",
            "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.14.tgz",
            "integrity": "sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w==",
            "dependencies": {
                "@babel/runtime": "^7.4.4",
                "@material-ui/utils": "^4.9.6",
                "csstype": "^2.5.2",
                "prop-types": "^15.7.2"
            },
            "engines": {
                "node": ">=8.0.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/material-ui"
            },
            "peerDependencies": {
                "@types/react": "^16.8.6",
                "react": "^16.8.0",
                "react-dom": "^16.8.0"
            },
            "peerDependenciesMeta": {
                "@types/react": {
                    "optional": true
                }
            }
        },
        "node_modules/@material-ui/types": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz",
            "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==",
            "peerDependencies": {
                "@types/react": "*"
            },
            "peerDependenciesMeta": {
                "@types/react": {
                    "optional": true
                }
            }
        },
        "node_modules/@material-ui/utils": {
            "version": "4.10.2",
            "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.10.2.tgz",
            "integrity": "sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw==",
            "dependencies": {
                "@babel/runtime": "^7.4.4",
                "prop-types": "^15.7.2",
                "react-is": "^16.8.0"
            },
            "engines": {
                "node": ">=8.0.0"
            },
            "peerDependencies": {
                "react": "^16.8.0",
                "react-dom": "^16.8.0"
            }
        },
        "node_modules/@mrmlnc/readdir-enhanced": {
            "version": "2.2.1",
            "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
            "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
            "dependencies": {
                "call-me-maybe": "^1.0.1",
                "glob-to-regexp": "^0.3.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/@nodelib/fs.stat": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
            "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/@sheerun/mutationobserver-shim": {
            "version": "0.3.3",
            "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz",
            "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw=="
        },
        "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
            "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz",
            "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz",
            "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz",
            "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz",
            "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz",
            "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz",
            "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/babel-plugin-transform-svg-component": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz",
            "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/babel-preset": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz",
            "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==",
            "dependencies": {
                "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0",
                "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0",
                "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0",
                "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0",
                "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3",
                "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0",
                "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0",
                "@svgr/babel-plugin-transform-svg-component": "^4.2.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/core": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz",
            "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==",
            "dependencies": {
                "@svgr/plugin-jsx": "^4.3.3",
                "camelcase": "^5.3.1",
                "cosmiconfig": "^5.2.1"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/hast-util-to-babel-ast": {
            "version": "4.3.2",
            "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz",
            "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==",
            "dependencies": {
                "@babel/types": "^7.4.4"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/plugin-jsx": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz",
            "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==",
            "dependencies": {
                "@babel/core": "^7.4.5",
                "@svgr/babel-preset": "^4.3.3",
                "@svgr/hast-util-to-babel-ast": "^4.3.2",
                "svg-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/plugin-svgo": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz",
            "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==",
            "dependencies": {
                "cosmiconfig": "^5.2.1",
                "merge-deep": "^3.0.2",
                "svgo": "^1.2.2"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@svgr/webpack": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz",
            "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==",
            "dependencies": {
                "@babel/core": "^7.4.5",
                "@babel/plugin-transform-react-constant-elements": "^7.0.0",
                "@babel/preset-env": "^7.4.5",
                "@babel/preset-react": "^7.0.0",
                "@svgr/core": "^4.3.3",
                "@svgr/plugin-jsx": "^4.3.3",
                "@svgr/plugin-svgo": "^4.3.1",
                "loader-utils": "^1.2.3"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@testing-library/dom": {
            "version": "6.16.0",
            "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz",
            "integrity": "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==",
            "dependencies": {
                "@babel/runtime": "^7.8.4",
                "@sheerun/mutationobserver-shim": "^0.3.2",
                "@types/testing-library__dom": "^6.12.1",
                "aria-query": "^4.0.2",
                "dom-accessibility-api": "^0.3.0",
                "pretty-format": "^25.1.0",
                "wait-for-expect": "^3.0.2"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@testing-library/dom/node_modules/@jest/types": {
            "version": "25.5.0",
            "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
            "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
            "dependencies": {
                "@types/istanbul-lib-coverage": "^2.0.0",
                "@types/istanbul-reports": "^1.1.1",
                "@types/yargs": "^15.0.0",
                "chalk": "^3.0.0"
            },
            "engines": {
                "node": ">= 8.3"
            }
        },
        "node_modules/@testing-library/dom/node_modules/@types/yargs": {
            "version": "15.0.5",
            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
            "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
            "dependencies": {
                "@types/yargs-parser": "*"
            }
        },
        "node_modules/@testing-library/dom/node_modules/ansi-regex": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@testing-library/dom/node_modules/ansi-styles": {
            "version": "4.2.1",
            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
            "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
            "dependencies": {
                "@types/color-name": "^1.1.1",
                "color-convert": "^2.0.1"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
            }
        },
        "node_modules/@testing-library/dom/node_modules/chalk": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
            "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
            "dependencies": {
                "ansi-styles": "^4.1.0",
                "supports-color": "^7.1.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@testing-library/dom/node_modules/color-convert": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
            "dependencies": {
                "color-name": "~1.1.4"
            },
            "engines": {
                "node": ">=7.0.0"
            }
        },
        "node_modules/@testing-library/dom/node_modules/color-name": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
        },
        "node_modules/@testing-library/dom/node_modules/has-flag": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@testing-library/dom/node_modules/pretty-format": {
            "version": "25.5.0",
            "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
            "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
            "dependencies": {
                "@jest/types": "^25.5.0",
                "ansi-regex": "^5.0.0",
                "ansi-styles": "^4.0.0",
                "react-is": "^16.12.0"
            },
            "engines": {
                "node": ">= 8.3"
            }
        },
        "node_modules/@testing-library/dom/node_modules/supports-color": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
            "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
            "dependencies": {
                "has-flag": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@testing-library/jest-dom": {
            "version": "4.2.4",
            "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz",
            "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==",
            "dependencies": {
                "@babel/runtime": "^7.5.1",
                "chalk": "^2.4.1",
                "css": "^2.2.3",
                "css.escape": "^1.5.1",
                "jest-diff": "^24.0.0",
                "jest-matcher-utils": "^24.0.0",
                "lodash": "^4.17.11",
                "pretty-format": "^24.0.0",
                "redent": "^3.0.0"
            },
            "engines": {
                "node": ">=8",
                "npm": ">=6"
            }
        },
        "node_modules/@testing-library/react": {
            "version": "9.5.0",
            "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz",
            "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==",
            "dependencies": {
                "@babel/runtime": "^7.8.4",
                "@testing-library/dom": "^6.15.0",
                "@types/testing-library__react": "^9.1.2"
            },
            "engines": {
                "node": ">=8"
            },
            "peerDependencies": {
                "react": "*",
                "react-dom": "*"
            }
        },
        "node_modules/@testing-library/user-event": {
            "version": "7.2.1",
            "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz",
            "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==",
            "peerDependencies": {
                "@testing-library/dom": ">=5"
            }
        },
        "node_modules/@types/babel__core": {
            "version": "7.1.9",
            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz",
            "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==",
            "dependencies": {
                "@babel/parser": "^7.1.0",
                "@babel/types": "^7.0.0",
                "@types/babel__generator": "*",
                "@types/babel__template": "*",
                "@types/babel__traverse": "*"
            }
        },
        "node_modules/@types/babel__generator": {
            "version": "7.6.1",
            "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz",
            "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==",
            "dependencies": {
                "@babel/types": "^7.0.0"
            }
        },
        "node_modules/@types/babel__template": {
            "version": "7.0.2",
            "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
            "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
            "dependencies": {
                "@babel/parser": "^7.1.0",
                "@babel/types": "^7.0.0"
            }
        },
        "node_modules/@types/babel__traverse": {
            "version": "7.0.13",
            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz",
            "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==",
            "dependencies": {
                "@babel/types": "^7.3.0"
            }
        },
        "node_modules/@types/color-name": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
            "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
        },
        "node_modules/@types/eslint-visitor-keys": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
            "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag=="
        },
        "node_modules/@types/glob": {
            "version": "7.1.3",
            "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
            "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
            "dependencies": {
                "@types/minimatch": "*",
                "@types/node": "*"
            }
        },
        "node_modules/@types/istanbul-lib-coverage": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
            "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
        },
        "node_modules/@types/istanbul-lib-report": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
            "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
            "dependencies": {
                "@types/istanbul-lib-coverage": "*"
            }
        },
        "node_modules/@types/istanbul-reports": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
            "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
            "dependencies": {
                "@types/istanbul-lib-coverage": "*",
                "@types/istanbul-lib-report": "*"
            }
        },
        "node_modules/@types/json-schema": {
            "version": "7.0.5",
            "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
            "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ=="
        },
        "node_modules/@types/minimatch": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
            "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
        },
        "node_modules/@types/node": {
            "version": "14.0.27",
            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
            "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g=="
        },
        "node_modules/@types/parse-json": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
            "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
        },
        "node_modules/@types/prop-types": {
            "version": "15.7.3",
            "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
            "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
        },
        "node_modules/@types/q": {
            "version": "1.5.4",
            "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
            "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
        },
        "node_modules/@types/react": {
            "version": "16.9.44",
            "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.44.tgz",
            "integrity": "sha512-BtLoJrXdW8DVZauKP+bY4Kmiq7ubcJq+H/aCpRfvPF7RAT3RwR73Sg8szdc2YasbAlWBDrQ6Q+AFM0KwtQY+WQ==",
            "dependencies": {
                "@types/prop-types": "*",
                "csstype": "^3.0.2"
            }
        },
        "node_modules/@types/react-dom": {
            "version": "16.9.8",
            "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz",
            "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==",
            "dependencies": {
                "@types/react": "*"
            }
        },
        "node_modules/@types/react-transition-group": {
            "version": "4.4.0",
            "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz",
            "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==",
            "dependencies": {
                "@types/react": "*"
            }
        },
        "node_modules/@types/react/node_modules/csstype": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz",
            "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw=="
        },
        "node_modules/@types/stack-utils": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
            "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw=="
        },
        "node_modules/@types/testing-library__dom": {
            "version": "6.14.0",
            "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz",
            "integrity": "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==",
            "dependencies": {
                "pretty-format": "^24.3.0"
            }
        },
        "node_modules/@types/testing-library__react": {
            "version": "9.1.3",
            "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz",
            "integrity": "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==",
            "dependencies": {
                "@types/react-dom": "*",
                "@types/testing-library__dom": "*",
                "pretty-format": "^25.1.0"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/@jest/types": {
            "version": "25.5.0",
            "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
            "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
            "dependencies": {
                "@types/istanbul-lib-coverage": "^2.0.0",
                "@types/istanbul-reports": "^1.1.1",
                "@types/yargs": "^15.0.0",
                "chalk": "^3.0.0"
            },
            "engines": {
                "node": ">= 8.3"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/@types/yargs": {
            "version": "15.0.5",
            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
            "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
            "dependencies": {
                "@types/yargs-parser": "*"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/ansi-regex": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/ansi-styles": {
            "version": "4.2.1",
            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
            "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
            "dependencies": {
                "@types/color-name": "^1.1.1",
                "color-convert": "^2.0.1"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/chalk": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
            "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
            "dependencies": {
                "ansi-styles": "^4.1.0",
                "supports-color": "^7.1.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/color-convert": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
            "dependencies": {
                "color-name": "~1.1.4"
            },
            "engines": {
                "node": ">=7.0.0"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/color-name": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
        },
        "node_modules/@types/testing-library__react/node_modules/has-flag": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/pretty-format": {
            "version": "25.5.0",
            "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
            "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
            "dependencies": {
                "@jest/types": "^25.5.0",
                "ansi-regex": "^5.0.0",
                "ansi-styles": "^4.0.0",
                "react-is": "^16.12.0"
            },
            "engines": {
                "node": ">= 8.3"
            }
        },
        "node_modules/@types/testing-library__react/node_modules/supports-color": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
            "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
            "dependencies": {
                "has-flag": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/@types/yargs": {
            "version": "13.0.9",
            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
            "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
            "dependencies": {
                "@types/yargs-parser": "*"
            }
        },
        "node_modules/@types/yargs-parser": {
            "version": "15.0.0",
            "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
            "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw=="
        },
        "node_modules/@typescript-eslint/eslint-plugin": {
            "version": "2.34.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz",
            "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==",
            "dependencies": {
                "@typescript-eslint/experimental-utils": "2.34.0",
                "functional-red-black-tree": "^1.0.1",
                "regexpp": "^3.0.0",
                "tsutils": "^3.17.1"
            },
            "engines": {
                "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },
            "peerDependencies": {
                "@typescript-eslint/parser": "^2.0.0",
                "eslint": "^5.0.0 || ^6.0.0"
            },
            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }
            }
        },
        "node_modules/@typescript-eslint/experimental-utils": {
            "version": "2.34.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz",
            "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==",
            "dependencies": {
                "@types/json-schema": "^7.0.3",
                "@typescript-eslint/typescript-estree": "2.34.0",
                "eslint-scope": "^5.0.0",
                "eslint-utils": "^2.0.0"
            },
            "engines": {
                "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },
            "peerDependencies": {
                "eslint": "*"
            }
        },
        "node_modules/@typescript-eslint/parser": {
            "version": "2.34.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz",
            "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==",
            "dependencies": {
                "@types/eslint-visitor-keys": "^1.0.0",
                "@typescript-eslint/experimental-utils": "2.34.0",
                "@typescript-eslint/typescript-estree": "2.34.0",
                "eslint-visitor-keys": "^1.1.0"
            },
            "engines": {
                "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },
            "peerDependencies": {
                "eslint": "^5.0.0 || ^6.0.0"
            },
            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }
            }
        },
        "node_modules/@typescript-eslint/typescript-estree": {
            "version": "2.34.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz",
            "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==",
            "dependencies": {
                "debug": "^4.1.1",
                "eslint-visitor-keys": "^1.1.0",
                "glob": "^7.1.6",
                "is-glob": "^4.0.1",
                "lodash": "^4.17.15",
                "semver": "^7.3.2",
                "tsutils": "^3.17.1"
            },
            "engines": {
                "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },
            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }
            }
        },
        "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
            "version": "7.3.2",
            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
            "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
            "bin": {
                "semver": "bin/semver.js"
            },
            "engines": {
                "node": ">=10"
            }
        },
        "node_modules/@webassemblyjs/ast": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
            "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
            "dependencies": {
                "@webassemblyjs/helper-module-context": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/wast-parser": "1.8.5"
            }
        },
        "node_modules/@webassemblyjs/floating-point-hex-parser": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
            "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ=="
        },
        "node_modules/@webassemblyjs/helper-api-error": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
            "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA=="
        },
        "node_modules/@webassemblyjs/helper-buffer": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
            "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q=="
        },
        "node_modules/@webassemblyjs/helper-code-frame": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
            "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
            "dependencies": {
                "@webassemblyjs/wast-printer": "1.8.5"
            }
        },
        "node_modules/@webassemblyjs/helper-fsm": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
            "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow=="
        },
        "node_modules/@webassemblyjs/helper-module-context": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
            "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "mamacro": "^0.0.3"
            }
        },
        "node_modules/@webassemblyjs/helper-wasm-bytecode": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
            "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ=="
        },
        "node_modules/@webassemblyjs/helper-wasm-section": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
            "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-buffer": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/wasm-gen": "1.8.5"
            }
        },
        "node_modules/@webassemblyjs/ieee754": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
            "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
            "dependencies": {
                "@xtuc/ieee754": "^1.2.0"
            }
        },
        "node_modules/@webassemblyjs/leb128": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
            "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
            "dependencies": {
                "@xtuc/long": "4.2.2"
            }
        },
        "node_modules/@webassemblyjs/utf8": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
            "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw=="
        },
        "node_modules/@webassemblyjs/wasm-edit": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
            "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-buffer": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/helper-wasm-section": "1.8.5",
                "@webassemblyjs/wasm-gen": "1.8.5",
                "@webassemblyjs/wasm-opt": "1.8.5",
                "@webassemblyjs/wasm-parser": "1.8.5",
                "@webassemblyjs/wast-printer": "1.8.5"
            }
        },
        "node_modules/@webassemblyjs/wasm-gen": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
            "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/ieee754": "1.8.5",
                "@webassemblyjs/leb128": "1.8.5",
                "@webassemblyjs/utf8": "1.8.5"
            }
        },
        "node_modules/@webassemblyjs/wasm-opt": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
            "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-buffer": "1.8.5",
                "@webassemblyjs/wasm-gen": "1.8.5",
                "@webassemblyjs/wasm-parser": "1.8.5"
            }
        },
        "node_modules/@webassemblyjs/wasm-parser": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
            "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-api-error": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/ieee754": "1.8.5",
                "@webassemblyjs/leb128": "1.8.5",
                "@webassemblyjs/utf8": "1.8.5"
            }
        },
        "node_modules/@webassemblyjs/wast-parser": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
            "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/floating-point-hex-parser": "1.8.5",
                "@webassemblyjs/helper-api-error": "1.8.5",
                "@webassemblyjs/helper-code-frame": "1.8.5",
                "@webassemblyjs/helper-fsm": "1.8.5",
                "@xtuc/long": "4.2.2"
            }
        },
        "node_modules/@webassemblyjs/wast-printer": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
            "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/wast-parser": "1.8.5",
                "@xtuc/long": "4.2.2"
            }
        },
        "node_modules/@xtuc/ieee754": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
            "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
        },
        "node_modules/@xtuc/long": {
            "version": "4.2.2",
            "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
            "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
        },
        "node_modules/abab": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz",
            "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ=="
        },
        "node_modules/accepts": {
            "version": "1.3.7",
            "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
            "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
            "dependencies": {
                "mime-types": "~2.1.24",
                "negotiator": "0.6.2"
            },
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/acorn": {
            "version": "7.3.1",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
            "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
            "bin": {
                "acorn": "bin/acorn"
            },
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/acorn-globals": {
            "version": "4.3.4",
            "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
            "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
            "dependencies": {
                "acorn": "^6.0.1",
                "acorn-walk": "^6.0.1"
            }
        },
        "node_modules/acorn-globals/node_modules/acorn": {
            "version": "6.4.1",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
            "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
            "bin": {
                "acorn": "bin/acorn"
            },
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/acorn-jsx": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
            "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
            "peerDependencies": {
                "acorn": "^6.0.0 || ^7.0.0"
            }
        },
        "node_modules/acorn-walk": {
            "version": "6.2.0",
            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
            "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/address": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
            "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
            "engines": {
                "node": ">= 0.12.0"
            }
        },
        "node_modules/adjust-sourcemap-loader": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz",
            "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==",
            "dependencies": {
                "assert": "1.4.1",
                "camelcase": "5.0.0",
                "loader-utils": "1.2.3",
                "object-path": "0.11.4",
                "regex-parser": "2.2.10"
            }
        },
        "node_modules/adjust-sourcemap-loader/node_modules/camelcase": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
            "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/adjust-sourcemap-loader/node_modules/emojis-list": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
            "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
            "engines": {
                "node": ">= 0.10"
            }
        },
        "node_modules/adjust-sourcemap-loader/node_modules/json5": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
            "dependencies": {
                "minimist": "^1.2.0"
            },
            "bin": {
                "json5": "lib/cli.js"
            }
        },
        "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
            "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
            "dependencies": {
                "big.js": "^5.2.2",
                "emojis-list": "^2.0.0",
                "json5": "^1.0.1"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/aggregate-error": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
            "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
            "dependencies": {
                "clean-stack": "^2.0.0",
                "indent-string": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/ajv": {
            "version": "6.12.3",
            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
            "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
            "dependencies": {
                "fast-deep-equal": "^3.1.1",
                "fast-json-stable-stringify": "^2.0.0",
                "json-schema-traverse": "^0.4.1",
                "uri-js": "^4.2.2"
            },
            "funding": {
                "type": "github",
                "url": "https://github.com/sponsors/epoberezkin"
            }
        },
        "node_modules/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==",
            "peerDependencies": {
                "ajv": ">=5.0.0"
            }
        },
        "node_modules/ajv-keywords": {
            "version": "3.5.2",
            "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
            "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
            "peerDependencies": {
                "ajv": "^6.9.1"
            }
        },
        "node_modules/alphanum-sort": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
            "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
        },
        "node_modules/ansi-colors": {
            "version": "3.2.4",
            "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
            "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/ansi-escapes": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
            "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
            "dependencies": {
                "type-fest": "^0.11.0"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/ansi-escapes/node_modules/type-fest": {
            "version": "0.11.0",
            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
            "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/ansi-html": {
            "version": "0.0.7",
            "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
            "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
            "engines": [
                "node >= 0.8.0"
            ],
            "bin": {
                "ansi-html": "bin/ansi-html"
            }
        },
        "node_modules/ansi-regex": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
            "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "color-convert": "^1.9.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/anymatch": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
            "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
            "dependencies": {
                "micromatch": "^3.1.4",
                "normalize-path": "^2.1.1"
            }
        },
        "node_modules/aproba": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
            "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
        },
        "node_modules/argparse": {
            "version": "1.0.10",
            "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
            "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
            "dependencies": {
                "sprintf-js": "~1.0.2"
            }
        },
        "node_modules/aria-query": {
            "version": "4.2.2",
            "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
            "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
            "dependencies": {
                "@babel/runtime": "^7.10.2",
                "@babel/runtime-corejs3": "^7.10.2"
            },
            "engines": {
                "node": ">=6.0"
            }
        },
        "node_modules/arity-n": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz",
            "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U="
        },
        "node_modules/arr-diff": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
            "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/arr-union": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
            "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/array-equal": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
            "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
        },
        "node_modules/array-flatten": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
            "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
        },
        "node_modules/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==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0",
                "is-string": "^1.0.5"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/array-union": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
            "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
            "dependencies": {
                "array-uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/array-uniq": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
            "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/array-unique": {
            "version": "0.3.2",
            "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
            "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/array.prototype.flat": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
            "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0-next.1"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/arrify": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
            "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/asap": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
            "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
        },
        "node_modules/asn1": {
            "version": "0.2.4",
            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
            "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
            "dependencies": {
                "safer-buffer": "~2.1.0"
            }
        },
        "node_modules/asn1.js": {
            "version": "4.10.1",
            "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
            "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
            "dependencies": {
                "bn.js": "^4.0.0",
                "inherits": "^2.0.1",
                "minimalistic-assert": "^1.0.0"
            }
        },
        "node_modules/asn1.js/node_modules/bn.js": {
            "version": "4.11.9",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
        },
        "node_modules/assert": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
            "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
            "dependencies": {
                "util": "0.10.3"
            }
        },
        "node_modules/assert-plus": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
            "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
            "engines": {
                "node": ">=0.8"
            }
        },
        "node_modules/assign-symbols": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
            "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/ast-types-flow": {
            "version": "0.0.7",
            "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
            "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
        },
        "node_modules/astral-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
            "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/async": {
            "version": "2.6.3",
            "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
            "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
            "dependencies": {
                "lodash": "^4.17.14"
            }
        },
        "node_modules/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=="
        },
        "node_modules/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=="
        },
        "node_modules/asynckit": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
            "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
        },
        "node_modules/atob": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
            "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
            "bin": {
                "atob": "bin/atob.js"
            },
            "engines": {
                "node": ">= 4.5.0"
            }
        },
        "node_modules/autoprefixer": {
            "version": "9.8.6",
            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
            "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
            "dependencies": {
                "browserslist": "^4.12.0",
                "caniuse-lite": "^1.0.30001109",
                "colorette": "^1.2.1",
                "normalize-range": "^0.1.2",
                "num2fraction": "^1.2.2",
                "postcss": "^7.0.32",
                "postcss-value-parser": "^4.1.0"
            },
            "bin": {
                "autoprefixer": "bin/autoprefixer"
            },
            "funding": {
                "type": "tidelift",
                "url": "https://tidelift.com/funding/github/npm/autoprefixer"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": "*"
            }
        },
        "node_modules/aws4": {
            "version": "1.10.0",
            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
            "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
        },
        "node_modules/axobject-query": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
            "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
        },
        "node_modules/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=",
            "dependencies": {
                "chalk": "^1.1.3",
                "esutils": "^2.0.2",
                "js-tokens": "^3.0.2"
            }
        },
        "node_modules/babel-code-frame/node_modules/ansi-regex": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/babel-code-frame/node_modules/ansi-styles": {
            "version": "2.2.1",
            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
            "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/babel-code-frame/node_modules/chalk": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
            "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/babel-code-frame/node_modules/js-tokens": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
            "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
        },
        "node_modules/babel-code-frame/node_modules/strip-ansi": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
            "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
            "dependencies": {
                "ansi-regex": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/babel-code-frame/node_modules/supports-color": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
            "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
            "engines": {
                "node": ">=0.8.0"
            }
        },
        "node_modules/babel-eslint": {
            "version": "10.1.0",
            "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
            "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
            "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.",
            "dependencies": {
                "@babel/code-frame": "^7.0.0",
                "@babel/parser": "^7.7.0",
                "@babel/traverse": "^7.7.0",
                "@babel/types": "^7.7.0",
                "eslint-visitor-keys": "^1.0.0",
                "resolve": "^1.12.0"
            },
            "engines": {
                "node": ">=6"
            },
            "peerDependencies": {
                "eslint": ">= 4.12.1"
            }
        },
        "node_modules/babel-extract-comments": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz",
            "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==",
            "dependencies": {
                "babylon": "^6.18.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/babel-jest": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz",
            "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==",
            "dependencies": {
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/babel__core": "^7.1.0",
                "babel-plugin-istanbul": "^5.1.0",
                "babel-preset-jest": "^24.9.0",
                "chalk": "^2.4.2",
                "slash": "^2.0.0"
            },
            "engines": {
                "node": ">= 6"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0"
            }
        },
        "node_modules/babel-loader": {
            "version": "8.1.0",
            "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
            "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
            "dependencies": {
                "find-cache-dir": "^2.1.0",
                "loader-utils": "^1.4.0",
                "mkdirp": "^0.5.3",
                "pify": "^4.0.1",
                "schema-utils": "^2.6.5"
            },
            "engines": {
                "node": ">= 6.9"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0",
                "webpack": ">=2"
            }
        },
        "node_modules/babel-loader/node_modules/pify": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
            "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/babel-plugin-dynamic-import-node": {
            "version": "2.3.3",
            "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
            "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
            "dependencies": {
                "object.assign": "^4.1.0"
            }
        },
        "node_modules/babel-plugin-istanbul": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz",
            "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.0.0",
                "find-up": "^3.0.0",
                "istanbul-lib-instrument": "^3.3.0",
                "test-exclude": "^5.2.3"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/babel-plugin-jest-hoist": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz",
            "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==",
            "dependencies": {
                "@types/babel__traverse": "^7.0.6"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/babel-plugin-macros": {
            "version": "2.8.0",
            "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
            "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
            "dependencies": {
                "@babel/runtime": "^7.7.2",
                "cosmiconfig": "^6.0.0",
                "resolve": "^1.12.0"
            }
        },
        "node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
            "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
            "dependencies": {
                "@types/parse-json": "^4.0.0",
                "import-fresh": "^3.1.0",
                "parse-json": "^5.0.0",
                "path-type": "^4.0.0",
                "yaml": "^1.7.2"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/babel-plugin-macros/node_modules/import-fresh": {
            "version": "3.2.1",
            "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
            "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
            "dependencies": {
                "parent-module": "^1.0.0",
                "resolve-from": "^4.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/babel-plugin-macros/node_modules/parse-json": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
            "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
            "dependencies": {
                "@babel/code-frame": "^7.0.0",
                "error-ex": "^1.3.1",
                "json-parse-better-errors": "^1.0.1",
                "lines-and-columns": "^1.1.6"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/babel-plugin-macros/node_modules/path-type": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
            "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/babel-plugin-macros/node_modules/resolve-from": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
            "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/babel-plugin-named-asset-import": {
            "version": "0.3.6",
            "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz",
            "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==",
            "peerDependencies": {
                "@babel/core": "^7.1.0"
            }
        },
        "node_modules/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="
        },
        "node_modules/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=",
            "dependencies": {
                "babel-plugin-syntax-object-rest-spread": "^6.8.0",
                "babel-runtime": "^6.26.0"
            }
        },
        "node_modules/babel-plugin-transform-react-remove-prop-types": {
            "version": "0.4.24",
            "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
            "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
        },
        "node_modules/babel-preset-jest": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz",
            "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==",
            "dependencies": {
                "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
                "babel-plugin-jest-hoist": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0"
            }
        },
        "node_modules/babel-preset-react-app": {
            "version": "9.1.2",
            "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz",
            "integrity": "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==",
            "dependencies": {
                "@babel/core": "7.9.0",
                "@babel/plugin-proposal-class-properties": "7.8.3",
                "@babel/plugin-proposal-decorators": "7.8.3",
                "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3",
                "@babel/plugin-proposal-numeric-separator": "7.8.3",
                "@babel/plugin-proposal-optional-chaining": "7.9.0",
                "@babel/plugin-transform-flow-strip-types": "7.9.0",
                "@babel/plugin-transform-react-display-name": "7.8.3",
                "@babel/plugin-transform-runtime": "7.9.0",
                "@babel/preset-env": "7.9.0",
                "@babel/preset-react": "7.9.1",
                "@babel/preset-typescript": "7.9.0",
                "@babel/runtime": "7.9.0",
                "babel-plugin-macros": "2.8.0",
                "babel-plugin-transform-react-remove-prop-types": "0.4.24"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-class-properties": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz",
            "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==",
            "dependencies": {
                "@babel/helper-create-class-features-plugin": "^7.8.3",
                "@babel/helper-plugin-utils": "^7.8.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz",
            "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-numeric-separator": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz",
            "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-syntax-numeric-separator": "^7.8.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-optional-chaining": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz",
            "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-syntax-optional-chaining": "^7.8.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/@babel/plugin-transform-react-display-name": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz",
            "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.3"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/@babel/preset-env": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz",
            "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==",
            "dependencies": {
                "@babel/compat-data": "^7.9.0",
                "@babel/helper-compilation-targets": "^7.8.7",
                "@babel/helper-module-imports": "^7.8.3",
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-proposal-async-generator-functions": "^7.8.3",
                "@babel/plugin-proposal-dynamic-import": "^7.8.3",
                "@babel/plugin-proposal-json-strings": "^7.8.3",
                "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
                "@babel/plugin-proposal-numeric-separator": "^7.8.3",
                "@babel/plugin-proposal-object-rest-spread": "^7.9.0",
                "@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
                "@babel/plugin-proposal-optional-chaining": "^7.9.0",
                "@babel/plugin-proposal-unicode-property-regex": "^7.8.3",
                "@babel/plugin-syntax-async-generators": "^7.8.0",
                "@babel/plugin-syntax-dynamic-import": "^7.8.0",
                "@babel/plugin-syntax-json-strings": "^7.8.0",
                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
                "@babel/plugin-syntax-numeric-separator": "^7.8.0",
                "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
                "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
                "@babel/plugin-syntax-optional-chaining": "^7.8.0",
                "@babel/plugin-syntax-top-level-await": "^7.8.3",
                "@babel/plugin-transform-arrow-functions": "^7.8.3",
                "@babel/plugin-transform-async-to-generator": "^7.8.3",
                "@babel/plugin-transform-block-scoped-functions": "^7.8.3",
                "@babel/plugin-transform-block-scoping": "^7.8.3",
                "@babel/plugin-transform-classes": "^7.9.0",
                "@babel/plugin-transform-computed-properties": "^7.8.3",
                "@babel/plugin-transform-destructuring": "^7.8.3",
                "@babel/plugin-transform-dotall-regex": "^7.8.3",
                "@babel/plugin-transform-duplicate-keys": "^7.8.3",
                "@babel/plugin-transform-exponentiation-operator": "^7.8.3",
                "@babel/plugin-transform-for-of": "^7.9.0",
                "@babel/plugin-transform-function-name": "^7.8.3",
                "@babel/plugin-transform-literals": "^7.8.3",
                "@babel/plugin-transform-member-expression-literals": "^7.8.3",
                "@babel/plugin-transform-modules-amd": "^7.9.0",
                "@babel/plugin-transform-modules-commonjs": "^7.9.0",
                "@babel/plugin-transform-modules-systemjs": "^7.9.0",
                "@babel/plugin-transform-modules-umd": "^7.9.0",
                "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
                "@babel/plugin-transform-new-target": "^7.8.3",
                "@babel/plugin-transform-object-super": "^7.8.3",
                "@babel/plugin-transform-parameters": "^7.8.7",
                "@babel/plugin-transform-property-literals": "^7.8.3",
                "@babel/plugin-transform-regenerator": "^7.8.7",
                "@babel/plugin-transform-reserved-words": "^7.8.3",
                "@babel/plugin-transform-shorthand-properties": "^7.8.3",
                "@babel/plugin-transform-spread": "^7.8.3",
                "@babel/plugin-transform-sticky-regex": "^7.8.3",
                "@babel/plugin-transform-template-literals": "^7.8.3",
                "@babel/plugin-transform-typeof-symbol": "^7.8.4",
                "@babel/plugin-transform-unicode-regex": "^7.8.3",
                "@babel/preset-modules": "^0.1.3",
                "@babel/types": "^7.9.0",
                "browserslist": "^4.9.1",
                "core-js-compat": "^3.6.2",
                "invariant": "^2.2.2",
                "levenary": "^1.1.1",
                "semver": "^5.5.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/@babel/preset-react": {
            "version": "7.9.1",
            "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz",
            "integrity": "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==",
            "dependencies": {
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-transform-react-display-name": "^7.8.3",
                "@babel/plugin-transform-react-jsx": "^7.9.1",
                "@babel/plugin-transform-react-jsx-development": "^7.9.0",
                "@babel/plugin-transform-react-jsx-self": "^7.9.0",
                "@babel/plugin-transform-react-jsx-source": "^7.9.0"
            },
            "peerDependencies": {
                "@babel/core": "^7.0.0-0"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/@babel/runtime": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz",
            "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==",
            "dependencies": {
                "regenerator-runtime": "^0.13.4"
            }
        },
        "node_modules/babel-preset-react-app/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "core-js": "^2.4.0",
                "regenerator-runtime": "^0.11.0"
            }
        },
        "node_modules/babel-runtime/node_modules/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==",
            "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
            "hasInstallScript": true
        },
        "node_modules/babel-runtime/node_modules/regenerator-runtime": {
            "version": "0.11.1",
            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
            "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
        },
        "node_modules/babylon": {
            "version": "6.18.0",
            "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
            "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
            "bin": {
                "babylon": "bin/babylon.js"
            }
        },
        "node_modules/balanced-match": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
            "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
        },
        "node_modules/base": {
            "version": "0.11.2",
            "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
            "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/base/node_modules/define-property": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
            "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
            "dependencies": {
                "is-descriptor": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/base/node_modules/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==",
            "dependencies": {
                "kind-of": "^6.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/base/node_modules/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==",
            "dependencies": {
                "kind-of": "^6.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/base/node_modules/is-descriptor": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
            "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
            "dependencies": {
                "is-accessor-descriptor": "^1.0.0",
                "is-data-descriptor": "^1.0.0",
                "kind-of": "^6.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/base/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/batch": {
            "version": "0.6.1",
            "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
            "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
        },
        "node_modules/bcrypt-pbkdf": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
            "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
            "dependencies": {
                "tweetnacl": "^0.14.3"
            }
        },
        "node_modules/big.js": {
            "version": "5.2.2",
            "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
            "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
            "engines": {
                "node": "*"
            }
        },
        "node_modules/binary-extensions": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
            "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/bluebird": {
            "version": "3.7.2",
            "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
            "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
        },
        "node_modules/bn.js": {
            "version": "5.1.2",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz",
            "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA=="
        },
        "node_modules/body-parser": {
            "version": "1.19.0",
            "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
            "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/body-parser/node_modules/bytes": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
            "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/body-parser/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/body-parser/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/body-parser/node_modules/qs": {
            "version": "6.7.0",
            "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
            "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
            "engines": {
                "node": ">=0.6"
            }
        },
        "node_modules/bonjour": {
            "version": "3.5.0",
            "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
            "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
            "dependencies": {
                "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"
            }
        },
        "node_modules/boolbase": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
            "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
        },
        "node_modules/brace-expansion": {
            "version": "1.1.11",
            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
            "dependencies": {
                "balanced-match": "^1.0.0",
                "concat-map": "0.0.1"
            }
        },
        "node_modules/braces": {
            "version": "2.3.2",
            "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
            "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/braces/node_modules/extend-shallow": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
            "dependencies": {
                "is-extendable": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/brorand": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
            "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
        },
        "node_modules/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=="
        },
        "node_modules/browser-resolve": {
            "version": "1.11.3",
            "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
            "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
            "dependencies": {
                "resolve": "1.1.7"
            }
        },
        "node_modules/browser-resolve/node_modules/resolve": {
            "version": "1.1.7",
            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
            "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
        },
        "node_modules/browserify-aes": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
            "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "browserify-aes": "^1.0.4",
                "browserify-des": "^1.0.0",
                "evp_bytestokey": "^1.0.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "cipher-base": "^1.0.1",
                "des.js": "^1.0.0",
                "inherits": "^2.0.1",
                "safe-buffer": "^5.1.2"
            }
        },
        "node_modules/browserify-rsa": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
            "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
            "dependencies": {
                "bn.js": "^4.1.0",
                "randombytes": "^2.0.1"
            }
        },
        "node_modules/browserify-rsa/node_modules/bn.js": {
            "version": "4.11.9",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
        },
        "node_modules/browserify-sign": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz",
            "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==",
            "dependencies": {
                "bn.js": "^5.1.1",
                "browserify-rsa": "^4.0.1",
                "create-hash": "^1.2.0",
                "create-hmac": "^1.1.7",
                "elliptic": "^6.5.2",
                "inherits": "^2.0.4",
                "parse-asn1": "^5.1.5",
                "readable-stream": "^3.6.0",
                "safe-buffer": "^5.2.0"
            }
        },
        "node_modules/browserify-sign/node_modules/safe-buffer": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/feross"
                },
                {
                    "type": "patreon",
                    "url": "https://www.patreon.com/feross"
                },
                {
                    "type": "consulting",
                    "url": "https://feross.org/support"
                }
            ]
        },
        "node_modules/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==",
            "dependencies": {
                "pako": "~1.0.5"
            }
        },
        "node_modules/browserslist": {
            "version": "4.17.4",
            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz",
            "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==",
            "dependencies": {
                "caniuse-lite": "^1.0.30001265",
                "electron-to-chromium": "^1.3.867",
                "escalade": "^3.1.1",
                "node-releases": "^2.0.0",
                "picocolors": "^1.0.0"
            },
            "bin": {
                "browserslist": "cli.js"
            },
            "engines": {
                "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/browserslist"
            }
        },
        "node_modules/browserslist/node_modules/node-releases": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz",
            "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA=="
        },
        "node_modules/bser": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
            "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
            "dependencies": {
                "node-int64": "^0.4.0"
            }
        },
        "node_modules/buffer": {
            "version": "4.9.2",
            "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
            "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
            "dependencies": {
                "base64-js": "^1.0.2",
                "ieee754": "^1.1.4",
                "isarray": "^1.0.0"
            }
        },
        "node_modules/buffer-equal-constant-time": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
            "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
        },
        "node_modules/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=="
        },
        "node_modules/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=="
        },
        "node_modules/buffer-xor": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
            "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
        },
        "node_modules/buffer/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/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="
        },
        "node_modules/bytes": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
            "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/cacache": {
            "version": "13.0.1",
            "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
            "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==",
            "dependencies": {
                "chownr": "^1.1.2",
                "figgy-pudding": "^3.5.1",
                "fs-minipass": "^2.0.0",
                "glob": "^7.1.4",
                "graceful-fs": "^4.2.2",
                "infer-owner": "^1.0.4",
                "lru-cache": "^5.1.1",
                "minipass": "^3.0.0",
                "minipass-collect": "^1.0.2",
                "minipass-flush": "^1.0.5",
                "minipass-pipeline": "^1.2.2",
                "mkdirp": "^0.5.1",
                "move-concurrently": "^1.0.1",
                "p-map": "^3.0.0",
                "promise-inflight": "^1.0.1",
                "rimraf": "^2.7.1",
                "ssri": "^7.0.0",
                "unique-filename": "^1.1.1"
            },
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/cacache/node_modules/rimraf": {
            "version": "2.7.1",
            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
            "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
            "dependencies": {
                "glob": "^7.1.3"
            },
            "bin": {
                "rimraf": "bin.js"
            }
        },
        "node_modules/cache-base": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
            "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/call-me-maybe": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
            "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
        },
        "node_modules/caller-callsite": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
            "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
            "dependencies": {
                "callsites": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/caller-path": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
            "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
            "dependencies": {
                "caller-callsite": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/callsites": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
            "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/camel-case": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz",
            "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==",
            "dependencies": {
                "pascal-case": "^3.1.1",
                "tslib": "^1.10.0"
            }
        },
        "node_modules/camelcase": {
            "version": "5.3.1",
            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/caniuse-api": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
            "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
            "dependencies": {
                "browserslist": "^4.0.0",
                "caniuse-lite": "^1.0.0",
                "lodash.memoize": "^4.1.2",
                "lodash.uniq": "^4.5.0"
            }
        },
        "node_modules/caniuse-lite": {
            "version": "1.0.30001269",
            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001269.tgz",
            "integrity": "sha512-UOy8okEVs48MyHYgV+RdW1Oiudl1H6KolybD6ZquD0VcrPSgj25omXO1S7rDydjpqaISCwA8Pyx+jUQKZwWO5w==",
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/browserslist"
            }
        },
        "node_modules/capture-exit": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
            "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
            "dependencies": {
                "rsvp": "^4.8.4"
            },
            "engines": {
                "node": "6.* || 8.* || >= 10.*"
            }
        },
        "node_modules/case-sensitive-paths-webpack-plugin": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz",
            "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/caseless": {
            "version": "0.12.0",
            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
            "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
        },
        "node_modules/chalk": {
            "version": "2.4.2",
            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
            "dependencies": {
                "ansi-styles": "^3.2.1",
                "escape-string-regexp": "^1.0.5",
                "supports-color": "^5.3.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/chardet": {
            "version": "0.7.0",
            "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
            "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
        },
        "node_modules/chokidar": {
            "version": "3.4.1",
            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz",
            "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==",
            "dependencies": {
                "anymatch": "~3.1.1",
                "braces": "~3.0.2",
                "glob-parent": "~5.1.0",
                "is-binary-path": "~2.1.0",
                "is-glob": "~4.0.1",
                "normalize-path": "~3.0.0",
                "readdirp": "~3.4.0"
            },
            "engines": {
                "node": ">= 8.10.0"
            },
            "optionalDependencies": {
                "fsevents": "~2.1.2"
            }
        },
        "node_modules/chokidar/node_modules/anymatch": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
            "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
            "dependencies": {
                "normalize-path": "^3.0.0",
                "picomatch": "^2.0.4"
            },
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/chokidar/node_modules/braces": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
            "dependencies": {
                "fill-range": "^7.0.1"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/chokidar/node_modules/fill-range": {
            "version": "7.0.1",
            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
            "dependencies": {
                "to-regex-range": "^5.0.1"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/chokidar/node_modules/is-number": {
            "version": "7.0.0",
            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
            "engines": {
                "node": ">=0.12.0"
            }
        },
        "node_modules/chokidar/node_modules/normalize-path": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/chokidar/node_modules/to-regex-range": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
            "dependencies": {
                "is-number": "^7.0.0"
            },
            "engines": {
                "node": ">=8.0"
            }
        },
        "node_modules/chownr": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
            "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
        },
        "node_modules/chrome-trace-event": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
            "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
            "dependencies": {
                "tslib": "^1.9.0"
            },
            "engines": {
                "node": ">=6.0"
            }
        },
        "node_modules/ci-info": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
            "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
        },
        "node_modules/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==",
            "dependencies": {
                "inherits": "^2.0.1",
                "safe-buffer": "^5.0.1"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "arr-union": "^3.1.0",
                "define-property": "^0.2.5",
                "isobject": "^3.0.0",
                "static-extend": "^0.1.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/class-utils/node_modules/define-property": {
            "version": "0.2.5",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
            "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
            "dependencies": {
                "is-descriptor": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "source-map": "~0.6.0"
            },
            "engines": {
                "node": ">= 4.0"
            }
        },
        "node_modules/clean-stack": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
            "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/cli-cursor": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
            "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
            "dependencies": {
                "restore-cursor": "^3.1.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/cli-width": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
            "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
            "engines": {
                "node": ">= 10"
            }
        },
        "node_modules/cliui": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
            "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
            "dependencies": {
                "string-width": "^3.1.0",
                "strip-ansi": "^5.2.0",
                "wrap-ansi": "^5.1.0"
            }
        },
        "node_modules/cliui/node_modules/emoji-regex": {
            "version": "7.0.3",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
            "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
        },
        "node_modules/cliui/node_modules/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=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/cliui/node_modules/string-width": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
            "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
            "dependencies": {
                "emoji-regex": "^7.0.1",
                "is-fullwidth-code-point": "^2.0.0",
                "strip-ansi": "^5.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/clone-deep": {
            "version": "0.2.4",
            "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
            "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=",
            "dependencies": {
                "for-own": "^0.1.3",
                "is-plain-object": "^2.0.1",
                "kind-of": "^3.0.2",
                "lazy-cache": "^1.0.3",
                "shallow-clone": "^0.1.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/clsx": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz",
            "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/co": {
            "version": "4.6.0",
            "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
            "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
            "engines": {
                "iojs": ">= 1.0.0",
                "node": ">= 0.12.0"
            }
        },
        "node_modules/coa": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
            "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
            "dependencies": {
                "@types/q": "^1.5.1",
                "chalk": "^2.4.1",
                "q": "^1.1.2"
            },
            "engines": {
                "node": ">= 4.0"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/collection-visit": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
            "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
            "dependencies": {
                "map-visit": "^1.0.0",
                "object-visit": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/color": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
            "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
            "dependencies": {
                "color-convert": "^1.9.1",
                "color-string": "^1.5.2"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "color-name": "1.1.3"
            }
        },
        "node_modules/color-name": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
            "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
        },
        "node_modules/color-string": {
            "version": "1.6.0",
            "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz",
            "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==",
            "dependencies": {
                "color-name": "^1.0.0",
                "simple-swizzle": "^0.2.2"
            }
        },
        "node_modules/colorette": {
            "version": "1.2.1",
            "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
            "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw=="
        },
        "node_modules/combined-stream": {
            "version": "1.0.8",
            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
            "dependencies": {
                "delayed-stream": "~1.0.0"
            },
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/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=="
        },
        "node_modules/common-tags": {
            "version": "1.8.0",
            "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
            "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/commondir": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
            "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
        },
        "node_modules/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=="
        },
        "node_modules/compose-function": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz",
            "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=",
            "dependencies": {
                "arity-n": "^1.0.4"
            }
        },
        "node_modules/compressible": {
            "version": "2.0.18",
            "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
            "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
            "dependencies": {
                "mime-db": ">= 1.43.0 < 2"
            },
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/compression": {
            "version": "1.7.4",
            "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
            "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/compression/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/compression/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/concat-map": {
            "version": "0.0.1",
            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
        },
        "node_modules/concat-stream": {
            "version": "1.6.2",
            "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
            "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
            "engines": [
                "node >= 0.8"
            ],
            "dependencies": {
                "buffer-from": "^1.0.0",
                "inherits": "^2.0.3",
                "readable-stream": "^2.2.2",
                "typedarray": "^0.0.6"
            }
        },
        "node_modules/concat-stream/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/concat-stream/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/concat-stream/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/confusing-browser-globals": {
            "version": "1.0.9",
            "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
            "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw=="
        },
        "node_modules/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==",
            "engines": {
                "node": ">=0.8"
            }
        },
        "node_modules/console-browserify": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
            "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
        },
        "node_modules/constants-browserify": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
            "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
        },
        "node_modules/contains-path": {
            "version": "0.1.0",
            "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
            "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/content-disposition": {
            "version": "0.5.3",
            "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
            "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
            "dependencies": {
                "safe-buffer": "5.1.2"
            },
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.1"
            }
        },
        "node_modules/cookie": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
            "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/cookie-signature": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
            "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
        },
        "node_modules/copy-concurrently": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
            "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/copy-descriptor": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
            "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/core-js": {
            "version": "3.6.5",
            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
            "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==",
            "hasInstallScript": true,
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/core-js"
            }
        },
        "node_modules/core-js-compat": {
            "version": "3.6.5",
            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
            "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
            "dependencies": {
                "browserslist": "^4.8.5",
                "semver": "7.0.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/core-js"
            }
        },
        "node_modules/core-js-compat/node_modules/semver": {
            "version": "7.0.0",
            "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
            "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
            "bin": {
                "semver": "bin/semver.js"
            }
        },
        "node_modules/core-js-pure": {
            "version": "3.6.5",
            "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz",
            "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==",
            "hasInstallScript": true,
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/core-js"
            }
        },
        "node_modules/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="
        },
        "node_modules/cosmiconfig": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
            "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
            "dependencies": {
                "import-fresh": "^2.0.0",
                "is-directory": "^0.3.1",
                "js-yaml": "^3.13.1",
                "parse-json": "^4.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/create-ecdh": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
            "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
            "dependencies": {
                "bn.js": "^4.1.0",
                "elliptic": "^6.0.0"
            }
        },
        "node_modules/create-ecdh/node_modules/bn.js": {
            "version": "4.11.9",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
        },
        "node_modules/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==",
            "dependencies": {
                "cipher-base": "^1.0.1",
                "inherits": "^2.0.1",
                "md5.js": "^1.3.4",
                "ripemd160": "^2.0.1",
                "sha.js": "^2.4.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/cross-spawn": {
            "version": "6.0.5",
            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
            "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
            "dependencies": {
                "nice-try": "^1.0.4",
                "path-key": "^2.0.1",
                "semver": "^5.5.0",
                "shebang-command": "^1.2.0",
                "which": "^1.2.9"
            },
            "engines": {
                "node": ">=4.8"
            }
        },
        "node_modules/cross-spawn/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": "*"
            }
        },
        "node_modules/css": {
            "version": "2.2.4",
            "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
            "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
            "dependencies": {
                "inherits": "^2.0.3",
                "source-map": "^0.6.1",
                "source-map-resolve": "^0.5.2",
                "urix": "^0.1.0"
            }
        },
        "node_modules/css-blank-pseudo": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
            "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
            "dependencies": {
                "postcss": "^7.0.5"
            },
            "bin": {
                "css-blank-pseudo": "cli.js"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": "*"
            }
        },
        "node_modules/css-declaration-sorter": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
            "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
            "dependencies": {
                "postcss": "^7.0.1",
                "timsort": "^0.3.0"
            },
            "engines": {
                "node": ">4"
            }
        },
        "node_modules/css-has-pseudo": {
            "version": "0.10.0",
            "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
            "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
            "dependencies": {
                "postcss": "^7.0.6",
                "postcss-selector-parser": "^5.0.0-rc.4"
            },
            "bin": {
                "css-has-pseudo": "cli.js"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/css-has-pseudo/node_modules/cssesc": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
            "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
            "bin": {
                "cssesc": "bin/cssesc"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
            "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
            "dependencies": {
                "cssesc": "^2.0.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/css-loader": {
            "version": "3.4.2",
            "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz",
            "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==",
            "dependencies": {
                "camelcase": "^5.3.1",
                "cssesc": "^3.0.0",
                "icss-utils": "^4.1.1",
                "loader-utils": "^1.2.3",
                "normalize-path": "^3.0.0",
                "postcss": "^7.0.23",
                "postcss-modules-extract-imports": "^2.0.0",
                "postcss-modules-local-by-default": "^3.0.2",
                "postcss-modules-scope": "^2.1.1",
                "postcss-modules-values": "^3.0.0",
                "postcss-value-parser": "^4.0.2",
                "schema-utils": "^2.6.0"
            },
            "engines": {
                "node": ">= 8.9.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/webpack"
            },
            "peerDependencies": {
                "webpack": "^4.0.0 || ^5.0.0"
            }
        },
        "node_modules/css-loader/node_modules/normalize-path": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/css-prefers-color-scheme": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
            "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
            "dependencies": {
                "postcss": "^7.0.5"
            },
            "bin": {
                "css-prefers-color-scheme": "cli.js"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/css-select": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
            "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
            "dependencies": {
                "boolbase": "^1.0.0",
                "css-what": "^3.2.1",
                "domutils": "^1.7.0",
                "nth-check": "^1.0.2"
            }
        },
        "node_modules/css-select-base-adapter": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
            "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
        },
        "node_modules/css-tree": {
            "version": "1.0.0-alpha.37",
            "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
            "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
            "dependencies": {
                "mdn-data": "2.0.4",
                "source-map": "^0.6.1"
            },
            "engines": {
                "node": ">=8.0.0"
            }
        },
        "node_modules/css-vendor": {
            "version": "2.0.8",
            "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz",
            "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==",
            "dependencies": {
                "@babel/runtime": "^7.8.3",
                "is-in-browser": "^1.0.2"
            }
        },
        "node_modules/css-what": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
            "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/css.escape": {
            "version": "1.5.1",
            "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
            "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
        },
        "node_modules/cssdb": {
            "version": "4.4.0",
            "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz",
            "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ=="
        },
        "node_modules/cssesc": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
            "bin": {
                "cssesc": "bin/cssesc"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/cssnano": {
            "version": "4.1.10",
            "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
            "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
            "dependencies": {
                "cosmiconfig": "^5.0.0",
                "cssnano-preset-default": "^4.0.7",
                "is-resolvable": "^1.0.0",
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/cssnano-preset-default": {
            "version": "4.0.7",
            "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
            "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
            "dependencies": {
                "css-declaration-sorter": "^4.0.1",
                "cssnano-util-raw-cache": "^4.0.1",
                "postcss": "^7.0.0",
                "postcss-calc": "^7.0.1",
                "postcss-colormin": "^4.0.3",
                "postcss-convert-values": "^4.0.1",
                "postcss-discard-comments": "^4.0.2",
                "postcss-discard-duplicates": "^4.0.2",
                "postcss-discard-empty": "^4.0.1",
                "postcss-discard-overridden": "^4.0.1",
                "postcss-merge-longhand": "^4.0.11",
                "postcss-merge-rules": "^4.0.3",
                "postcss-minify-font-values": "^4.0.2",
                "postcss-minify-gradients": "^4.0.2",
                "postcss-minify-params": "^4.0.2",
                "postcss-minify-selectors": "^4.0.2",
                "postcss-normalize-charset": "^4.0.1",
                "postcss-normalize-display-values": "^4.0.2",
                "postcss-normalize-positions": "^4.0.2",
                "postcss-normalize-repeat-style": "^4.0.2",
                "postcss-normalize-string": "^4.0.2",
                "postcss-normalize-timing-functions": "^4.0.2",
                "postcss-normalize-unicode": "^4.0.1",
                "postcss-normalize-url": "^4.0.1",
                "postcss-normalize-whitespace": "^4.0.2",
                "postcss-ordered-values": "^4.1.2",
                "postcss-reduce-initial": "^4.0.3",
                "postcss-reduce-transforms": "^4.0.2",
                "postcss-svgo": "^4.0.2",
                "postcss-unique-selectors": "^4.0.1"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/cssnano-util-get-arguments": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
            "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/cssnano-util-get-match": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
            "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/cssnano-util-raw-cache": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
            "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
            "dependencies": {
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/cssnano-util-same-parent": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
            "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/csso": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
            "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
            "dependencies": {
                "css-tree": "1.0.0-alpha.39"
            },
            "engines": {
                "node": ">=8.0.0"
            }
        },
        "node_modules/csso/node_modules/css-tree": {
            "version": "1.0.0-alpha.39",
            "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
            "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
            "dependencies": {
                "mdn-data": "2.0.6",
                "source-map": "^0.6.1"
            },
            "engines": {
                "node": ">=8.0.0"
            }
        },
        "node_modules/csso/node_modules/mdn-data": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
            "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA=="
        },
        "node_modules/cssom": {
            "version": "0.3.8",
            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
            "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
        },
        "node_modules/cssstyle": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
            "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
            "dependencies": {
                "cssom": "0.3.x"
            }
        },
        "node_modules/csstype": {
            "version": "2.6.13",
            "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.13.tgz",
            "integrity": "sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A=="
        },
        "node_modules/cyclist": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
            "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
        },
        "node_modules/d": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
            "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
            "dependencies": {
                "es5-ext": "^0.10.50",
                "type": "^1.0.1"
            }
        },
        "node_modules/damerau-levenshtein": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
            "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
        },
        "node_modules/dashdash": {
            "version": "1.14.1",
            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
            "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
            "dependencies": {
                "assert-plus": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10"
            }
        },
        "node_modules/data-urls": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
            "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
            "dependencies": {
                "abab": "^2.0.0",
                "whatwg-mimetype": "^2.2.0",
                "whatwg-url": "^7.0.0"
            }
        },
        "node_modules/data-urls/node_modules/whatwg-url": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
            "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
            "dependencies": {
                "lodash.sortby": "^4.7.0",
                "tr46": "^1.0.1",
                "webidl-conversions": "^4.0.2"
            }
        },
        "node_modules/debug": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
            "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
            "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
            "dependencies": {
                "ms": "^2.1.1"
            }
        },
        "node_modules/decamelize": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
            "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/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="
        },
        "node_modules/default-gateway": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
            "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
            "dependencies": {
                "execa": "^1.0.0",
                "ip-regex": "^2.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "object-keys": "^1.0.12"
            },
            "engines": {
                "node": ">= 0.4"
            }
        },
        "node_modules/define-property": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
            "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
            "dependencies": {
                "is-descriptor": "^1.0.2",
                "isobject": "^3.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/define-property/node_modules/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==",
            "dependencies": {
                "kind-of": "^6.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/define-property/node_modules/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==",
            "dependencies": {
                "kind-of": "^6.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/define-property/node_modules/is-descriptor": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
            "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
            "dependencies": {
                "is-accessor-descriptor": "^1.0.0",
                "is-data-descriptor": "^1.0.0",
                "kind-of": "^6.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/define-property/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/del": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
            "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
            "dependencies": {
                "@types/glob": "^7.1.1",
                "globby": "^6.1.0",
                "is-path-cwd": "^2.0.0",
                "is-path-in-cwd": "^2.0.0",
                "p-map": "^2.0.0",
                "pify": "^4.0.1",
                "rimraf": "^2.6.3"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/del/node_modules/globby": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
            "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
            "dependencies": {
                "array-union": "^1.0.1",
                "glob": "^7.0.3",
                "object-assign": "^4.0.1",
                "pify": "^2.0.0",
                "pinkie-promise": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/del/node_modules/globby/node_modules/pify": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
            "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/del/node_modules/p-map": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
            "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/del/node_modules/pify": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
            "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/delayed-stream": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
            "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/depd": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
            "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/des.js": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
            "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
            "dependencies": {
                "inherits": "^2.0.1",
                "minimalistic-assert": "^1.0.0"
            }
        },
        "node_modules/destroy": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
            "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
        },
        "node_modules/detect-newline": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
            "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/detect-node": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
            "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw=="
        },
        "node_modules/detect-port-alt": {
            "version": "1.1.6",
            "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
            "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
            "dependencies": {
                "address": "^1.0.1",
                "debug": "^2.6.0"
            },
            "bin": {
                "detect": "bin/detect-port",
                "detect-port": "bin/detect-port"
            },
            "engines": {
                "node": ">= 4.2.1"
            }
        },
        "node_modules/detect-port-alt/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/detect-port-alt/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/diff-sequences": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
            "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/diffie-hellman": {
            "version": "5.0.3",
            "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
            "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
            "dependencies": {
                "bn.js": "^4.1.0",
                "miller-rabin": "^4.0.0",
                "randombytes": "^2.0.0"
            }
        },
        "node_modules/diffie-hellman/node_modules/bn.js": {
            "version": "4.11.9",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
        },
        "node_modules/dir-glob": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
            "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
            "dependencies": {
                "arrify": "^1.0.1",
                "path-type": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/dns-equal": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
            "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
        },
        "node_modules/dns-packet": {
            "version": "1.3.4",
            "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
            "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
            "dependencies": {
                "ip": "^1.1.0",
                "safe-buffer": "^5.0.1"
            }
        },
        "node_modules/dns-txt": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
            "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
            "dependencies": {
                "buffer-indexof": "^1.0.0"
            }
        },
        "node_modules/doctrine": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
            "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
            "dependencies": {
                "esutils": "^2.0.2"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/dom-accessibility-api": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz",
            "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA=="
        },
        "node_modules/dom-converter": {
            "version": "0.2.0",
            "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
            "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
            "dependencies": {
                "utila": "~0.4"
            }
        },
        "node_modules/dom-helpers": {
            "version": "5.1.4",
            "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz",
            "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==",
            "dependencies": {
                "@babel/runtime": "^7.8.7",
                "csstype": "^2.6.7"
            }
        },
        "node_modules/dom-serializer": {
            "version": "0.2.2",
            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
            "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
            "dependencies": {
                "domelementtype": "^2.0.1",
                "entities": "^2.0.0"
            }
        },
        "node_modules/dom-serializer/node_modules/domelementtype": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
            "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ=="
        },
        "node_modules/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==",
            "engines": {
                "node": ">=0.4",
                "npm": ">=1.2"
            }
        },
        "node_modules/domelementtype": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
            "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
        },
        "node_modules/domexception": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
            "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
            "dependencies": {
                "webidl-conversions": "^4.0.2"
            }
        },
        "node_modules/domhandler": {
            "version": "4.2.2",
            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz",
            "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==",
            "dependencies": {
                "domelementtype": "^2.2.0"
            },
            "engines": {
                "node": ">= 4"
            },
            "funding": {
                "url": "https://github.com/fb55/domhandler?sponsor=1"
            }
        },
        "node_modules/domhandler/node_modules/domelementtype": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
            "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/fb55"
                }
            ]
        },
        "node_modules/domutils": {
            "version": "1.7.0",
            "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
            "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
            "dependencies": {
                "dom-serializer": "0",
                "domelementtype": "1"
            }
        },
        "node_modules/dot-case": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz",
            "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==",
            "dependencies": {
                "no-case": "^3.0.3",
                "tslib": "^1.10.0"
            }
        },
        "node_modules/dot-prop": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
            "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
            "dependencies": {
                "is-obj": "^2.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/dotenv": {
            "version": "8.2.0",
            "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
            "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/dotenv-expand": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
            "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
        },
        "node_modules/duplexer": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
            "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
        },
        "node_modules/duplexify": {
            "version": "3.7.1",
            "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
            "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
            "dependencies": {
                "end-of-stream": "^1.0.0",
                "inherits": "^2.0.1",
                "readable-stream": "^2.0.0",
                "stream-shift": "^1.0.0"
            }
        },
        "node_modules/duplexify/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/duplexify/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/duplexify/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/ecc-jsbn": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
            "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
            "dependencies": {
                "jsbn": "~0.1.0",
                "safer-buffer": "^2.1.0"
            }
        },
        "node_modules/ecdsa-sig-formatter": {
            "version": "1.0.11",
            "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
            "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
            "dependencies": {
                "safe-buffer": "^5.0.1"
            }
        },
        "node_modules/ee-first": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
            "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
        },
        "node_modules/electron-to-chromium": {
            "version": "1.3.873",
            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.873.tgz",
            "integrity": "sha512-TiHlCgl2uP26Z0c67u442c0a2MZCWZNCRnPTQDPhVJ4h9G6z2zU0lApD9H0K9R5yFL5SfdaiVsVD2izOY24xBQ=="
        },
        "node_modules/elliptic": {
            "version": "6.5.4",
            "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
            "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
            "dependencies": {
                "bn.js": "^4.11.9",
                "brorand": "^1.1.0",
                "hash.js": "^1.0.0",
                "hmac-drbg": "^1.0.1",
                "inherits": "^2.0.4",
                "minimalistic-assert": "^1.0.1",
                "minimalistic-crypto-utils": "^1.0.1"
            }
        },
        "node_modules/elliptic/node_modules/bn.js": {
            "version": "4.11.9",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
        },
        "node_modules/emoji-regex": {
            "version": "8.0.0",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
        },
        "node_modules/emojis-list": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
            "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/encodeurl": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
            "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "once": "^1.4.0"
            }
        },
        "node_modules/enhanced-resolve": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
            "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
            "dependencies": {
                "graceful-fs": "^4.1.2",
                "memory-fs": "^0.5.0",
                "tapable": "^1.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/enhanced-resolve/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/enhanced-resolve/node_modules/memory-fs": {
            "version": "0.5.0",
            "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
            "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
            "dependencies": {
                "errno": "^0.1.3",
                "readable-stream": "^2.0.1"
            },
            "engines": {
                "node": ">=4.3.0 <5.0.0 || >=5.10"
            }
        },
        "node_modules/enhanced-resolve/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/enhanced-resolve/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/entities": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
            "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
        },
        "node_modules/errno": {
            "version": "0.1.7",
            "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
            "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
            "dependencies": {
                "prr": "~1.0.1"
            },
            "bin": {
                "errno": "cli.js"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "is-arrayish": "^0.2.1"
            }
        },
        "node_modules/es-abstract": {
            "version": "1.17.6",
            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
            "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
            "dependencies": {
                "es-to-primitive": "^1.2.1",
                "function-bind": "^1.1.1",
                "has": "^1.0.3",
                "has-symbols": "^1.0.1",
                "is-callable": "^1.2.0",
                "is-regex": "^1.1.0",
                "object-inspect": "^1.7.0",
                "object-keys": "^1.1.1",
                "object.assign": "^4.1.0",
                "string.prototype.trimend": "^1.0.1",
                "string.prototype.trimstart": "^1.0.1"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "is-callable": "^1.1.4",
                "is-date-object": "^1.0.1",
                "is-symbol": "^1.0.2"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/es5-ext": {
            "version": "0.10.53",
            "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
            "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
            "dependencies": {
                "es6-iterator": "~2.0.3",
                "es6-symbol": "~3.1.3",
                "next-tick": "~1.0.0"
            }
        },
        "node_modules/es6-iterator": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
            "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
            "dependencies": {
                "d": "1",
                "es5-ext": "^0.10.35",
                "es6-symbol": "^3.1.1"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "d": "^1.0.1",
                "ext": "^1.1.2"
            }
        },
        "node_modules/escalade": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/escape-html": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
            "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.8.0"
            }
        },
        "node_modules/escodegen": {
            "version": "1.14.3",
            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
            "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
            "dependencies": {
                "esprima": "^4.0.1",
                "estraverse": "^4.2.0",
                "esutils": "^2.0.2",
                "optionator": "^0.8.1"
            },
            "bin": {
                "escodegen": "bin/escodegen.js",
                "esgenerate": "bin/esgenerate.js"
            },
            "engines": {
                "node": ">=4.0"
            },
            "optionalDependencies": {
                "source-map": "~0.6.1"
            }
        },
        "node_modules/eslint": {
            "version": "6.8.0",
            "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
            "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
            "dependencies": {
                "@babel/code-frame": "^7.0.0",
                "ajv": "^6.10.0",
                "chalk": "^2.1.0",
                "cross-spawn": "^6.0.5",
                "debug": "^4.0.1",
                "doctrine": "^3.0.0",
                "eslint-scope": "^5.0.0",
                "eslint-utils": "^1.4.3",
                "eslint-visitor-keys": "^1.1.0",
                "espree": "^6.1.2",
                "esquery": "^1.0.1",
                "esutils": "^2.0.2",
                "file-entry-cache": "^5.0.1",
                "functional-red-black-tree": "^1.0.1",
                "glob-parent": "^5.0.0",
                "globals": "^12.1.0",
                "ignore": "^4.0.6",
                "import-fresh": "^3.0.0",
                "imurmurhash": "^0.1.4",
                "inquirer": "^7.0.0",
                "is-glob": "^4.0.0",
                "js-yaml": "^3.13.1",
                "json-stable-stringify-without-jsonify": "^1.0.1",
                "levn": "^0.3.0",
                "lodash": "^4.17.14",
                "minimatch": "^3.0.4",
                "mkdirp": "^0.5.1",
                "natural-compare": "^1.4.0",
                "optionator": "^0.8.3",
                "progress": "^2.0.0",
                "regexpp": "^2.0.1",
                "semver": "^6.1.2",
                "strip-ansi": "^5.2.0",
                "strip-json-comments": "^3.0.1",
                "table": "^5.2.3",
                "text-table": "^0.2.0",
                "v8-compile-cache": "^2.0.3"
            },
            "bin": {
                "eslint": "bin/eslint.js"
            },
            "engines": {
                "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
            },
            "funding": {
                "url": "https://opencollective.com/eslint"
            }
        },
        "node_modules/eslint-config-react-app": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz",
            "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==",
            "dependencies": {
                "confusing-browser-globals": "^1.0.9"
            },
            "peerDependencies": {
                "@typescript-eslint/eslint-plugin": "2.x",
                "@typescript-eslint/parser": "2.x",
                "babel-eslint": "10.x",
                "eslint": "6.x",
                "eslint-plugin-flowtype": "3.x || 4.x",
                "eslint-plugin-import": "2.x",
                "eslint-plugin-jsx-a11y": "6.x",
                "eslint-plugin-react": "7.x",
                "eslint-plugin-react-hooks": "1.x || 2.x"
            }
        },
        "node_modules/eslint-import-resolver-node": {
            "version": "0.3.4",
            "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
            "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
            "dependencies": {
                "debug": "^2.6.9",
                "resolve": "^1.13.1"
            }
        },
        "node_modules/eslint-import-resolver-node/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/eslint-import-resolver-node/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/eslint-loader": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz",
            "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==",
            "deprecated": "This loader has been deprecated. Please use eslint-webpack-plugin",
            "dependencies": {
                "fs-extra": "^8.1.0",
                "loader-fs-cache": "^1.0.2",
                "loader-utils": "^1.2.3",
                "object-hash": "^2.0.1",
                "schema-utils": "^2.6.1"
            },
            "engines": {
                "node": ">= 8.9.0"
            },
            "peerDependencies": {
                "eslint": "^5.0.0 || ^6.0.0",
                "webpack": "^4.0.0 || ^5.0.0"
            }
        },
        "node_modules/eslint-module-utils": {
            "version": "2.6.0",
            "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
            "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
            "dependencies": {
                "debug": "^2.6.9",
                "pkg-dir": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-module-utils/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/eslint-module-utils/node_modules/find-up": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
            "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
            "dependencies": {
                "locate-path": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-module-utils/node_modules/locate-path": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
            "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
            "dependencies": {
                "p-locate": "^2.0.0",
                "path-exists": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-module-utils/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/eslint-module-utils/node_modules/p-limit": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
            "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
            "dependencies": {
                "p-try": "^1.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-module-utils/node_modules/p-locate": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
            "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
            "dependencies": {
                "p-limit": "^1.1.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-module-utils/node_modules/p-try": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
            "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-module-utils/node_modules/pkg-dir": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
            "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
            "dependencies": {
                "find-up": "^2.1.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-flowtype": {
            "version": "4.6.0",
            "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz",
            "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==",
            "dependencies": {
                "lodash": "^4.17.15"
            },
            "engines": {
                "node": ">=4"
            },
            "peerDependencies": {
                "eslint": ">=6.1.0"
            }
        },
        "node_modules/eslint-plugin-import": {
            "version": "2.20.1",
            "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz",
            "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==",
            "dependencies": {
                "array-includes": "^3.0.3",
                "array.prototype.flat": "^1.2.1",
                "contains-path": "^0.1.0",
                "debug": "^2.6.9",
                "doctrine": "1.5.0",
                "eslint-import-resolver-node": "^0.3.2",
                "eslint-module-utils": "^2.4.1",
                "has": "^1.0.3",
                "minimatch": "^3.0.4",
                "object.values": "^1.1.0",
                "read-pkg-up": "^2.0.0",
                "resolve": "^1.12.0"
            },
            "engines": {
                "node": ">=4"
            },
            "peerDependencies": {
                "eslint": "2.x - 6.x"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/doctrine": {
            "version": "1.5.0",
            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
            "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
            "dependencies": {
                "esutils": "^2.0.2",
                "isarray": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/find-up": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
            "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
            "dependencies": {
                "locate-path": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/eslint-plugin-import/node_modules/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=",
            "dependencies": {
                "graceful-fs": "^4.1.2",
                "parse-json": "^2.2.0",
                "pify": "^2.0.0",
                "strip-bom": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/locate-path": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
            "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
            "dependencies": {
                "p-locate": "^2.0.0",
                "path-exists": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/eslint-plugin-import/node_modules/p-limit": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
            "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
            "dependencies": {
                "p-try": "^1.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/p-locate": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
            "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
            "dependencies": {
                "p-limit": "^1.1.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/p-try": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
            "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/parse-json": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
            "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
            "dependencies": {
                "error-ex": "^1.2.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/path-type": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
            "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
            "dependencies": {
                "pify": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/pify": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
            "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/read-pkg": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
            "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
            "dependencies": {
                "load-json-file": "^2.0.0",
                "normalize-package-data": "^2.3.2",
                "path-type": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-import/node_modules/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=",
            "dependencies": {
                "find-up": "^2.0.0",
                "read-pkg": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint-plugin-jsx-a11y": {
            "version": "6.2.3",
            "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz",
            "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==",
            "dependencies": {
                "@babel/runtime": "^7.4.5",
                "aria-query": "^3.0.0",
                "array-includes": "^3.0.3",
                "ast-types-flow": "^0.0.7",
                "axobject-query": "^2.0.2",
                "damerau-levenshtein": "^1.0.4",
                "emoji-regex": "^7.0.2",
                "has": "^1.0.3",
                "jsx-ast-utils": "^2.2.1"
            },
            "engines": {
                "node": ">=4.0"
            },
            "peerDependencies": {
                "eslint": "^3 || ^4 || ^5 || ^6"
            }
        },
        "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz",
            "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=",
            "dependencies": {
                "ast-types-flow": "0.0.7",
                "commander": "^2.11.0"
            }
        },
        "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": {
            "version": "7.0.3",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
            "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=4"
            },
            "peerDependencies": {
                "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
            }
        },
        "node_modules/eslint-plugin-react-hooks": {
            "version": "1.7.0",
            "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
            "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==",
            "engines": {
                "node": ">=7"
            },
            "peerDependencies": {
                "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
            }
        },
        "node_modules/eslint-plugin-react/node_modules/doctrine": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
            "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
            "dependencies": {
                "esutils": "^2.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/eslint-plugin-react/node_modules/resolve": {
            "version": "1.17.0",
            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
            "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
            "dependencies": {
                "path-parse": "^1.0.6"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/eslint-scope": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
            "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
            "dependencies": {
                "esrecurse": "^4.1.0",
                "estraverse": "^4.1.1"
            },
            "engines": {
                "node": ">=8.0.0"
            }
        },
        "node_modules/eslint-utils": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
            "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
            "dependencies": {
                "eslint-visitor-keys": "^1.1.0"
            },
            "engines": {
                "node": ">=6"
            },
            "funding": {
                "url": "https://github.com/sponsors/mysticatea"
            }
        },
        "node_modules/eslint-visitor-keys": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
            "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/eslint/node_modules/eslint-utils": {
            "version": "1.4.3",
            "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
            "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
            "dependencies": {
                "eslint-visitor-keys": "^1.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/eslint/node_modules/globals": {
            "version": "12.4.0",
            "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
            "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
            "dependencies": {
                "type-fest": "^0.8.1"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/eslint/node_modules/import-fresh": {
            "version": "3.2.1",
            "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
            "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
            "dependencies": {
                "parent-module": "^1.0.0",
                "resolve-from": "^4.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/eslint/node_modules/regexpp": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
            "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
            "engines": {
                "node": ">=6.5.0"
            }
        },
        "node_modules/eslint/node_modules/resolve-from": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
            "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/espree": {
            "version": "6.2.1",
            "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
            "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
            "dependencies": {
                "acorn": "^7.1.1",
                "acorn-jsx": "^5.2.0",
                "eslint-visitor-keys": "^1.1.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/esprima": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
            "bin": {
                "esparse": "bin/esparse.js",
                "esvalidate": "bin/esvalidate.js"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/esquery": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
            "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
            "dependencies": {
                "estraverse": "^5.1.0"
            },
            "engines": {
                "node": ">=0.10"
            }
        },
        "node_modules/esquery/node_modules/estraverse": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
            "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
            "engines": {
                "node": ">=4.0"
            }
        },
        "node_modules/esrecurse": {
            "version": "4.2.1",
            "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
            "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
            "dependencies": {
                "estraverse": "^4.1.0"
            },
            "engines": {
                "node": ">=4.0"
            }
        },
        "node_modules/estraverse": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
            "engines": {
                "node": ">=4.0"
            }
        },
        "node_modules/esutils": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/etag": {
            "version": "1.8.1",
            "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
            "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/eventemitter3": {
            "version": "4.0.4",
            "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
            "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ=="
        },
        "node_modules/events": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
            "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
            "engines": {
                "node": ">=0.8.x"
            }
        },
        "node_modules/eventsource": {
            "version": "1.0.7",
            "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
            "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
            "dependencies": {
                "original": "^1.0.0"
            },
            "engines": {
                "node": ">=0.12.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "md5.js": "^1.3.4",
                "safe-buffer": "^5.1.1"
            }
        },
        "node_modules/exec-sh": {
            "version": "0.3.4",
            "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
            "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A=="
        },
        "node_modules/execa": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
            "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
            "dependencies": {
                "cross-spawn": "^6.0.0",
                "get-stream": "^4.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"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/exit": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
            "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/expand-brackets": {
            "version": "2.1.4",
            "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
            "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/expand-brackets/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/expand-brackets/node_modules/define-property": {
            "version": "0.2.5",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
            "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
            "dependencies": {
                "is-descriptor": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/expand-brackets/node_modules/extend-shallow": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
            "dependencies": {
                "is-extendable": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/expand-brackets/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/expect": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
            "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "ansi-styles": "^3.2.0",
                "jest-get-type": "^24.9.0",
                "jest-matcher-utils": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-regex-util": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/express": {
            "version": "4.17.1",
            "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
            "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">= 0.10.0"
            }
        },
        "node_modules/express/node_modules/array-flatten": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
            "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
        },
        "node_modules/express/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/express/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/express/node_modules/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="
        },
        "node_modules/express/node_modules/qs": {
            "version": "6.7.0",
            "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
            "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
            "engines": {
                "node": ">=0.6"
            }
        },
        "node_modules/ext": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
            "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
            "dependencies": {
                "type": "^2.0.0"
            }
        },
        "node_modules/ext/node_modules/type": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
            "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
        },
        "node_modules/extend": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
            "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
        },
        "node_modules/extend-shallow": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
            "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
            "dependencies": {
                "assign-symbols": "^1.0.0",
                "is-extendable": "^1.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/extend-shallow/node_modules/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==",
            "dependencies": {
                "is-plain-object": "^2.0.4"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/external-editor": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
            "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
            "dependencies": {
                "chardet": "^0.7.0",
                "iconv-lite": "^0.4.24",
                "tmp": "^0.0.33"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/extglob": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
            "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/extglob/node_modules/define-property": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
            "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
            "dependencies": {
                "is-descriptor": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/extglob/node_modules/extend-shallow": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
            "dependencies": {
                "is-extendable": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/extglob/node_modules/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==",
            "dependencies": {
                "kind-of": "^6.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/extglob/node_modules/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==",
            "dependencies": {
                "kind-of": "^6.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/extglob/node_modules/is-descriptor": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
            "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
            "dependencies": {
                "is-accessor-descriptor": "^1.0.0",
                "is-data-descriptor": "^1.0.0",
                "kind-of": "^6.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/extglob/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/extsprintf": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
            "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
            "engines": [
                "node >=0.6.0"
            ]
        },
        "node_modules/fast-deep-equal": {
            "version": "3.1.3",
            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
        },
        "node_modules/fast-glob": {
            "version": "2.2.7",
            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
            "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
            "dependencies": {
                "@mrmlnc/readdir-enhanced": "^2.2.1",
                "@nodelib/fs.stat": "^1.1.2",
                "glob-parent": "^3.1.0",
                "is-glob": "^4.0.0",
                "merge2": "^1.2.3",
                "micromatch": "^3.1.10"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/fast-glob/node_modules/glob-parent": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
            "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
            "dependencies": {
                "is-glob": "^3.1.0",
                "path-dirname": "^1.0.0"
            }
        },
        "node_modules/fast-glob/node_modules/glob-parent/node_modules/is-glob": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
            "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
            "dependencies": {
                "is-extglob": "^2.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/fast-levenshtein": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
            "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
        },
        "node_modules/faye-websocket": {
            "version": "0.10.0",
            "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
            "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
            "dependencies": {
                "websocket-driver": ">=0.5.1"
            },
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/fb-watchman": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
            "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
            "dependencies": {
                "bser": "2.1.1"
            }
        },
        "node_modules/figgy-pudding": {
            "version": "3.5.2",
            "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
            "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
        },
        "node_modules/figures": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
            "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
            "dependencies": {
                "escape-string-regexp": "^1.0.5"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/file-entry-cache": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
            "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
            "dependencies": {
                "flat-cache": "^2.0.1"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/file-loader": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
            "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==",
            "dependencies": {
                "loader-utils": "^1.2.3",
                "schema-utils": "^2.5.0"
            },
            "engines": {
                "node": ">= 8.9.0"
            },
            "peerDependencies": {
                "webpack": "^4.0.0"
            }
        },
        "node_modules/filesize": {
            "version": "6.0.1",
            "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz",
            "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==",
            "engines": {
                "node": ">= 0.4.0"
            }
        },
        "node_modules/fill-range": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
            "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
            "dependencies": {
                "extend-shallow": "^2.0.1",
                "is-number": "^3.0.0",
                "repeat-string": "^1.6.1",
                "to-regex-range": "^2.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/fill-range/node_modules/extend-shallow": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
            "dependencies": {
                "is-extendable": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/finalhandler": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
            "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/finalhandler/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/finalhandler/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/find-cache-dir": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
            "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
            "dependencies": {
                "commondir": "^1.0.1",
                "make-dir": "^2.0.0",
                "pkg-dir": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/find-up": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
            "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
            "dependencies": {
                "locate-path": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/flat-cache": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
            "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
            "dependencies": {
                "flatted": "^2.0.0",
                "rimraf": "2.6.3",
                "write": "1.0.3"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/flatted": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
            "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
        },
        "node_modules/flatten": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
            "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==",
            "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash."
        },
        "node_modules/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==",
            "dependencies": {
                "inherits": "^2.0.3",
                "readable-stream": "^2.3.6"
            }
        },
        "node_modules/flush-write-stream/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/flush-write-stream/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/flush-write-stream/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/follow-redirects": {
            "version": "1.12.1",
            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz",
            "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==",
            "funding": [
                {
                    "type": "individual",
                    "url": "https://github.com/sponsors/RubenVerborgh"
                }
            ],
            "engines": {
                "node": ">=4.0"
            }
        },
        "node_modules/for-in": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
            "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/for-own": {
            "version": "0.1.5",
            "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
            "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
            "dependencies": {
                "for-in": "^1.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/forever-agent": {
            "version": "0.6.1",
            "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
            "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
            "engines": {
                "node": "*"
            }
        },
        "node_modules/fork-ts-checker-webpack-plugin": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz",
            "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==",
            "dependencies": {
                "babel-code-frame": "^6.22.0",
                "chalk": "^2.4.1",
                "chokidar": "^3.3.0",
                "micromatch": "^3.1.10",
                "minimatch": "^3.0.4",
                "semver": "^5.6.0",
                "tapable": "^1.0.0",
                "worker-rpc": "^0.1.0"
            },
            "engines": {
                "node": ">=6.11.5",
                "yarn": ">=1.0.0"
            }
        },
        "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "asynckit": "^0.4.0",
                "combined-stream": "^1.0.6",
                "mime-types": "^2.1.12"
            },
            "engines": {
                "node": ">= 0.12"
            }
        },
        "node_modules/forwarded": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
            "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/fragment-cache": {
            "version": "0.2.1",
            "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
            "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
            "dependencies": {
                "map-cache": "^0.2.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/fresh": {
            "version": "0.5.2",
            "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
            "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/from2": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
            "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
            "dependencies": {
                "inherits": "^2.0.1",
                "readable-stream": "^2.0.0"
            }
        },
        "node_modules/from2/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/from2/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/from2/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/fs-extra": {
            "version": "8.1.0",
            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
            "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
            "dependencies": {
                "graceful-fs": "^4.2.0",
                "jsonfile": "^4.0.0",
                "universalify": "^0.1.0"
            },
            "engines": {
                "node": ">=6 <7 || >=8"
            }
        },
        "node_modules/fs-minipass": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
            "dependencies": {
                "minipass": "^3.0.0"
            },
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "graceful-fs": "^4.1.2",
                "iferr": "^0.1.5",
                "imurmurhash": "^0.1.4",
                "readable-stream": "1 || 2"
            }
        },
        "node_modules/fs-write-stream-atomic/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/fs-write-stream-atomic/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/fs-write-stream-atomic/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/fs.realpath": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
            "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
        },
        "node_modules/fsevents": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
            "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
            "deprecated": "\"Please update to latest v2.3 or v2.2\"",
            "hasInstallScript": true,
            "optional": true,
            "os": [
                "darwin"
            ],
            "engines": {
                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
            }
        },
        "node_modules/function-bind": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
        },
        "node_modules/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="
        },
        "node_modules/gensync": {
            "version": "1.0.0-beta.1",
            "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
            "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/get-caller-file": {
            "version": "2.0.5",
            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
            "engines": {
                "node": "6.* || 8.* || >= 10.*"
            }
        },
        "node_modules/get-own-enumerable-property-symbols": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
            "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
        },
        "node_modules/get-stream": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
            "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
            "dependencies": {
                "pump": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/get-value": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
            "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/getpass": {
            "version": "0.1.7",
            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
            "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
            "dependencies": {
                "assert-plus": "^1.0.0"
            }
        },
        "node_modules/glob": {
            "version": "7.1.6",
            "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
            "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": "*"
            },
            "funding": {
                "url": "https://github.com/sponsors/isaacs"
            }
        },
        "node_modules/glob-parent": {
            "version": "5.1.2",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
            "dependencies": {
                "is-glob": "^4.0.1"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/glob-to-regexp": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
            "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs="
        },
        "node_modules/global-modules": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
            "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
            "dependencies": {
                "global-prefix": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/global-prefix": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
            "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
            "dependencies": {
                "ini": "^1.3.5",
                "kind-of": "^6.0.2",
                "which": "^1.3.1"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/global-prefix/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/globals": {
            "version": "11.12.0",
            "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
            "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/globby": {
            "version": "8.0.2",
            "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
            "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
            "dependencies": {
                "array-union": "^1.0.1",
                "dir-glob": "2.0.0",
                "fast-glob": "^2.0.2",
                "glob": "^7.1.2",
                "ignore": "^3.3.5",
                "pify": "^3.0.0",
                "slash": "^1.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/globby/node_modules/ignore": {
            "version": "3.3.10",
            "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
            "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
        },
        "node_modules/globby/node_modules/slash": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
            "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/graceful-fs": {
            "version": "4.2.4",
            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
            "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
        },
        "node_modules/growly": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
            "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
        },
        "node_modules/gzip-size": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
            "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
            "dependencies": {
                "duplexer": "^0.1.1",
                "pify": "^4.0.1"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/gzip-size/node_modules/pify": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
            "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/handle-thing": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
            "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
        },
        "node_modules/har-schema": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
            "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/har-validator": {
            "version": "5.1.5",
            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
            "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
            "deprecated": "this library is no longer supported",
            "dependencies": {
                "ajv": "^6.12.3",
                "har-schema": "^2.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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=="
        },
        "node_modules/has": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
            "dependencies": {
                "function-bind": "^1.1.1"
            },
            "engines": {
                "node": ">= 0.4.0"
            }
        },
        "node_modules/has-ansi": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
            "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
            "dependencies": {
                "ansi-regex": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/has-ansi/node_modules/ansi-regex": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/has-flag": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
            "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/has-value": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
            "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
            "dependencies": {
                "get-value": "^2.0.6",
                "has-values": "^1.0.0",
                "isobject": "^3.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "is-number": "^3.0.0",
                "kind-of": "^4.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/has-values/node_modules/kind-of": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
            "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
            "dependencies": {
                "is-buffer": "^1.1.5"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/hash-base": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
            "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
            "dependencies": {
                "inherits": "^2.0.4",
                "readable-stream": "^3.6.0",
                "safe-buffer": "^5.2.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/hash-base/node_modules/safe-buffer": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/feross"
                },
                {
                    "type": "patreon",
                    "url": "https://www.patreon.com/feross"
                },
                {
                    "type": "consulting",
                    "url": "https://feross.org/support"
                }
            ]
        },
        "node_modules/hash.js": {
            "version": "1.1.7",
            "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
            "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
            "dependencies": {
                "inherits": "^2.0.3",
                "minimalistic-assert": "^1.0.1"
            }
        },
        "node_modules/he": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
            "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
            "bin": {
                "he": "bin/he"
            }
        },
        "node_modules/hex-color-regex": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
            "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
        },
        "node_modules/history": {
            "version": "4.10.1",
            "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
            "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
            "dependencies": {
                "@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"
            }
        },
        "node_modules/hmac-drbg": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
            "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
            "dependencies": {
                "hash.js": "^1.0.3",
                "minimalistic-assert": "^1.0.0",
                "minimalistic-crypto-utils": "^1.0.1"
            }
        },
        "node_modules/hoist-non-react-statics": {
            "version": "3.3.2",
            "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
            "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
            "dependencies": {
                "react-is": "^16.7.0"
            }
        },
        "node_modules/hosted-git-info": {
            "version": "2.8.9",
            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
            "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
        },
        "node_modules/hpack.js": {
            "version": "2.1.6",
            "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
            "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
            "dependencies": {
                "inherits": "^2.0.1",
                "obuf": "^1.0.0",
                "readable-stream": "^2.0.1",
                "wbuf": "^1.1.0"
            }
        },
        "node_modules/hpack.js/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/hpack.js/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/hpack.js/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/hsl-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
            "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4="
        },
        "node_modules/hsla-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
            "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg="
        },
        "node_modules/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==",
            "dependencies": {
                "whatwg-encoding": "^1.0.1"
            }
        },
        "node_modules/html-entities": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
            "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA=="
        },
        "node_modules/html-escaper": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
            "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
        },
        "node_modules/html-minifier-terser": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
            "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
            "dependencies": {
                "camel-case": "^4.1.1",
                "clean-css": "^4.2.3",
                "commander": "^4.1.1",
                "he": "^1.2.0",
                "param-case": "^3.0.3",
                "relateurl": "^0.2.7",
                "terser": "^4.6.3"
            },
            "bin": {
                "html-minifier-terser": "cli.js"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/html-minifier-terser/node_modules/commander": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
            "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/html-webpack-plugin": {
            "version": "4.0.0-beta.11",
            "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz",
            "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==",
            "deprecated": "please switch to a stable version",
            "dependencies": {
                "html-minifier-terser": "^5.0.1",
                "loader-utils": "^1.2.3",
                "lodash": "^4.17.15",
                "pretty-error": "^2.1.1",
                "tapable": "^1.1.3",
                "util.promisify": "1.0.0"
            },
            "engines": {
                "node": ">=6.9"
            },
            "peerDependencies": {
                "webpack": "^4.0.0"
            }
        },
        "node_modules/html-webpack-plugin/node_modules/util.promisify": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
            "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
            "dependencies": {
                "define-properties": "^1.1.2",
                "object.getownpropertydescriptors": "^2.0.3"
            }
        },
        "node_modules/htmlparser2": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
            "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
            "funding": [
                "https://github.com/fb55/htmlparser2?sponsor=1",
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/fb55"
                }
            ],
            "dependencies": {
                "domelementtype": "^2.0.1",
                "domhandler": "^4.0.0",
                "domutils": "^2.5.2",
                "entities": "^2.0.0"
            }
        },
        "node_modules/htmlparser2/node_modules/dom-serializer": {
            "version": "1.3.2",
            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
            "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
            "dependencies": {
                "domelementtype": "^2.0.1",
                "domhandler": "^4.2.0",
                "entities": "^2.0.0"
            },
            "funding": {
                "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
            }
        },
        "node_modules/htmlparser2/node_modules/domelementtype": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
            "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/fb55"
                }
            ]
        },
        "node_modules/htmlparser2/node_modules/domutils": {
            "version": "2.8.0",
            "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
            "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
            "dependencies": {
                "dom-serializer": "^1.0.1",
                "domelementtype": "^2.2.0",
                "domhandler": "^4.2.0"
            },
            "funding": {
                "url": "https://github.com/fb55/domutils?sponsor=1"
            }
        },
        "node_modules/http-deceiver": {
            "version": "1.2.7",
            "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
            "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
        },
        "node_modules/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==",
            "dependencies": {
                "depd": "~1.1.2",
                "inherits": "2.0.3",
                "setprototypeof": "1.1.1",
                "statuses": ">= 1.5.0 < 2",
                "toidentifier": "1.0.0"
            },
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/http-errors/node_modules/inherits": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
            "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
        },
        "node_modules/http-parser-js": {
            "version": "0.5.2",
            "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
            "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ=="
        },
        "node_modules/http-proxy": {
            "version": "1.18.1",
            "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
            "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
            "dependencies": {
                "eventemitter3": "^4.0.0",
                "follow-redirects": "^1.0.0",
                "requires-port": "^1.0.0"
            },
            "engines": {
                "node": ">=8.0.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "http-proxy": "^1.17.0",
                "is-glob": "^4.0.0",
                "lodash": "^4.17.11",
                "micromatch": "^3.1.10"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/http-signature": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
            "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
            "dependencies": {
                "assert-plus": "^1.0.0",
                "jsprim": "^1.2.2",
                "sshpk": "^1.7.0"
            },
            "engines": {
                "node": ">=0.8",
                "npm": ">=1.3.7"
            }
        },
        "node_modules/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="
        },
        "node_modules/hyphenate-style-name": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
            "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
        },
        "node_modules/iconv-lite": {
            "version": "0.4.24",
            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
            "dependencies": {
                "safer-buffer": ">= 2.1.2 < 3"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/icss-utils": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
            "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
            "dependencies": {
                "postcss": "^7.0.14"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "harmony-reflect": "^1.4.6"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/ieee754": {
            "version": "1.1.13",
            "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
            "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
        },
        "node_modules/iferr": {
            "version": "0.1.5",
            "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
            "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
        },
        "node_modules/ignore": {
            "version": "4.0.6",
            "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
            "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/immer": {
            "version": "1.10.0",
            "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz",
            "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg=="
        },
        "node_modules/import-cwd": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
            "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
            "dependencies": {
                "import-from": "^2.1.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/import-fresh": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
            "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
            "dependencies": {
                "caller-path": "^2.0.0",
                "resolve-from": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/import-from": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
            "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
            "dependencies": {
                "resolve-from": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/import-local": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
            "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
            "dependencies": {
                "pkg-dir": "^3.0.0",
                "resolve-cwd": "^2.0.0"
            },
            "bin": {
                "import-local-fixture": "fixtures/cli.js"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/imurmurhash": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
            "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
            "engines": {
                "node": ">=0.8.19"
            }
        },
        "node_modules/indent-string": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/indexes-of": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
            "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
        },
        "node_modules/infer-owner": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
            "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
        },
        "node_modules/inflight": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
            "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
            "dependencies": {
                "once": "^1.3.0",
                "wrappy": "1"
            }
        },
        "node_modules/inherits": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
        },
        "node_modules/ini": {
            "version": "1.3.8",
            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
        },
        "node_modules/inquirer": {
            "version": "7.3.3",
            "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
            "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
            "dependencies": {
                "ansi-escapes": "^4.2.1",
                "chalk": "^4.1.0",
                "cli-cursor": "^3.1.0",
                "cli-width": "^3.0.0",
                "external-editor": "^3.0.3",
                "figures": "^3.0.0",
                "lodash": "^4.17.19",
                "mute-stream": "0.0.8",
                "run-async": "^2.4.0",
                "rxjs": "^6.6.0",
                "string-width": "^4.1.0",
                "strip-ansi": "^6.0.0",
                "through": "^2.3.6"
            },
            "engines": {
                "node": ">=8.0.0"
            }
        },
        "node_modules/inquirer/node_modules/ansi-regex": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/inquirer/node_modules/ansi-styles": {
            "version": "4.2.1",
            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
            "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
            "dependencies": {
                "@types/color-name": "^1.1.1",
                "color-convert": "^2.0.1"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
            }
        },
        "node_modules/inquirer/node_modules/chalk": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
            "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
            "dependencies": {
                "ansi-styles": "^4.1.0",
                "supports-color": "^7.1.0"
            },
            "engines": {
                "node": ">=10"
            },
            "funding": {
                "url": "https://github.com/chalk/chalk?sponsor=1"
            }
        },
        "node_modules/inquirer/node_modules/color-convert": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
            "dependencies": {
                "color-name": "~1.1.4"
            },
            "engines": {
                "node": ">=7.0.0"
            }
        },
        "node_modules/inquirer/node_modules/color-name": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
        },
        "node_modules/inquirer/node_modules/has-flag": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/inquirer/node_modules/strip-ansi": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
            "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
            "dependencies": {
                "ansi-regex": "^5.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/inquirer/node_modules/supports-color": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
            "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
            "dependencies": {
                "has-flag": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/internal-ip": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
            "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
            "dependencies": {
                "default-gateway": "^4.2.0",
                "ipaddr.js": "^1.9.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "es-abstract": "^1.17.0-next.1",
                "has": "^1.0.3",
                "side-channel": "^1.0.2"
            },
            "engines": {
                "node": ">= 0.4"
            }
        },
        "node_modules/invariant": {
            "version": "2.2.4",
            "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
            "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
            "dependencies": {
                "loose-envify": "^1.0.0"
            }
        },
        "node_modules/invert-kv": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
            "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/ip": {
            "version": "1.1.5",
            "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
            "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
        },
        "node_modules/ip-regex": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
            "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">= 0.10"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "kind-of": "^3.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-arguments": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
            "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
            "engines": {
                "node": ">= 0.4"
            }
        },
        "node_modules/is-arrayish": {
            "version": "0.2.1",
            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
            "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
        },
        "node_modules/is-binary-path": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
            "dependencies": {
                "binary-extensions": "^2.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/is-buffer": {
            "version": "1.1.6",
            "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
            "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
        },
        "node_modules/is-callable": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
            "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/is-ci": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
            "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
            "dependencies": {
                "ci-info": "^2.0.0"
            },
            "bin": {
                "is-ci": "bin.js"
            }
        },
        "node_modules/is-color-stop": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
            "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
            "dependencies": {
                "css-color-names": "^0.0.4",
                "hex-color-regex": "^1.1.0",
                "hsl-regex": "^1.0.0",
                "hsla-regex": "^1.0.0",
                "rgb-regex": "^1.0.1",
                "rgba-regex": "^1.0.0"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "kind-of": "^3.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/is-descriptor": {
            "version": "0.1.6",
            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
            "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
            "dependencies": {
                "is-accessor-descriptor": "^0.1.6",
                "is-data-descriptor": "^0.1.4",
                "kind-of": "^5.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-descriptor/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-directory": {
            "version": "0.3.1",
            "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
            "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-docker": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
            "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/is-extendable": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
            "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-extglob": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
            "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-fullwidth-code-point": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/is-generator-fn": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
            "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "is-extglob": "^2.1.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-in-browser": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
            "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
        },
        "node_modules/is-number": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
            "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
            "dependencies": {
                "kind-of": "^3.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-obj": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
            "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/is-path-cwd": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
            "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/is-path-in-cwd": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
            "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
            "dependencies": {
                "is-path-inside": "^2.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/is-path-inside": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
            "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
            "dependencies": {
                "path-is-inside": "^1.0.2"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "isobject": "^3.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-regex": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
            "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
            "dependencies": {
                "has-symbols": "^1.0.1"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/is-regexp": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
            "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-resolvable": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
            "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
        },
        "node_modules/is-root": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
            "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/is-stream": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
            "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "has-symbols": "^1.0.1"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/is-typedarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
            "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
        },
        "node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/is-wsl": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
            "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/isarray": {
            "version": "0.0.1",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
            "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
        },
        "node_modules/isexe": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
            "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
        },
        "node_modules/isobject": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
            "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/isstream": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
            "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
        },
        "node_modules/istanbul-lib-coverage": {
            "version": "2.0.5",
            "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
            "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/istanbul-lib-instrument": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
            "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
            "dependencies": {
                "@babel/generator": "^7.4.0",
                "@babel/parser": "^7.4.3",
                "@babel/template": "^7.4.0",
                "@babel/traverse": "^7.4.3",
                "@babel/types": "^7.4.0",
                "istanbul-lib-coverage": "^2.0.5",
                "semver": "^6.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/istanbul-lib-report": {
            "version": "2.0.8",
            "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
            "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
            "dependencies": {
                "istanbul-lib-coverage": "^2.0.5",
                "make-dir": "^2.1.0",
                "supports-color": "^6.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/istanbul-lib-report/node_modules/supports-color": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
            "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
            "dependencies": {
                "has-flag": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/istanbul-lib-source-maps": {
            "version": "3.0.6",
            "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
            "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
            "dependencies": {
                "debug": "^4.1.1",
                "istanbul-lib-coverage": "^2.0.5",
                "make-dir": "^2.1.0",
                "rimraf": "^2.6.3",
                "source-map": "^0.6.1"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/istanbul-reports": {
            "version": "2.2.7",
            "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz",
            "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==",
            "dependencies": {
                "html-escaper": "^2.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/jest": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz",
            "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==",
            "dependencies": {
                "import-local": "^2.0.0",
                "jest-cli": "^24.9.0"
            },
            "bin": {
                "jest": "bin/jest.js"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-changed-files": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz",
            "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "execa": "^1.0.0",
                "throat": "^4.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-cli": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz",
            "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==",
            "dependencies": {
                "@jest/core": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "exit": "^0.1.2",
                "import-local": "^2.0.0",
                "is-ci": "^2.0.0",
                "jest-config": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-validate": "^24.9.0",
                "prompts": "^2.0.1",
                "realpath-native": "^1.1.0",
                "yargs": "^13.3.0"
            },
            "bin": {
                "jest": "bin/jest.js"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-config": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz",
            "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==",
            "dependencies": {
                "@babel/core": "^7.1.0",
                "@jest/test-sequencer": "^24.9.0",
                "@jest/types": "^24.9.0",
                "babel-jest": "^24.9.0",
                "chalk": "^2.0.1",
                "glob": "^7.1.1",
                "jest-environment-jsdom": "^24.9.0",
                "jest-environment-node": "^24.9.0",
                "jest-get-type": "^24.9.0",
                "jest-jasmine2": "^24.9.0",
                "jest-regex-util": "^24.3.0",
                "jest-resolve": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-validate": "^24.9.0",
                "micromatch": "^3.1.10",
                "pretty-format": "^24.9.0",
                "realpath-native": "^1.1.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-diff": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
            "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
            "dependencies": {
                "chalk": "^2.0.1",
                "diff-sequences": "^24.9.0",
                "jest-get-type": "^24.9.0",
                "pretty-format": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-docblock": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz",
            "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==",
            "dependencies": {
                "detect-newline": "^2.1.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-each": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz",
            "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "jest-get-type": "^24.9.0",
                "jest-util": "^24.9.0",
                "pretty-format": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-environment-jsdom": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz",
            "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==",
            "dependencies": {
                "@jest/environment": "^24.9.0",
                "@jest/fake-timers": "^24.9.0",
                "@jest/types": "^24.9.0",
                "jest-mock": "^24.9.0",
                "jest-util": "^24.9.0",
                "jsdom": "^11.5.1"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-environment-jsdom-fourteen": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz",
            "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==",
            "dependencies": {
                "@jest/environment": "^24.3.0",
                "@jest/fake-timers": "^24.3.0",
                "@jest/types": "^24.3.0",
                "jest-mock": "^24.0.0",
                "jest-util": "^24.0.0",
                "jsdom": "^14.1.0"
            }
        },
        "node_modules/jest-environment-jsdom-fourteen/node_modules/acorn": {
            "version": "6.4.1",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
            "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
            "bin": {
                "acorn": "bin/acorn"
            },
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/jest-environment-jsdom-fourteen/node_modules/jsdom": {
            "version": "14.1.0",
            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz",
            "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==",
            "dependencies": {
                "abab": "^2.0.0",
                "acorn": "^6.0.4",
                "acorn-globals": "^4.3.0",
                "array-equal": "^1.0.0",
                "cssom": "^0.3.4",
                "cssstyle": "^1.1.1",
                "data-urls": "^1.1.0",
                "domexception": "^1.0.1",
                "escodegen": "^1.11.0",
                "html-encoding-sniffer": "^1.0.2",
                "nwsapi": "^2.1.3",
                "parse5": "5.1.0",
                "pn": "^1.1.0",
                "request": "^2.88.0",
                "request-promise-native": "^1.0.5",
                "saxes": "^3.1.9",
                "symbol-tree": "^3.2.2",
                "tough-cookie": "^2.5.0",
                "w3c-hr-time": "^1.0.1",
                "w3c-xmlserializer": "^1.1.2",
                "webidl-conversions": "^4.0.2",
                "whatwg-encoding": "^1.0.5",
                "whatwg-mimetype": "^2.3.0",
                "whatwg-url": "^7.0.0",
                "ws": "^6.1.2",
                "xml-name-validator": "^3.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/jest-environment-jsdom-fourteen/node_modules/parse5": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
            "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="
        },
        "node_modules/jest-environment-jsdom-fourteen/node_modules/whatwg-url": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
            "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
            "dependencies": {
                "lodash.sortby": "^4.7.0",
                "tr46": "^1.0.1",
                "webidl-conversions": "^4.0.2"
            }
        },
        "node_modules/jest-environment-jsdom-fourteen/node_modules/ws": {
            "version": "6.2.2",
            "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
            "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
            "dependencies": {
                "async-limiter": "~1.0.0"
            }
        },
        "node_modules/jest-environment-node": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz",
            "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==",
            "dependencies": {
                "@jest/environment": "^24.9.0",
                "@jest/fake-timers": "^24.9.0",
                "@jest/types": "^24.9.0",
                "jest-mock": "^24.9.0",
                "jest-util": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-get-type": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
            "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-haste-map": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
            "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "anymatch": "^2.0.0",
                "fb-watchman": "^2.0.0",
                "graceful-fs": "^4.1.15",
                "invariant": "^2.2.4",
                "jest-serializer": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-worker": "^24.9.0",
                "micromatch": "^3.1.10",
                "sane": "^4.0.3",
                "walker": "^1.0.7"
            },
            "engines": {
                "node": ">= 6"
            },
            "optionalDependencies": {
                "fsevents": "^1.2.7"
            }
        },
        "node_modules/jest-haste-map/node_modules/fsevents": {
            "version": "1.2.13",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
            "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
            "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
            "hasInstallScript": true,
            "optional": true,
            "os": [
                "darwin"
            ],
            "dependencies": {
                "bindings": "^1.5.0",
                "nan": "^2.12.1"
            },
            "engines": {
                "node": ">= 4.0"
            }
        },
        "node_modules/jest-jasmine2": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz",
            "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==",
            "dependencies": {
                "@babel/traverse": "^7.1.0",
                "@jest/environment": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "co": "^4.6.0",
                "expect": "^24.9.0",
                "is-generator-fn": "^2.0.0",
                "jest-each": "^24.9.0",
                "jest-matcher-utils": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-runtime": "^24.9.0",
                "jest-snapshot": "^24.9.0",
                "jest-util": "^24.9.0",
                "pretty-format": "^24.9.0",
                "throat": "^4.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-leak-detector": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz",
            "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==",
            "dependencies": {
                "jest-get-type": "^24.9.0",
                "pretty-format": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-matcher-utils": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz",
            "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==",
            "dependencies": {
                "chalk": "^2.0.1",
                "jest-diff": "^24.9.0",
                "jest-get-type": "^24.9.0",
                "pretty-format": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-message-util": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
            "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
            "dependencies": {
                "@babel/code-frame": "^7.0.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/stack-utils": "^1.0.1",
                "chalk": "^2.0.1",
                "micromatch": "^3.1.10",
                "slash": "^2.0.0",
                "stack-utils": "^1.0.1"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-mock": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz",
            "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==",
            "dependencies": {
                "@jest/types": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-pnp-resolver": {
            "version": "1.2.2",
            "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
            "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
            "engines": {
                "node": ">=6"
            },
            "peerDependencies": {
                "jest-resolve": "*"
            },
            "peerDependenciesMeta": {
                "jest-resolve": {
                    "optional": true
                }
            }
        },
        "node_modules/jest-regex-util": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
            "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-resolve": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
            "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "browser-resolve": "^1.11.3",
                "chalk": "^2.0.1",
                "jest-pnp-resolver": "^1.2.1",
                "realpath-native": "^1.1.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-resolve-dependencies": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz",
            "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "jest-regex-util": "^24.3.0",
                "jest-snapshot": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-runner": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz",
            "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==",
            "dependencies": {
                "@jest/console": "^24.7.1",
                "@jest/environment": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.4.2",
                "exit": "^0.1.2",
                "graceful-fs": "^4.1.15",
                "jest-config": "^24.9.0",
                "jest-docblock": "^24.3.0",
                "jest-haste-map": "^24.9.0",
                "jest-jasmine2": "^24.9.0",
                "jest-leak-detector": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-resolve": "^24.9.0",
                "jest-runtime": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-worker": "^24.6.0",
                "source-map-support": "^0.5.6",
                "throat": "^4.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-runtime": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz",
            "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==",
            "dependencies": {
                "@jest/console": "^24.7.1",
                "@jest/environment": "^24.9.0",
                "@jest/source-map": "^24.3.0",
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/yargs": "^13.0.0",
                "chalk": "^2.0.1",
                "exit": "^0.1.2",
                "glob": "^7.1.3",
                "graceful-fs": "^4.1.15",
                "jest-config": "^24.9.0",
                "jest-haste-map": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-mock": "^24.9.0",
                "jest-regex-util": "^24.3.0",
                "jest-resolve": "^24.9.0",
                "jest-snapshot": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-validate": "^24.9.0",
                "realpath-native": "^1.1.0",
                "slash": "^2.0.0",
                "strip-bom": "^3.0.0",
                "yargs": "^13.3.0"
            },
            "bin": {
                "jest-runtime": "bin/jest-runtime.js"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-serializer": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
            "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-snapshot": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
            "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
            "dependencies": {
                "@babel/types": "^7.0.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "expect": "^24.9.0",
                "jest-diff": "^24.9.0",
                "jest-get-type": "^24.9.0",
                "jest-matcher-utils": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-resolve": "^24.9.0",
                "mkdirp": "^0.5.1",
                "natural-compare": "^1.4.0",
                "pretty-format": "^24.9.0",
                "semver": "^6.2.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-util": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
            "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
            "dependencies": {
                "@jest/console": "^24.9.0",
                "@jest/fake-timers": "^24.9.0",
                "@jest/source-map": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "callsites": "^3.0.0",
                "chalk": "^2.0.1",
                "graceful-fs": "^4.1.15",
                "is-ci": "^2.0.0",
                "mkdirp": "^0.5.1",
                "slash": "^2.0.0",
                "source-map": "^0.6.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-util/node_modules/callsites": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/jest-validate": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz",
            "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "camelcase": "^5.3.1",
                "chalk": "^2.0.1",
                "jest-get-type": "^24.9.0",
                "leven": "^3.1.0",
                "pretty-format": "^24.9.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-watch-typeahead": {
            "version": "0.4.2",
            "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz",
            "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==",
            "dependencies": {
                "ansi-escapes": "^4.2.1",
                "chalk": "^2.4.1",
                "jest-regex-util": "^24.9.0",
                "jest-watcher": "^24.3.0",
                "slash": "^3.0.0",
                "string-length": "^3.1.0",
                "strip-ansi": "^5.0.0"
            }
        },
        "node_modules/jest-watch-typeahead/node_modules/slash": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
            "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/jest-watch-typeahead/node_modules/string-length": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz",
            "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==",
            "dependencies": {
                "astral-regex": "^1.0.0",
                "strip-ansi": "^5.2.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/jest-watcher": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz",
            "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==",
            "dependencies": {
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/yargs": "^13.0.0",
                "ansi-escapes": "^3.0.0",
                "chalk": "^2.0.1",
                "jest-util": "^24.9.0",
                "string-length": "^2.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-watcher/node_modules/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==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/jest-worker": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
            "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
            "dependencies": {
                "merge-stream": "^2.0.0",
                "supports-color": "^6.1.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/jest-worker/node_modules/supports-color": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
            "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
            "dependencies": {
                "has-flag": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/js-tokens": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
        },
        "node_modules/js-yaml": {
            "version": "3.14.0",
            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
            "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
            "dependencies": {
                "argparse": "^1.0.7",
                "esprima": "^4.0.0"
            },
            "bin": {
                "js-yaml": "bin/js-yaml.js"
            }
        },
        "node_modules/jsbn": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
            "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
        },
        "node_modules/jsdom": {
            "version": "11.12.0",
            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
            "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/jsdom/node_modules/acorn": {
            "version": "5.7.4",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
            "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
            "bin": {
                "acorn": "bin/acorn"
            },
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/jsesc": {
            "version": "2.5.2",
            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
            "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
            "bin": {
                "jsesc": "bin/jsesc"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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=="
        },
        "node_modules/json-schema": {
            "version": "0.2.3",
            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
            "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
        },
        "node_modules/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=="
        },
        "node_modules/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=",
            "dependencies": {
                "jsonify": "~0.0.0"
            }
        },
        "node_modules/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="
        },
        "node_modules/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="
        },
        "node_modules/json3": {
            "version": "3.3.3",
            "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
            "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
        },
        "node_modules/json5": {
            "version": "2.1.3",
            "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
            "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
            "dependencies": {
                "minimist": "^1.2.5"
            },
            "bin": {
                "json5": "lib/cli.js"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/jsonfile": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
            "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
            "optionalDependencies": {
                "graceful-fs": "^4.1.6"
            }
        },
        "node_modules/jsonify": {
            "version": "0.0.0",
            "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
            "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
            "engines": {
                "node": "*"
            }
        },
        "node_modules/jsonwebtoken": {
            "version": "8.5.1",
            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
            "dependencies": {
                "jws": "^3.2.2",
                "lodash.includes": "^4.3.0",
                "lodash.isboolean": "^3.0.3",
                "lodash.isinteger": "^4.0.4",
                "lodash.isnumber": "^3.0.3",
                "lodash.isplainobject": "^4.0.6",
                "lodash.isstring": "^4.0.1",
                "lodash.once": "^4.0.0",
                "ms": "^2.1.1",
                "semver": "^5.6.0"
            },
            "engines": {
                "node": ">=4",
                "npm": ">=1.4.28"
            }
        },
        "node_modules/jsonwebtoken/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/jsprim": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
            "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
            "engines": [
                "node >=0.6.0"
            ],
            "dependencies": {
                "assert-plus": "1.0.0",
                "extsprintf": "1.3.0",
                "json-schema": "0.2.3",
                "verror": "1.10.0"
            }
        },
        "node_modules/jss": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz",
            "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==",
            "dependencies": {
                "@babel/runtime": "^7.3.1",
                "csstype": "^3.0.2",
                "is-in-browser": "^1.1.3",
                "tiny-warning": "^1.0.2"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/jss"
            }
        },
        "node_modules/jss-plugin-camel-case": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz",
            "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==",
            "dependencies": {
                "@babel/runtime": "^7.3.1",
                "hyphenate-style-name": "^1.0.3",
                "jss": "10.7.1"
            }
        },
        "node_modules/jss-plugin-default-unit": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz",
            "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==",
            "dependencies": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1"
            }
        },
        "node_modules/jss-plugin-global": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz",
            "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==",
            "dependencies": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1"
            }
        },
        "node_modules/jss-plugin-nested": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz",
            "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==",
            "dependencies": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1",
                "tiny-warning": "^1.0.2"
            }
        },
        "node_modules/jss-plugin-props-sort": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz",
            "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==",
            "dependencies": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1"
            }
        },
        "node_modules/jss-plugin-rule-value-function": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz",
            "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==",
            "dependencies": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1",
                "tiny-warning": "^1.0.2"
            }
        },
        "node_modules/jss-plugin-vendor-prefixer": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz",
            "integrity": "sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==",
            "dependencies": {
                "@babel/runtime": "^7.3.1",
                "css-vendor": "^2.0.8",
                "jss": "10.7.1"
            }
        },
        "node_modules/jss/node_modules/csstype": {
            "version": "3.0.8",
            "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz",
            "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw=="
        },
        "node_modules/jsx-ast-utils": {
            "version": "2.4.1",
            "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
            "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
            "dependencies": {
                "array-includes": "^3.1.1",
                "object.assign": "^4.1.0"
            },
            "engines": {
                "node": ">=4.0"
            }
        },
        "node_modules/jwa": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
            "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
            "dependencies": {
                "buffer-equal-constant-time": "1.0.1",
                "ecdsa-sig-formatter": "1.0.11",
                "safe-buffer": "^5.0.1"
            }
        },
        "node_modules/jws": {
            "version": "3.2.2",
            "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
            "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
            "dependencies": {
                "jwa": "^1.4.1",
                "safe-buffer": "^5.0.1"
            }
        },
        "node_modules/killable": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
            "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg=="
        },
        "node_modules/kind-of": {
            "version": "3.2.2",
            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
            "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
            "dependencies": {
                "is-buffer": "^1.1.5"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/kleur": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
            "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/last-call-webpack-plugin": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
            "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
            "dependencies": {
                "lodash": "^4.17.5",
                "webpack-sources": "^1.1.0"
            }
        },
        "node_modules/lazy-cache": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
            "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/lcid": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
            "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
            "dependencies": {
                "invert-kv": "^2.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/left-pad": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
            "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
            "deprecated": "use String.prototype.padStart()"
        },
        "node_modules/leven": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
            "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/levenary": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
            "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
            "dependencies": {
                "leven": "^3.1.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/levn": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
            "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
            "dependencies": {
                "prelude-ls": "~1.1.2",
                "type-check": "~0.3.2"
            },
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/lines-and-columns": {
            "version": "1.1.6",
            "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
            "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
        },
        "node_modules/load-json-file": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
            "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
            "dependencies": {
                "graceful-fs": "^4.1.2",
                "parse-json": "^4.0.0",
                "pify": "^3.0.0",
                "strip-bom": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/loader-fs-cache": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz",
            "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==",
            "dependencies": {
                "find-cache-dir": "^0.1.1",
                "mkdirp": "^0.5.1"
            }
        },
        "node_modules/loader-fs-cache/node_modules/find-cache-dir": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
            "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
            "dependencies": {
                "commondir": "^1.0.1",
                "mkdirp": "^0.5.1",
                "pkg-dir": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/loader-fs-cache/node_modules/find-up": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
            "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
            "dependencies": {
                "path-exists": "^2.0.0",
                "pinkie-promise": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/loader-fs-cache/node_modules/path-exists": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
            "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
            "dependencies": {
                "pinkie-promise": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/loader-fs-cache/node_modules/pkg-dir": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
            "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
            "dependencies": {
                "find-up": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/loader-runner": {
            "version": "2.4.0",
            "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
            "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
            "engines": {
                "node": ">=4.3.0 <5.0.0 || >=5.10"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "big.js": "^5.2.2",
                "emojis-list": "^3.0.0",
                "json5": "^1.0.1"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/loader-utils/node_modules/json5": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
            "dependencies": {
                "minimist": "^1.2.0"
            },
            "bin": {
                "json5": "lib/cli.js"
            }
        },
        "node_modules/locate-path": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
            "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
            "dependencies": {
                "p-locate": "^3.0.0",
                "path-exists": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/lodash": {
            "version": "4.17.21",
            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
        },
        "node_modules/lodash._reinterpolate": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
            "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
        },
        "node_modules/lodash.includes": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
            "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
        },
        "node_modules/lodash.isboolean": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
            "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
        },
        "node_modules/lodash.isinteger": {
            "version": "4.0.4",
            "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
            "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
        },
        "node_modules/lodash.isnumber": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
            "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
        },
        "node_modules/lodash.isplainobject": {
            "version": "4.0.6",
            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
            "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
        },
        "node_modules/lodash.isstring": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
            "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
        },
        "node_modules/lodash.memoize": {
            "version": "4.1.2",
            "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
            "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
        },
        "node_modules/lodash.once": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
            "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
        },
        "node_modules/lodash.sortby": {
            "version": "4.7.0",
            "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
            "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
        },
        "node_modules/lodash.template": {
            "version": "4.5.0",
            "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
            "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
            "dependencies": {
                "lodash._reinterpolate": "^3.0.0",
                "lodash.templatesettings": "^4.0.0"
            }
        },
        "node_modules/lodash.templatesettings": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
            "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
            "dependencies": {
                "lodash._reinterpolate": "^3.0.0"
            }
        },
        "node_modules/lodash.uniq": {
            "version": "4.5.0",
            "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
            "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
        },
        "node_modules/loglevel": {
            "version": "1.6.8",
            "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
            "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==",
            "engines": {
                "node": ">= 0.6.0"
            },
            "funding": {
                "type": "tidelift",
                "url": "https://tidelift.com/subscription/pkg/npm-loglevel?utm_medium=referral&utm_source=npm_fund"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "js-tokens": "^3.0.0 || ^4.0.0"
            },
            "bin": {
                "loose-envify": "cli.js"
            }
        },
        "node_modules/lower-case": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz",
            "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==",
            "dependencies": {
                "tslib": "^1.10.0"
            }
        },
        "node_modules/lru-cache": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
            "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
            "dependencies": {
                "yallist": "^3.0.2"
            }
        },
        "node_modules/lru-cache/node_modules/yallist": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
            "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
        },
        "node_modules/make-dir": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
            "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
            "dependencies": {
                "pify": "^4.0.1",
                "semver": "^5.6.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/make-dir/node_modules/pify": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
            "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/make-dir/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/makeerror": {
            "version": "1.0.11",
            "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
            "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
            "dependencies": {
                "tmpl": "1.0.x"
            }
        },
        "node_modules/mamacro": {
            "version": "0.0.3",
            "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
            "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA=="
        },
        "node_modules/map-age-cleaner": {
            "version": "0.1.3",
            "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
            "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
            "dependencies": {
                "p-defer": "^1.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/map-cache": {
            "version": "0.2.2",
            "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
            "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/map-visit": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
            "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
            "dependencies": {
                "object-visit": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "hash-base": "^3.0.0",
                "inherits": "^2.0.1",
                "safe-buffer": "^5.1.2"
            }
        },
        "node_modules/mdn-data": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
            "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
        },
        "node_modules/media-typer": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
            "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/mem": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
            "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
            "dependencies": {
                "map-age-cleaner": "^0.1.1",
                "mimic-fn": "^2.0.0",
                "p-is-promise": "^2.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "errno": "^0.1.3",
                "readable-stream": "^2.0.1"
            }
        },
        "node_modules/memory-fs/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/memory-fs/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/memory-fs/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/merge-deep": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
            "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
            "dependencies": {
                "arr-union": "^3.1.0",
                "clone-deep": "^0.2.4",
                "kind-of": "^3.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/merge-descriptors": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
            "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
        },
        "node_modules/merge-stream": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
            "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
        },
        "node_modules/merge2": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/methods": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
            "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/microevent.ts": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz",
            "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g=="
        },
        "node_modules/micromatch": {
            "version": "3.1.10",
            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
            "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/micromatch/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/miller-rabin": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
            "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
            "dependencies": {
                "bn.js": "^4.0.0",
                "brorand": "^1.0.1"
            },
            "bin": {
                "miller-rabin": "bin/miller-rabin"
            }
        },
        "node_modules/miller-rabin/node_modules/bn.js": {
            "version": "4.11.9",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
        },
        "node_modules/mime": {
            "version": "2.4.6",
            "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
            "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
            "bin": {
                "mime": "cli.js"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/mime-db": {
            "version": "1.44.0",
            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
            "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/mime-types": {
            "version": "2.1.27",
            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
            "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
            "dependencies": {
                "mime-db": "1.44.0"
            },
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/mimic-fn": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
            "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/min-indent": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/mini-create-react-context": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz",
            "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==",
            "dependencies": {
                "@babel/runtime": "^7.5.5",
                "tiny-warning": "^1.0.3"
            },
            "peerDependencies": {
                "prop-types": "^15.0.0",
                "react": "^0.14.0 || ^15.0.0 || ^16.0.0"
            }
        },
        "node_modules/mini-css-extract-plugin": {
            "version": "0.9.0",
            "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz",
            "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==",
            "dependencies": {
                "loader-utils": "^1.1.0",
                "normalize-url": "1.9.1",
                "schema-utils": "^1.0.0",
                "webpack-sources": "^1.1.0"
            },
            "engines": {
                "node": ">= 6.9.0"
            },
            "peerDependencies": {
                "webpack": "^4.4.0"
            }
        },
        "node_modules/mini-css-extract-plugin/node_modules/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==",
            "dependencies": {
                "ajv": "^6.1.0",
                "ajv-errors": "^1.0.0",
                "ajv-keywords": "^3.1.0"
            },
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/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=="
        },
        "node_modules/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="
        },
        "node_modules/minimatch": {
            "version": "3.0.4",
            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
            "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
            "dependencies": {
                "brace-expansion": "^1.1.7"
            },
            "engines": {
                "node": "*"
            }
        },
        "node_modules/minimist": {
            "version": "1.2.5",
            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
        },
        "node_modules/minipass": {
            "version": "3.1.3",
            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
            "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
            "dependencies": {
                "yallist": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/minipass-collect": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
            "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
            "dependencies": {
                "minipass": "^3.0.0"
            },
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/minipass-flush": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
            "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
            "dependencies": {
                "minipass": "^3.0.0"
            },
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/minipass-pipeline": {
            "version": "1.2.4",
            "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
            "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
            "dependencies": {
                "minipass": "^3.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/mississippi": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
            "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
            "dependencies": {
                "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": "^3.0.0",
                "pumpify": "^1.3.3",
                "stream-each": "^1.1.0",
                "through2": "^2.0.0"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/mixin-deep": {
            "version": "1.3.2",
            "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
            "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
            "dependencies": {
                "for-in": "^1.0.2",
                "is-extendable": "^1.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/mixin-deep/node_modules/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==",
            "dependencies": {
                "is-plain-object": "^2.0.4"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/mixin-object": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
            "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
            "dependencies": {
                "for-in": "^0.1.3",
                "is-extendable": "^0.1.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/mixin-object/node_modules/for-in": {
            "version": "0.1.8",
            "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
            "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/mkdirp": {
            "version": "0.5.5",
            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
            "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
            "dependencies": {
                "minimist": "^1.2.5"
            },
            "bin": {
                "mkdirp": "bin/cmd.js"
            }
        },
        "node_modules/moment": {
            "version": "2.29.1",
            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
            "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
            "engines": {
                "node": "*"
            }
        },
        "node_modules/move-concurrently": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
            "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
            "dependencies": {
                "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"
            }
        },
        "node_modules/ms": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
        },
        "node_modules/multicast-dns": {
            "version": "6.2.3",
            "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
            "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
            "dependencies": {
                "dns-packet": "^1.3.1",
                "thunky": "^1.0.2"
            },
            "bin": {
                "multicast-dns": "cli.js"
            }
        },
        "node_modules/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="
        },
        "node_modules/mute-stream": {
            "version": "0.0.8",
            "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
            "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
        },
        "node_modules/nanomatch": {
            "version": "1.2.13",
            "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
            "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/nanomatch/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/natural-compare": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
            "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
        },
        "node_modules/negotiator": {
            "version": "0.6.2",
            "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
            "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/neo-async": {
            "version": "2.6.2",
            "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
            "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
        },
        "node_modules/next-tick": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
            "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
        },
        "node_modules/nice-try": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
            "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
        },
        "node_modules/no-case": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz",
            "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==",
            "dependencies": {
                "lower-case": "^2.0.1",
                "tslib": "^1.10.0"
            }
        },
        "node_modules/node-forge": {
            "version": "0.10.0",
            "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
            "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
            "engines": {
                "node": ">= 6.0.0"
            }
        },
        "node_modules/node-int64": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
            "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/node-libs-browser/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/node-libs-browser/node_modules/punycode": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
            "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
        },
        "node_modules/node-libs-browser/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/node-libs-browser/node_modules/readable-stream/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/node-libs-browser/node_modules/util": {
            "version": "0.11.1",
            "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
            "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
            "dependencies": {
                "inherits": "2.0.3"
            }
        },
        "node_modules/node-libs-browser/node_modules/util/node_modules/inherits": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
            "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
        },
        "node_modules/node-modules-regexp": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
            "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/node-notifier": {
            "version": "5.4.5",
            "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz",
            "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==",
            "dependencies": {
                "growly": "^1.3.0",
                "is-wsl": "^1.1.0",
                "semver": "^5.5.0",
                "shellwords": "^0.1.1",
                "which": "^1.3.0"
            }
        },
        "node_modules/node-notifier/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/node-releases": {
            "version": "1.1.60",
            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz",
            "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA=="
        },
        "node_modules/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==",
            "dependencies": {
                "hosted-git-info": "^2.1.4",
                "resolve": "^1.10.0",
                "semver": "2 || 3 || 4 || 5",
                "validate-npm-package-license": "^3.0.1"
            }
        },
        "node_modules/normalize-package-data/node_modules/semver": {
            "version": "5.7.1",
            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
            "bin": {
                "semver": "bin/semver"
            }
        },
        "node_modules/normalize-path": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
            "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
            "dependencies": {
                "remove-trailing-separator": "^1.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/normalize-range": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
            "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/normalize-url": {
            "version": "1.9.1",
            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
            "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
            "dependencies": {
                "object-assign": "^4.0.1",
                "prepend-http": "^1.0.0",
                "query-string": "^4.1.0",
                "sort-keys": "^1.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "path-key": "^2.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "boolbase": "~1.0.0"
            }
        },
        "node_modules/num2fraction": {
            "version": "1.2.2",
            "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
            "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/nwsapi": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
            "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
        },
        "node_modules/oauth-sign": {
            "version": "0.9.0",
            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
            "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
            "engines": {
                "node": "*"
            }
        },
        "node_modules/object-assign": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
            "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/object-copy": {
            "version": "0.1.0",
            "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
            "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
            "dependencies": {
                "copy-descriptor": "^0.1.0",
                "define-property": "^0.2.5",
                "kind-of": "^3.0.3"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/object-copy/node_modules/define-property": {
            "version": "0.2.5",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
            "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
            "dependencies": {
                "is-descriptor": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/object-hash": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
            "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/object-inspect": {
            "version": "1.8.0",
            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
            "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/object-is": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
            "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.5"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/object-keys": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
            "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
            "engines": {
                "node": ">= 0.4"
            }
        },
        "node_modules/object-path": {
            "version": "0.11.4",
            "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz",
            "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/object-visit": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
            "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
            "dependencies": {
                "isobject": "^3.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/object.assign": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
            "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
            "dependencies": {
                "define-properties": "^1.1.2",
                "function-bind": "^1.1.1",
                "has-symbols": "^1.0.0",
                "object-keys": "^1.0.11"
            },
            "engines": {
                "node": ">= 0.4"
            }
        },
        "node_modules/object.entries": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
            "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.5",
                "has": "^1.0.3"
            },
            "engines": {
                "node": ">= 0.4"
            }
        },
        "node_modules/object.fromentries": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
            "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0-next.1",
                "function-bind": "^1.1.1",
                "has": "^1.0.3"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0-next.1"
            },
            "engines": {
                "node": ">= 0.8"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/object.pick": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
            "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
            "dependencies": {
                "isobject": "^3.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0-next.1",
                "function-bind": "^1.1.1",
                "has": "^1.0.3"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/obuf": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
            "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
        },
        "node_modules/on-finished": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
            "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
            "dependencies": {
                "ee-first": "1.1.1"
            },
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/once": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
            "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
            "dependencies": {
                "wrappy": "1"
            }
        },
        "node_modules/onetime": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.1.tgz",
            "integrity": "sha512-ZpZpjcJeugQfWsfyQlshVoowIIQ1qBGSVll4rfDq6JJVO//fesjoX808hXWfBjY+ROZgpKDI5TRSRBSoJiZ8eg==",
            "dependencies": {
                "mimic-fn": "^2.1.0"
            },
            "engines": {
                "node": ">=6"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/open": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz",
            "integrity": "sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==",
            "dependencies": {
                "is-docker": "^2.0.0",
                "is-wsl": "^2.1.1"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/open/node_modules/is-wsl": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
            "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
            "dependencies": {
                "is-docker": "^2.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/opn": {
            "version": "5.5.0",
            "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
            "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
            "dependencies": {
                "is-wsl": "^1.1.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/optimize-css-assets-webpack-plugin": {
            "version": "5.0.3",
            "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz",
            "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==",
            "dependencies": {
                "cssnano": "^4.1.10",
                "last-call-webpack-plugin": "^3.0.0"
            },
            "peerDependencies": {
                "webpack": "^4.0.0"
            }
        },
        "node_modules/optionator": {
            "version": "0.8.3",
            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
            "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "url-parse": "^1.4.3"
            }
        },
        "node_modules/os-browserify": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
            "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
        },
        "node_modules/os-locale": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
            "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
            "dependencies": {
                "execa": "^1.0.0",
                "lcid": "^2.0.0",
                "mem": "^4.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/p-defer": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
            "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/p-each-series": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
            "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
            "dependencies": {
                "p-reduce": "^1.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/p-finally": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
            "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/p-is-promise": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
            "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/p-limit": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
            "dependencies": {
                "p-try": "^2.0.0"
            },
            "engines": {
                "node": ">=6"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/p-locate": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
            "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
            "dependencies": {
                "p-limit": "^2.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/p-map": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
            "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
            "dependencies": {
                "aggregate-error": "^3.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/p-reduce": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
            "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/p-retry": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
            "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
            "dependencies": {
                "retry": "^0.12.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/p-try": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/pako": {
            "version": "1.0.11",
            "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
            "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
        },
        "node_modules/parallel-transform": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
            "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
            "dependencies": {
                "cyclist": "^1.0.1",
                "inherits": "^2.0.3",
                "readable-stream": "^2.1.5"
            }
        },
        "node_modules/parallel-transform/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/parallel-transform/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/parallel-transform/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/param-case": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz",
            "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==",
            "dependencies": {
                "dot-case": "^3.0.3",
                "tslib": "^1.10.0"
            }
        },
        "node_modules/parent-module": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
            "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
            "dependencies": {
                "callsites": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/parent-module/node_modules/callsites": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/parse-asn1": {
            "version": "5.1.5",
            "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
            "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/parse-json": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
            "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
            "dependencies": {
                "error-ex": "^1.3.1",
                "json-parse-better-errors": "^1.0.1"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/parse5": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
            "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA=="
        },
        "node_modules/parseurl": {
            "version": "1.3.3",
            "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
            "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/pascal-case": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz",
            "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==",
            "dependencies": {
                "no-case": "^3.0.3",
                "tslib": "^1.10.0"
            }
        },
        "node_modules/pascalcase": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
            "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/path-dirname": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
            "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
        },
        "node_modules/path-exists": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
            "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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="
        },
        "node_modules/path-key": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
            "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/path-parse": {
            "version": "1.0.7",
            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
        },
        "node_modules/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==",
            "dependencies": {
                "isarray": "0.0.1"
            }
        },
        "node_modules/path-type": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
            "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
            "dependencies": {
                "pify": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/pbkdf2": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
            "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
            "dependencies": {
                "create-hash": "^1.1.2",
                "create-hmac": "^1.1.4",
                "ripemd160": "^2.0.1",
                "safe-buffer": "^5.0.1",
                "sha.js": "^2.4.8"
            },
            "engines": {
                "node": ">=0.12"
            }
        },
        "node_modules/performance-now": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
            "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
        },
        "node_modules/picocolors": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
            "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
        },
        "node_modules/picomatch": {
            "version": "2.2.2",
            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
            "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
            "engines": {
                "node": ">=8.6"
            },
            "funding": {
                "url": "https://github.com/sponsors/jonschlinkert"
            }
        },
        "node_modules/pify": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
            "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/pinkie": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
            "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/pinkie-promise": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
            "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
            "dependencies": {
                "pinkie": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/pirates": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
            "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
            "dependencies": {
                "node-modules-regexp": "^1.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/pkg-dir": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
            "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
            "dependencies": {
                "find-up": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/pkg-up": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
            "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
            "dependencies": {
                "find-up": "^3.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/pn": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
            "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
        },
        "node_modules/pnp-webpack-plugin": {
            "version": "1.6.4",
            "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
            "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==",
            "dependencies": {
                "ts-pnp": "^1.1.6"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/popper.js": {
            "version": "1.16.1-lts",
            "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz",
            "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA=="
        },
        "node_modules/portfinder": {
            "version": "1.0.28",
            "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
            "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
            "dependencies": {
                "async": "^2.6.2",
                "debug": "^3.1.1",
                "mkdirp": "^0.5.5"
            },
            "engines": {
                "node": ">= 0.12.0"
            }
        },
        "node_modules/portfinder/node_modules/debug": {
            "version": "3.2.6",
            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
            "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
            "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
            "dependencies": {
                "ms": "^2.1.1"
            }
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/postcss": {
            "version": "7.0.39",
            "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
            "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
            "dependencies": {
                "picocolors": "^0.2.1",
                "source-map": "^0.6.1"
            },
            "engines": {
                "node": ">=6.0.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/postcss/"
            }
        },
        "node_modules/postcss-attribute-case-insensitive": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
            "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-selector-parser": "^6.0.2"
            }
        },
        "node_modules/postcss-browser-comments": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz",
            "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==",
            "dependencies": {
                "postcss": "^7"
            },
            "engines": {
                "node": ">=8.0.0"
            },
            "peerDependencies": {
                "browserslist": "^4"
            }
        },
        "node_modules/postcss-calc": {
            "version": "7.0.2",
            "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz",
            "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==",
            "dependencies": {
                "postcss": "^7.0.27",
                "postcss-selector-parser": "^6.0.2",
                "postcss-value-parser": "^4.0.2"
            }
        },
        "node_modules/postcss-color-functional-notation": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
            "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-color-gray": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
            "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
            "dependencies": {
                "@csstools/convert-colors": "^1.4.0",
                "postcss": "^7.0.5",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-color-hex-alpha": {
            "version": "5.0.3",
            "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
            "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
            "dependencies": {
                "postcss": "^7.0.14",
                "postcss-values-parser": "^2.0.1"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-color-mod-function": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
            "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
            "dependencies": {
                "@csstools/convert-colors": "^1.4.0",
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-color-rebeccapurple": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
            "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-colormin": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
            "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
            "dependencies": {
                "browserslist": "^4.0.0",
                "color": "^3.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-colormin/node_modules/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=="
        },
        "node_modules/postcss-convert-values": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
            "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
            "dependencies": {
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-convert-values/node_modules/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=="
        },
        "node_modules/postcss-custom-media": {
            "version": "7.0.8",
            "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
            "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
            "dependencies": {
                "postcss": "^7.0.14"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-custom-properties": {
            "version": "8.0.11",
            "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
            "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
            "dependencies": {
                "postcss": "^7.0.17",
                "postcss-values-parser": "^2.0.1"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-custom-selectors": {
            "version": "5.1.2",
            "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
            "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-selector-parser": "^5.0.0-rc.3"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-custom-selectors/node_modules/cssesc": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
            "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
            "bin": {
                "cssesc": "bin/cssesc"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
            "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
            "dependencies": {
                "cssesc": "^2.0.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/postcss-dir-pseudo-class": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
            "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-selector-parser": "^5.0.0-rc.3"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
            "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
            "bin": {
                "cssesc": "bin/cssesc"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
            "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
            "dependencies": {
                "cssesc": "^2.0.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/postcss-discard-comments": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
            "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
            "dependencies": {
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-discard-duplicates": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
            "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
            "dependencies": {
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-discard-empty": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
            "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
            "dependencies": {
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-discard-overridden": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
            "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
            "dependencies": {
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-double-position-gradients": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
            "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
            "dependencies": {
                "postcss": "^7.0.5",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-env-function": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
            "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-flexbugs-fixes": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz",
            "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==",
            "dependencies": {
                "postcss": "^7.0.0"
            }
        },
        "node_modules/postcss-focus-visible": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
            "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
            "dependencies": {
                "postcss": "^7.0.2"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-focus-within": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
            "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
            "dependencies": {
                "postcss": "^7.0.2"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-font-variant": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz",
            "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==",
            "dependencies": {
                "postcss": "^7.0.2"
            }
        },
        "node_modules/postcss-gap-properties": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
            "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
            "dependencies": {
                "postcss": "^7.0.2"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-image-set-function": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
            "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-initial": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz",
            "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==",
            "dependencies": {
                "lodash.template": "^4.5.0",
                "postcss": "^7.0.2"
            }
        },
        "node_modules/postcss-lab-function": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
            "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
            "dependencies": {
                "@csstools/convert-colors": "^1.4.0",
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "cosmiconfig": "^5.0.0",
                "import-cwd": "^2.0.0"
            },
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/postcss-loader": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
            "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
            "dependencies": {
                "loader-utils": "^1.1.0",
                "postcss": "^7.0.0",
                "postcss-load-config": "^2.0.0",
                "schema-utils": "^1.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/postcss-loader/node_modules/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==",
            "dependencies": {
                "ajv": "^6.1.0",
                "ajv-errors": "^1.0.0",
                "ajv-keywords": "^3.1.0"
            },
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/postcss-logical": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
            "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
            "dependencies": {
                "postcss": "^7.0.2"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-media-minmax": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
            "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
            "dependencies": {
                "postcss": "^7.0.2"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-merge-longhand": {
            "version": "4.0.11",
            "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
            "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
            "dependencies": {
                "css-color-names": "0.0.4",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0",
                "stylehacks": "^4.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-merge-longhand/node_modules/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=="
        },
        "node_modules/postcss-merge-rules": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
            "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
            "dependencies": {
                "browserslist": "^4.0.0",
                "caniuse-api": "^3.0.0",
                "cssnano-util-same-parent": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-selector-parser": "^3.0.0",
                "vendors": "^1.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
            "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
            "dependencies": {
                "dot-prop": "^5.2.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/postcss-minify-font-values": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
            "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
            "dependencies": {
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-minify-font-values/node_modules/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=="
        },
        "node_modules/postcss-minify-gradients": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
            "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
            "dependencies": {
                "cssnano-util-get-arguments": "^4.0.0",
                "is-color-stop": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-minify-gradients/node_modules/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=="
        },
        "node_modules/postcss-minify-params": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
            "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
            "dependencies": {
                "alphanum-sort": "^1.0.0",
                "browserslist": "^4.0.0",
                "cssnano-util-get-arguments": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0",
                "uniqs": "^2.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-minify-params/node_modules/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=="
        },
        "node_modules/postcss-minify-selectors": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
            "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
            "dependencies": {
                "alphanum-sort": "^1.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-selector-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
            "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
            "dependencies": {
                "dot-prop": "^5.2.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/postcss-modules-extract-imports": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
            "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
            "dependencies": {
                "postcss": "^7.0.5"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/postcss-modules-local-by-default": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
            "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
            "dependencies": {
                "icss-utils": "^4.1.1",
                "postcss": "^7.0.32",
                "postcss-selector-parser": "^6.0.2",
                "postcss-value-parser": "^4.1.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/postcss-modules-scope": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
            "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
            "dependencies": {
                "postcss": "^7.0.6",
                "postcss-selector-parser": "^6.0.0"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/postcss-modules-values": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
            "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
            "dependencies": {
                "icss-utils": "^4.0.0",
                "postcss": "^7.0.6"
            }
        },
        "node_modules/postcss-nesting": {
            "version": "7.0.1",
            "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
            "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
            "dependencies": {
                "postcss": "^7.0.2"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-normalize": {
            "version": "8.0.1",
            "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz",
            "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==",
            "dependencies": {
                "@csstools/normalize.css": "^10.1.0",
                "browserslist": "^4.6.2",
                "postcss": "^7.0.17",
                "postcss-browser-comments": "^3.0.0",
                "sanitize.css": "^10.0.0"
            },
            "engines": {
                "node": ">=8.0.0"
            }
        },
        "node_modules/postcss-normalize-charset": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
            "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
            "dependencies": {
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-display-values": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
            "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
            "dependencies": {
                "cssnano-util-get-match": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-display-values/node_modules/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=="
        },
        "node_modules/postcss-normalize-positions": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
            "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
            "dependencies": {
                "cssnano-util-get-arguments": "^4.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-positions/node_modules/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=="
        },
        "node_modules/postcss-normalize-repeat-style": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
            "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
            "dependencies": {
                "cssnano-util-get-arguments": "^4.0.0",
                "cssnano-util-get-match": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-repeat-style/node_modules/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=="
        },
        "node_modules/postcss-normalize-string": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
            "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
            "dependencies": {
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-string/node_modules/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=="
        },
        "node_modules/postcss-normalize-timing-functions": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
            "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
            "dependencies": {
                "cssnano-util-get-match": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-timing-functions/node_modules/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=="
        },
        "node_modules/postcss-normalize-unicode": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
            "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
            "dependencies": {
                "browserslist": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-unicode/node_modules/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=="
        },
        "node_modules/postcss-normalize-url": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
            "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
            "dependencies": {
                "is-absolute-url": "^2.0.0",
                "normalize-url": "^3.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-url/node_modules/normalize-url": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
            "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/postcss-normalize-url/node_modules/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=="
        },
        "node_modules/postcss-normalize-whitespace": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
            "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
            "dependencies": {
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-normalize-whitespace/node_modules/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=="
        },
        "node_modules/postcss-ordered-values": {
            "version": "4.1.2",
            "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
            "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
            "dependencies": {
                "cssnano-util-get-arguments": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-ordered-values/node_modules/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=="
        },
        "node_modules/postcss-overflow-shorthand": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
            "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
            "dependencies": {
                "postcss": "^7.0.2"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-page-break": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
            "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
            "dependencies": {
                "postcss": "^7.0.2"
            }
        },
        "node_modules/postcss-place": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
            "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-preset-env": {
            "version": "6.7.0",
            "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
            "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
            "dependencies": {
                "autoprefixer": "^9.6.1",
                "browserslist": "^4.6.4",
                "caniuse-lite": "^1.0.30000981",
                "css-blank-pseudo": "^0.1.4",
                "css-has-pseudo": "^0.10.0",
                "css-prefers-color-scheme": "^3.1.1",
                "cssdb": "^4.4.0",
                "postcss": "^7.0.17",
                "postcss-attribute-case-insensitive": "^4.0.1",
                "postcss-color-functional-notation": "^2.0.1",
                "postcss-color-gray": "^5.0.0",
                "postcss-color-hex-alpha": "^5.0.3",
                "postcss-color-mod-function": "^3.0.3",
                "postcss-color-rebeccapurple": "^4.0.1",
                "postcss-custom-media": "^7.0.8",
                "postcss-custom-properties": "^8.0.11",
                "postcss-custom-selectors": "^5.1.2",
                "postcss-dir-pseudo-class": "^5.0.0",
                "postcss-double-position-gradients": "^1.0.0",
                "postcss-env-function": "^2.0.2",
                "postcss-focus-visible": "^4.0.0",
                "postcss-focus-within": "^3.0.0",
                "postcss-font-variant": "^4.0.0",
                "postcss-gap-properties": "^2.0.0",
                "postcss-image-set-function": "^3.0.1",
                "postcss-initial": "^3.0.0",
                "postcss-lab-function": "^2.0.1",
                "postcss-logical": "^3.0.0",
                "postcss-media-minmax": "^4.0.0",
                "postcss-nesting": "^7.0.0",
                "postcss-overflow-shorthand": "^2.0.0",
                "postcss-page-break": "^2.0.0",
                "postcss-place": "^4.0.1",
                "postcss-pseudo-class-any-link": "^6.0.0",
                "postcss-replace-overflow-wrap": "^3.0.0",
                "postcss-selector-matches": "^4.0.0",
                "postcss-selector-not": "^4.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-pseudo-class-any-link": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
            "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
            "dependencies": {
                "postcss": "^7.0.2",
                "postcss-selector-parser": "^5.0.0-rc.3"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
            "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
            "bin": {
                "cssesc": "bin/cssesc"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
            "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
            "dependencies": {
                "cssesc": "^2.0.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/postcss-reduce-initial": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
            "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
            "dependencies": {
                "browserslist": "^4.0.0",
                "caniuse-api": "^3.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-reduce-transforms": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
            "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
            "dependencies": {
                "cssnano-util-get-match": "^4.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-reduce-transforms/node_modules/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=="
        },
        "node_modules/postcss-replace-overflow-wrap": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
            "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
            "dependencies": {
                "postcss": "^7.0.2"
            }
        },
        "node_modules/postcss-safe-parser": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz",
            "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==",
            "dependencies": {
                "postcss": "^7.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/postcss-selector-matches": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
            "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
            "dependencies": {
                "balanced-match": "^1.0.0",
                "postcss": "^7.0.2"
            }
        },
        "node_modules/postcss-selector-not": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz",
            "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==",
            "dependencies": {
                "balanced-match": "^1.0.0",
                "postcss": "^7.0.2"
            }
        },
        "node_modules/postcss-selector-parser": {
            "version": "6.0.2",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
            "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
            "dependencies": {
                "cssesc": "^3.0.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/postcss-svgo": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz",
            "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==",
            "dependencies": {
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0",
                "svgo": "^1.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-svgo/node_modules/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=="
        },
        "node_modules/postcss-unique-selectors": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
            "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
            "dependencies": {
                "alphanum-sort": "^1.0.0",
                "postcss": "^7.0.0",
                "uniqs": "^2.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/postcss-value-parser": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
            "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
        },
        "node_modules/postcss-values-parser": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
            "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
            "dependencies": {
                "flatten": "^1.0.2",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=6.14.4"
            }
        },
        "node_modules/postcss/node_modules/picocolors": {
            "version": "0.2.1",
            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
            "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
        },
        "node_modules/prelude-ls": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
            "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/prepend-http": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
            "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/pretty-bytes": {
            "version": "5.3.0",
            "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
            "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/pretty-error": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
            "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
            "dependencies": {
                "renderkid": "^2.0.1",
                "utila": "~0.4"
            }
        },
        "node_modules/pretty-format": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
            "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
            "dependencies": {
                "@jest/types": "^24.9.0",
                "ansi-regex": "^4.0.0",
                "ansi-styles": "^3.2.0",
                "react-is": "^16.8.4"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/process": {
            "version": "0.11.10",
            "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
            "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
            "engines": {
                "node": ">= 0.6.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/progress": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
            "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/promise": {
            "version": "8.1.0",
            "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
            "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
            "dependencies": {
                "asap": "~2.0.6"
            }
        },
        "node_modules/promise-inflight": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
            "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
        },
        "node_modules/prompts": {
            "version": "2.3.2",
            "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz",
            "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==",
            "dependencies": {
                "kleur": "^3.0.3",
                "sisteransi": "^1.0.4"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/prop-types": {
            "version": "15.7.2",
            "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
            "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
            "dependencies": {
                "loose-envify": "^1.4.0",
                "object-assign": "^4.1.1",
                "react-is": "^16.8.1"
            }
        },
        "node_modules/proxy-addr": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
            "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
            "dependencies": {
                "forwarded": "~0.1.2",
                "ipaddr.js": "1.9.1"
            },
            "engines": {
                "node": ">= 0.10"
            }
        },
        "node_modules/prr": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
            "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
        },
        "node_modules/psl": {
            "version": "1.8.0",
            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
        },
        "node_modules/public-encrypt": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
            "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/public-encrypt/node_modules/bn.js": {
            "version": "4.11.9",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
            "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
        },
        "node_modules/pump": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
            "dependencies": {
                "end-of-stream": "^1.1.0",
                "once": "^1.3.1"
            }
        },
        "node_modules/pumpify": {
            "version": "1.5.1",
            "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
            "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
            "dependencies": {
                "duplexify": "^3.6.0",
                "inherits": "^2.0.3",
                "pump": "^2.0.0"
            }
        },
        "node_modules/pumpify/node_modules/pump": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
            "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
            "dependencies": {
                "end-of-stream": "^1.1.0",
                "once": "^1.3.1"
            }
        },
        "node_modules/punycode": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/q": {
            "version": "1.5.1",
            "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
            "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
            "engines": {
                "node": ">=0.6.0",
                "teleport": ">=0.2.0"
            }
        },
        "node_modules/qs": {
            "version": "6.5.2",
            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
            "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
            "engines": {
                "node": ">=0.6"
            }
        },
        "node_modules/query-string": {
            "version": "4.3.4",
            "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
            "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
            "dependencies": {
                "object-assign": "^4.1.0",
                "strict-uri-encode": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/querystring": {
            "version": "0.2.0",
            "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
            "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
            "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
            "engines": {
                "node": ">=0.4.x"
            }
        },
        "node_modules/querystring-es3": {
            "version": "0.2.1",
            "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
            "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
            "engines": {
                "node": ">=0.4.x"
            }
        },
        "node_modules/querystringify": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
            "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="
        },
        "node_modules/raf": {
            "version": "3.4.1",
            "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
            "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
            "dependencies": {
                "performance-now": "^2.1.0"
            }
        },
        "node_modules/randombytes": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
            "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
            "dependencies": {
                "safe-buffer": "^5.1.0"
            }
        },
        "node_modules/randomfill": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
            "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
            "dependencies": {
                "randombytes": "^2.0.5",
                "safe-buffer": "^5.1.0"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "bytes": "3.1.0",
                "http-errors": "1.7.2",
                "iconv-lite": "0.4.24",
                "unpipe": "1.0.0"
            },
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/raw-body/node_modules/bytes": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
            "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/react": {
            "version": "16.13.1",
            "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
            "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
            "dependencies": {
                "loose-envify": "^1.1.0",
                "object-assign": "^4.1.1",
                "prop-types": "^15.6.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/react-app-polyfill": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz",
            "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==",
            "dependencies": {
                "core-js": "^3.5.0",
                "object-assign": "^4.1.1",
                "promise": "^8.0.3",
                "raf": "^3.4.1",
                "regenerator-runtime": "^0.13.3",
                "whatwg-fetch": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/react-dev-utils": {
            "version": "10.2.1",
            "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz",
            "integrity": "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==",
            "dependencies": {
                "@babel/code-frame": "7.8.3",
                "address": "1.1.2",
                "browserslist": "4.10.0",
                "chalk": "2.4.2",
                "cross-spawn": "7.0.1",
                "detect-port-alt": "1.1.6",
                "escape-string-regexp": "2.0.0",
                "filesize": "6.0.1",
                "find-up": "4.1.0",
                "fork-ts-checker-webpack-plugin": "3.1.1",
                "global-modules": "2.0.0",
                "globby": "8.0.2",
                "gzip-size": "5.1.1",
                "immer": "1.10.0",
                "inquirer": "7.0.4",
                "is-root": "2.1.0",
                "loader-utils": "1.2.3",
                "open": "^7.0.2",
                "pkg-up": "3.1.0",
                "react-error-overlay": "^6.0.7",
                "recursive-readdir": "2.2.2",
                "shell-quote": "1.7.2",
                "strip-ansi": "6.0.0",
                "text-table": "0.2.0"
            },
            "engines": {
                "node": ">=8.10"
            }
        },
        "node_modules/react-dev-utils/node_modules/@babel/code-frame": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
            "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
            "dependencies": {
                "@babel/highlight": "^7.8.3"
            }
        },
        "node_modules/react-dev-utils/node_modules/browserslist": {
            "version": "4.10.0",
            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz",
            "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==",
            "dependencies": {
                "caniuse-lite": "^1.0.30001035",
                "electron-to-chromium": "^1.3.378",
                "node-releases": "^1.1.52",
                "pkg-up": "^3.1.0"
            },
            "bin": {
                "browserslist": "cli.js"
            },
            "funding": {
                "type": "tidelift",
                "url": "https://tidelift.com/funding/github/npm/browserslist"
            }
        },
        "node_modules/react-dev-utils/node_modules/cli-width": {
            "version": "2.2.1",
            "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
            "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
        },
        "node_modules/react-dev-utils/node_modules/cross-spawn": {
            "version": "7.0.1",
            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
            "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
            "dependencies": {
                "path-key": "^3.1.0",
                "shebang-command": "^2.0.0",
                "which": "^2.0.1"
            },
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/react-dev-utils/node_modules/emojis-list": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
            "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
            "engines": {
                "node": ">= 0.10"
            }
        },
        "node_modules/react-dev-utils/node_modules/escape-string-regexp": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
            "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/find-up": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
            "dependencies": {
                "locate-path": "^5.0.0",
                "path-exists": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/inquirer": {
            "version": "7.0.4",
            "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz",
            "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==",
            "dependencies": {
                "ansi-escapes": "^4.2.1",
                "chalk": "^2.4.2",
                "cli-cursor": "^3.1.0",
                "cli-width": "^2.0.0",
                "external-editor": "^3.0.3",
                "figures": "^3.0.0",
                "lodash": "^4.17.15",
                "mute-stream": "0.0.8",
                "run-async": "^2.2.0",
                "rxjs": "^6.5.3",
                "string-width": "^4.1.0",
                "strip-ansi": "^5.1.0",
                "through": "^2.3.6"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/react-dev-utils/node_modules/inquirer/node_modules/strip-ansi": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
            "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
            "dependencies": {
                "ansi-regex": "^4.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/react-dev-utils/node_modules/json5": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
            "dependencies": {
                "minimist": "^1.2.0"
            },
            "bin": {
                "json5": "lib/cli.js"
            }
        },
        "node_modules/react-dev-utils/node_modules/loader-utils": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
            "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
            "dependencies": {
                "big.js": "^5.2.2",
                "emojis-list": "^2.0.0",
                "json5": "^1.0.1"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/react-dev-utils/node_modules/locate-path": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
            "dependencies": {
                "p-locate": "^4.1.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/p-locate": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
            "dependencies": {
                "p-limit": "^2.2.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/path-exists": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/path-key": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/shebang-command": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
            "dependencies": {
                "shebang-regex": "^3.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/shebang-regex": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/strip-ansi": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
            "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
            "dependencies": {
                "ansi-regex": "^5.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/strip-ansi/node_modules/ansi-regex": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/react-dev-utils/node_modules/which": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
            "dependencies": {
                "isexe": "^2.0.0"
            },
            "bin": {
                "node-which": "bin/node-which"
            },
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/react-dom": {
            "version": "16.13.1",
            "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
            "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
            "dependencies": {
                "loose-envify": "^1.1.0",
                "object-assign": "^4.1.1",
                "prop-types": "^15.6.2",
                "scheduler": "^0.19.1"
            },
            "peerDependencies": {
                "react": "^16.13.1"
            }
        },
        "node_modules/react-error-overlay": {
            "version": "6.0.7",
            "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz",
            "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA=="
        },
        "node_modules/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=="
        },
        "node_modules/react-router": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz",
            "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==",
            "dependencies": {
                "@babel/runtime": "^7.1.2",
                "history": "^4.9.0",
                "hoist-non-react-statics": "^3.1.0",
                "loose-envify": "^1.3.1",
                "mini-create-react-context": "^0.4.0",
                "path-to-regexp": "^1.7.0",
                "prop-types": "^15.6.2",
                "react-is": "^16.6.0",
                "tiny-invariant": "^1.0.2",
                "tiny-warning": "^1.0.0"
            },
            "peerDependencies": {
                "react": ">=15"
            }
        },
        "node_modules/react-router-dom": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz",
            "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==",
            "dependencies": {
                "@babel/runtime": "^7.1.2",
                "history": "^4.9.0",
                "loose-envify": "^1.3.1",
                "prop-types": "^15.6.2",
                "react-router": "5.2.0",
                "tiny-invariant": "^1.0.2",
                "tiny-warning": "^1.0.0"
            },
            "peerDependencies": {
                "react": ">=15"
            }
        },
        "node_modules/react-scripts": {
            "version": "3.4.1",
            "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz",
            "integrity": "sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ==",
            "dependencies": {
                "@babel/core": "7.9.0",
                "@svgr/webpack": "4.3.3",
                "@typescript-eslint/eslint-plugin": "^2.10.0",
                "@typescript-eslint/parser": "^2.10.0",
                "babel-eslint": "10.1.0",
                "babel-jest": "^24.9.0",
                "babel-loader": "8.1.0",
                "babel-plugin-named-asset-import": "^0.3.6",
                "babel-preset-react-app": "^9.1.2",
                "camelcase": "^5.3.1",
                "case-sensitive-paths-webpack-plugin": "2.3.0",
                "css-loader": "3.4.2",
                "dotenv": "8.2.0",
                "dotenv-expand": "5.1.0",
                "eslint": "^6.6.0",
                "eslint-config-react-app": "^5.2.1",
                "eslint-loader": "3.0.3",
                "eslint-plugin-flowtype": "4.6.0",
                "eslint-plugin-import": "2.20.1",
                "eslint-plugin-jsx-a11y": "6.2.3",
                "eslint-plugin-react": "7.19.0",
                "eslint-plugin-react-hooks": "^1.6.1",
                "file-loader": "4.3.0",
                "fs-extra": "^8.1.0",
                "html-webpack-plugin": "4.0.0-beta.11",
                "identity-obj-proxy": "3.0.0",
                "jest": "24.9.0",
                "jest-environment-jsdom-fourteen": "1.0.1",
                "jest-resolve": "24.9.0",
                "jest-watch-typeahead": "0.4.2",
                "mini-css-extract-plugin": "0.9.0",
                "optimize-css-assets-webpack-plugin": "5.0.3",
                "pnp-webpack-plugin": "1.6.4",
                "postcss-flexbugs-fixes": "4.1.0",
                "postcss-loader": "3.0.0",
                "postcss-normalize": "8.0.1",
                "postcss-preset-env": "6.7.0",
                "postcss-safe-parser": "4.0.1",
                "react-app-polyfill": "^1.0.6",
                "react-dev-utils": "^10.2.1",
                "resolve": "1.15.0",
                "resolve-url-loader": "3.1.1",
                "sass-loader": "8.0.2",
                "semver": "6.3.0",
                "style-loader": "0.23.1",
                "terser-webpack-plugin": "2.3.5",
                "ts-pnp": "1.1.6",
                "url-loader": "2.3.0",
                "webpack": "4.42.0",
                "webpack-dev-server": "3.10.3",
                "webpack-manifest-plugin": "2.2.0",
                "workbox-webpack-plugin": "4.3.1"
            },
            "bin": {
                "react-scripts": "bin/react-scripts.js"
            },
            "engines": {
                "node": ">=8.10"
            },
            "optionalDependencies": {
                "fsevents": "2.1.2"
            },
            "peerDependencies": {
                "typescript": "^3.2.1"
            },
            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }
            }
        },
        "node_modules/react-transition-group": {
            "version": "4.4.1",
            "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz",
            "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==",
            "dependencies": {
                "@babel/runtime": "^7.5.5",
                "dom-helpers": "^5.0.1",
                "loose-envify": "^1.4.0",
                "prop-types": "^15.6.2"
            },
            "peerDependencies": {
                "react": ">=16.6.0",
                "react-dom": ">=16.6.0"
            }
        },
        "node_modules/read-pkg": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
            "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
            "dependencies": {
                "load-json-file": "^4.0.0",
                "normalize-package-data": "^2.3.2",
                "path-type": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/read-pkg-up": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
            "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
            "dependencies": {
                "find-up": "^3.0.0",
                "read-pkg": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "inherits": "^2.0.3",
                "string_decoder": "^1.1.1",
                "util-deprecate": "^1.0.1"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/readdirp": {
            "version": "3.4.0",
            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
            "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
            "dependencies": {
                "picomatch": "^2.2.1"
            },
            "engines": {
                "node": ">=8.10.0"
            }
        },
        "node_modules/realpath-native": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz",
            "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==",
            "dependencies": {
                "util.promisify": "^1.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/recursive-readdir": {
            "version": "2.2.2",
            "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
            "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
            "dependencies": {
                "minimatch": "3.0.4"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/redent": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
            "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
            "dependencies": {
                "indent-string": "^4.0.0",
                "strip-indent": "^3.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/regenerate": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
            "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A=="
        },
        "node_modules/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==",
            "dependencies": {
                "regenerate": "^1.4.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/regenerator-runtime": {
            "version": "0.13.7",
            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
            "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
        },
        "node_modules/regenerator-transform": {
            "version": "0.14.5",
            "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
            "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
            "dependencies": {
                "@babel/runtime": "^7.8.4"
            }
        },
        "node_modules/regex-not": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
            "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
            "dependencies": {
                "extend-shallow": "^3.0.2",
                "safe-regex": "^1.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/regex-parser": {
            "version": "2.2.10",
            "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz",
            "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA=="
        },
        "node_modules/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==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0-next.1"
            },
            "engines": {
                "node": ">= 0.4"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/regexpp": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
            "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/mysticatea"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/regjsgen": {
            "version": "0.5.2",
            "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
            "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
        },
        "node_modules/regjsparser": {
            "version": "0.6.4",
            "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
            "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
            "dependencies": {
                "jsesc": "~0.5.0"
            },
            "bin": {
                "regjsparser": "bin/parser"
            }
        },
        "node_modules/regjsparser/node_modules/jsesc": {
            "version": "0.5.0",
            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
            "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
            "bin": {
                "jsesc": "bin/jsesc"
            }
        },
        "node_modules/relateurl": {
            "version": "0.2.7",
            "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
            "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
            "engines": {
                "node": ">= 0.10"
            }
        },
        "node_modules/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="
        },
        "node_modules/renderkid": {
            "version": "2.0.7",
            "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz",
            "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==",
            "dependencies": {
                "css-select": "^4.1.3",
                "dom-converter": "^0.2.0",
                "htmlparser2": "^6.1.0",
                "lodash": "^4.17.21",
                "strip-ansi": "^3.0.1"
            }
        },
        "node_modules/renderkid/node_modules/ansi-regex": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/renderkid/node_modules/css-select": {
            "version": "4.1.3",
            "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
            "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==",
            "dependencies": {
                "boolbase": "^1.0.0",
                "css-what": "^5.0.0",
                "domhandler": "^4.2.0",
                "domutils": "^2.6.0",
                "nth-check": "^2.0.0"
            },
            "funding": {
                "url": "https://github.com/sponsors/fb55"
            }
        },
        "node_modules/renderkid/node_modules/css-what": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
            "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
            "engines": {
                "node": ">= 6"
            },
            "funding": {
                "url": "https://github.com/sponsors/fb55"
            }
        },
        "node_modules/renderkid/node_modules/dom-serializer": {
            "version": "1.3.2",
            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
            "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
            "dependencies": {
                "domelementtype": "^2.0.1",
                "domhandler": "^4.2.0",
                "entities": "^2.0.0"
            },
            "funding": {
                "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
            }
        },
        "node_modules/renderkid/node_modules/domelementtype": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
            "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/fb55"
                }
            ]
        },
        "node_modules/renderkid/node_modules/domutils": {
            "version": "2.8.0",
            "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
            "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
            "dependencies": {
                "dom-serializer": "^1.0.1",
                "domelementtype": "^2.2.0",
                "domhandler": "^4.2.0"
            },
            "funding": {
                "url": "https://github.com/fb55/domutils?sponsor=1"
            }
        },
        "node_modules/renderkid/node_modules/nth-check": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
            "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
            "dependencies": {
                "boolbase": "^1.0.0"
            },
            "funding": {
                "url": "https://github.com/fb55/nth-check?sponsor=1"
            }
        },
        "node_modules/renderkid/node_modules/strip-ansi": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
            "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
            "dependencies": {
                "ansi-regex": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/repeat-element": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
            "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/repeat-string": {
            "version": "1.6.1",
            "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
            "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
            "engines": {
                "node": ">=0.10"
            }
        },
        "node_modules/request": {
            "version": "2.88.2",
            "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
            "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
            "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/request-promise-core": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
            "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
            "dependencies": {
                "lodash": "^4.17.19"
            },
            "engines": {
                "node": ">=0.10.0"
            },
            "peerDependencies": {
                "request": "^2.34"
            }
        },
        "node_modules/request-promise-native": {
            "version": "1.0.9",
            "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
            "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
            "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142",
            "dependencies": {
                "request-promise-core": "1.1.4",
                "stealthy-require": "^1.1.1",
                "tough-cookie": "^2.3.3"
            },
            "engines": {
                "node": ">=0.12.0"
            },
            "peerDependencies": {
                "request": "^2.34"
            }
        },
        "node_modules/require-directory": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
            "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/require-main-filename": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
        },
        "node_modules/requires-port": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
            "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
        },
        "node_modules/resolve": {
            "version": "1.15.0",
            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
            "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
            "dependencies": {
                "path-parse": "^1.0.6"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/resolve-cwd": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
            "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
            "dependencies": {
                "resolve-from": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/resolve-from": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
            "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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=="
        },
        "node_modules/resolve-url": {
            "version": "0.2.1",
            "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
            "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
            "deprecated": "https://github.com/lydell/resolve-url#deprecated"
        },
        "node_modules/resolve-url-loader": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz",
            "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==",
            "dependencies": {
                "adjust-sourcemap-loader": "2.0.0",
                "camelcase": "5.3.1",
                "compose-function": "3.0.3",
                "convert-source-map": "1.7.0",
                "es6-iterator": "2.0.3",
                "loader-utils": "1.2.3",
                "postcss": "7.0.21",
                "rework": "1.0.1",
                "rework-visit": "1.0.0",
                "source-map": "0.6.1"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/resolve-url-loader/node_modules/emojis-list": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
            "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
            "engines": {
                "node": ">= 0.10"
            }
        },
        "node_modules/resolve-url-loader/node_modules/json5": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
            "dependencies": {
                "minimist": "^1.2.0"
            },
            "bin": {
                "json5": "lib/cli.js"
            }
        },
        "node_modules/resolve-url-loader/node_modules/loader-utils": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
            "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
            "dependencies": {
                "big.js": "^5.2.2",
                "emojis-list": "^2.0.0",
                "json5": "^1.0.1"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/resolve-url-loader/node_modules/postcss": {
            "version": "7.0.21",
            "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz",
            "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==",
            "dependencies": {
                "chalk": "^2.4.2",
                "source-map": "^0.6.1",
                "supports-color": "^6.1.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/resolve-url-loader/node_modules/supports-color": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
            "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
            "dependencies": {
                "has-flag": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/restore-cursor": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
            "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
            "dependencies": {
                "onetime": "^5.1.0",
                "signal-exit": "^3.0.2"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/ret": {
            "version": "0.1.15",
            "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
            "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
            "engines": {
                "node": ">=0.12"
            }
        },
        "node_modules/retry": {
            "version": "0.12.0",
            "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
            "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/rework": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz",
            "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=",
            "dependencies": {
                "convert-source-map": "^0.3.3",
                "css": "^2.0.0"
            }
        },
        "node_modules/rework-visit": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz",
            "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo="
        },
        "node_modules/rework/node_modules/convert-source-map": {
            "version": "0.3.5",
            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz",
            "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA="
        },
        "node_modules/rgb-regex": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
            "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE="
        },
        "node_modules/rgba-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
            "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM="
        },
        "node_modules/rimraf": {
            "version": "2.6.3",
            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
            "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
            "dependencies": {
                "glob": "^7.1.3"
            },
            "bin": {
                "rimraf": "bin.js"
            }
        },
        "node_modules/ripemd160": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
            "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
            "dependencies": {
                "hash-base": "^3.0.0",
                "inherits": "^2.0.1"
            }
        },
        "node_modules/rsvp": {
            "version": "4.8.5",
            "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
            "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
            "engines": {
                "node": "6.* || >= 7.*"
            }
        },
        "node_modules/run-async": {
            "version": "2.4.1",
            "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
            "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
            "engines": {
                "node": ">=0.12.0"
            }
        },
        "node_modules/run-queue": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
            "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
            "dependencies": {
                "aproba": "^1.1.1"
            }
        },
        "node_modules/rxjs": {
            "version": "6.6.2",
            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
            "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
            "dependencies": {
                "tslib": "^1.9.0"
            },
            "engines": {
                "npm": ">=2.0.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/safe-regex": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
            "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
            "dependencies": {
                "ret": "~0.1.10"
            }
        },
        "node_modules/safer-buffer": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
        },
        "node_modules/sane": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
            "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
            "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added",
            "dependencies": {
                "@cnakazawa/watch": "^1.0.3",
                "anymatch": "^2.0.0",
                "capture-exit": "^2.0.0",
                "exec-sh": "^0.3.2",
                "execa": "^1.0.0",
                "fb-watchman": "^2.0.0",
                "micromatch": "^3.1.4",
                "minimist": "^1.1.1",
                "walker": "~1.0.5"
            },
            "bin": {
                "sane": "src/cli.js"
            },
            "engines": {
                "node": "6.* || 8.* || >= 10.*"
            }
        },
        "node_modules/sanitize.css": {
            "version": "10.0.0",
            "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz",
            "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg=="
        },
        "node_modules/sass-loader": {
            "version": "8.0.2",
            "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
            "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
            "dependencies": {
                "clone-deep": "^4.0.1",
                "loader-utils": "^1.2.3",
                "neo-async": "^2.6.1",
                "schema-utils": "^2.6.1",
                "semver": "^6.3.0"
            },
            "engines": {
                "node": ">= 8.9.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/webpack"
            },
            "peerDependencies": {
                "fibers": ">= 3.1.0",
                "node-sass": "^4.0.0",
                "sass": "^1.3.0",
                "webpack": "^4.36.0 || ^5.0.0"
            },
            "peerDependenciesMeta": {
                "fibers": {
                    "optional": true
                },
                "node-sass": {
                    "optional": true
                },
                "sass": {
                    "optional": true
                }
            }
        },
        "node_modules/sass-loader/node_modules/clone-deep": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
            "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
            "dependencies": {
                "is-plain-object": "^2.0.4",
                "kind-of": "^6.0.2",
                "shallow-clone": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/sass-loader/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/sass-loader/node_modules/shallow-clone": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
            "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
            "dependencies": {
                "kind-of": "^6.0.2"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/sax": {
            "version": "1.2.4",
            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
        },
        "node_modules/saxes": {
            "version": "3.1.11",
            "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
            "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
            "dependencies": {
                "xmlchars": "^2.1.1"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/scheduler": {
            "version": "0.19.1",
            "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
            "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
            "dependencies": {
                "loose-envify": "^1.1.0",
                "object-assign": "^4.1.1"
            }
        },
        "node_modules/schema-utils": {
            "version": "2.7.0",
            "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
            "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
            "dependencies": {
                "@types/json-schema": "^7.0.4",
                "ajv": "^6.12.2",
                "ajv-keywords": "^3.4.1"
            },
            "engines": {
                "node": ">= 8.9.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/webpack"
            }
        },
        "node_modules/select-hose": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
            "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
        },
        "node_modules/selfsigned": {
            "version": "1.10.11",
            "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz",
            "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==",
            "dependencies": {
                "node-forge": "^0.10.0"
            }
        },
        "node_modules/semver": {
            "version": "6.3.0",
            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
            "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
            "bin": {
                "semver": "bin/semver.js"
            }
        },
        "node_modules/send": {
            "version": "0.17.1",
            "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
            "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/send/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/send/node_modules/debug/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/send/node_modules/mime": {
            "version": "1.6.0",
            "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
            "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
            "bin": {
                "mime": "cli.js"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/send/node_modules/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=="
        },
        "node_modules/serialize-javascript": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
            "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ=="
        },
        "node_modules/serve-index": {
            "version": "1.9.1",
            "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
            "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/serve-index/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/serve-index/node_modules/http-errors": {
            "version": "1.6.3",
            "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
            "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
            "dependencies": {
                "depd": "~1.1.2",
                "inherits": "2.0.3",
                "setprototypeof": "1.1.0",
                "statuses": ">= 1.4.0 < 2"
            },
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/serve-index/node_modules/inherits": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
            "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
        },
        "node_modules/serve-index/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/serve-index/node_modules/setprototypeof": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
            "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
        },
        "node_modules/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==",
            "dependencies": {
                "encodeurl": "~1.0.2",
                "escape-html": "~1.0.3",
                "parseurl": "~1.3.3",
                "send": "0.17.1"
            },
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/set-blocking": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
            "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
        },
        "node_modules/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==",
            "dependencies": {
                "extend-shallow": "^2.0.1",
                "is-extendable": "^0.1.1",
                "is-plain-object": "^2.0.3",
                "split-string": "^3.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/set-value/node_modules/extend-shallow": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
            "dependencies": {
                "is-extendable": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/setimmediate": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
            "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
        },
        "node_modules/setprototypeof": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
            "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
        },
        "node_modules/sha.js": {
            "version": "2.4.11",
            "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
            "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
            "dependencies": {
                "inherits": "^2.0.1",
                "safe-buffer": "^5.0.1"
            },
            "bin": {
                "sha.js": "bin.js"
            }
        },
        "node_modules/shallow-clone": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
            "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=",
            "dependencies": {
                "is-extendable": "^0.1.1",
                "kind-of": "^2.0.1",
                "lazy-cache": "^0.2.3",
                "mixin-object": "^2.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/shallow-clone/node_modules/kind-of": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
            "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=",
            "dependencies": {
                "is-buffer": "^1.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/shallow-clone/node_modules/lazy-cache": {
            "version": "0.2.7",
            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
            "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/shebang-command": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
            "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
            "dependencies": {
                "shebang-regex": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/shebang-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
            "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/shell-quote": {
            "version": "1.7.2",
            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
            "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
        },
        "node_modules/shellwords": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
            "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="
        },
        "node_modules/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==",
            "dependencies": {
                "es-abstract": "^1.17.0-next.1",
                "object-inspect": "^1.7.0"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/signal-exit": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
            "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
        },
        "node_modules/simple-swizzle": {
            "version": "0.2.2",
            "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
            "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
            "dependencies": {
                "is-arrayish": "^0.3.1"
            }
        },
        "node_modules/simple-swizzle/node_modules/is-arrayish": {
            "version": "0.3.2",
            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
            "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
        },
        "node_modules/sisteransi": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
            "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
        },
        "node_modules/slash": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
            "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/slice-ansi": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
            "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
            "dependencies": {
                "ansi-styles": "^3.2.0",
                "astral-regex": "^1.0.0",
                "is-fullwidth-code-point": "^2.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/slice-ansi/node_modules/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=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/snapdragon": {
            "version": "0.8.2",
            "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
            "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
            "dependencies": {
                "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"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "define-property": "^1.0.0",
                "isobject": "^3.0.0",
                "snapdragon-util": "^3.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon-node/node_modules/define-property": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
            "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
            "dependencies": {
                "is-descriptor": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon-node/node_modules/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==",
            "dependencies": {
                "kind-of": "^6.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon-node/node_modules/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==",
            "dependencies": {
                "kind-of": "^6.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon-node/node_modules/is-descriptor": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
            "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
            "dependencies": {
                "is-accessor-descriptor": "^1.0.0",
                "is-data-descriptor": "^1.0.0",
                "kind-of": "^6.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon-node/node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon-util": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
            "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
            "dependencies": {
                "kind-of": "^3.2.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon/node_modules/debug": {
            "version": "2.6.9",
            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
            "dependencies": {
                "ms": "2.0.0"
            }
        },
        "node_modules/snapdragon/node_modules/define-property": {
            "version": "0.2.5",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
            "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
            "dependencies": {
                "is-descriptor": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon/node_modules/extend-shallow": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
            "dependencies": {
                "is-extendable": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/snapdragon/node_modules/ms": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "node_modules/snapdragon/node_modules/source-map": {
            "version": "0.5.7",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
            "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/sockjs": {
            "version": "0.3.19",
            "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
            "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
            "dependencies": {
                "faye-websocket": "^0.10.0",
                "uuid": "^3.0.1"
            }
        },
        "node_modules/sockjs-client": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
            "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
            "dependencies": {
                "debug": "^3.2.5",
                "eventsource": "^1.0.7",
                "faye-websocket": "~0.11.1",
                "inherits": "^2.0.3",
                "json3": "^3.3.2",
                "url-parse": "^1.4.3"
            }
        },
        "node_modules/sockjs-client/node_modules/debug": {
            "version": "3.2.6",
            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
            "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
            "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
            "dependencies": {
                "ms": "^2.1.1"
            }
        },
        "node_modules/sockjs-client/node_modules/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==",
            "dependencies": {
                "websocket-driver": ">=0.5.1"
            },
            "engines": {
                "node": ">=0.8.0"
            }
        },
        "node_modules/sort-keys": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
            "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
            "dependencies": {
                "is-plain-obj": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/source-map": {
            "version": "0.6.1",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/source-map-support": {
            "version": "0.5.19",
            "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
            "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
            "dependencies": {
                "buffer-from": "^1.0.0",
                "source-map": "^0.6.0"
            }
        },
        "node_modules/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="
        },
        "node_modules/spdx-correct": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
            "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
            "dependencies": {
                "spdx-expression-parse": "^3.0.0",
                "spdx-license-ids": "^3.0.0"
            }
        },
        "node_modules/spdx-exceptions": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
            "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
        },
        "node_modules/spdx-expression-parse": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
            "dependencies": {
                "spdx-exceptions": "^2.1.0",
                "spdx-license-ids": "^3.0.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/spdy": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
            "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
            "dependencies": {
                "debug": "^4.1.0",
                "handle-thing": "^2.0.0",
                "http-deceiver": "^1.2.7",
                "select-hose": "^2.0.0",
                "spdy-transport": "^3.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "extend-shallow": "^3.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/sprintf-js": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
            "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
        },
        "node_modules/sshpk": {
            "version": "1.16.1",
            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
            "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
            "dependencies": {
                "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"
            },
            "bin": {
                "sshpk-conv": "bin/sshpk-conv",
                "sshpk-sign": "bin/sshpk-sign",
                "sshpk-verify": "bin/sshpk-verify"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/ssri": {
            "version": "7.1.1",
            "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz",
            "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==",
            "dependencies": {
                "figgy-pudding": "^3.5.1",
                "minipass": "^3.1.1"
            },
            "engines": {
                "node": ">= 8"
            }
        },
        "node_modules/stable": {
            "version": "0.1.8",
            "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
            "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
        },
        "node_modules/stack-utils": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
            "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/static-extend": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
            "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
            "dependencies": {
                "define-property": "^0.2.5",
                "object-copy": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/static-extend/node_modules/define-property": {
            "version": "0.2.5",
            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
            "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
            "dependencies": {
                "is-descriptor": "^0.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/statuses": {
            "version": "1.5.0",
            "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
            "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/stealthy-require": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
            "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "inherits": "~2.0.1",
                "readable-stream": "^2.0.2"
            }
        },
        "node_modules/stream-browserify/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/stream-browserify/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/stream-browserify/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "end-of-stream": "^1.1.0",
                "stream-shift": "^1.0.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "builtin-status-codes": "^3.0.0",
                "inherits": "^2.0.1",
                "readable-stream": "^2.3.6",
                "to-arraybuffer": "^1.0.0",
                "xtend": "^4.0.0"
            }
        },
        "node_modules/stream-http/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/stream-http/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/stream-http/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/stream-shift": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
            "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
        },
        "node_modules/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=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/string_decoder": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
            "dependencies": {
                "safe-buffer": "~5.2.0"
            }
        },
        "node_modules/string_decoder/node_modules/safe-buffer": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/feross"
                },
                {
                    "type": "patreon",
                    "url": "https://www.patreon.com/feross"
                },
                {
                    "type": "consulting",
                    "url": "https://feross.org/support"
                }
            ]
        },
        "node_modules/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=",
            "dependencies": {
                "astral-regex": "^1.0.0",
                "strip-ansi": "^4.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/string-length/node_modules/ansi-regex": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/string-length/node_modules/strip-ansi": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
            "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
            "dependencies": {
                "ansi-regex": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/string-width": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
            "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
            "dependencies": {
                "emoji-regex": "^8.0.0",
                "is-fullwidth-code-point": "^3.0.0",
                "strip-ansi": "^6.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/string-width/node_modules/ansi-regex": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/string-width/node_modules/strip-ansi": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
            "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
            "dependencies": {
                "ansi-regex": "^5.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "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"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/string.prototype.trimend": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
            "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.5"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/string.prototype.trimstart": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
            "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.5"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/stringify-object": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
            "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
            "dependencies": {
                "get-own-enumerable-property-symbols": "^3.0.0",
                "is-obj": "^1.0.1",
                "is-regexp": "^1.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/stringify-object/node_modules/is-obj": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
            "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/strip-ansi": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
            "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
            "dependencies": {
                "ansi-regex": "^4.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/strip-bom": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
            "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/strip-comments": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz",
            "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==",
            "dependencies": {
                "babel-extract-comments": "^1.0.0",
                "babel-plugin-transform-object-rest-spread": "^6.26.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/strip-eof": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
            "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/strip-indent": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
            "dependencies": {
                "min-indent": "^1.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/strip-json-comments": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
            "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/style-loader": {
            "version": "0.23.1",
            "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
            "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
            "dependencies": {
                "loader-utils": "^1.1.0",
                "schema-utils": "^1.0.0"
            },
            "engines": {
                "node": ">= 0.12.0"
            }
        },
        "node_modules/style-loader/node_modules/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==",
            "dependencies": {
                "ajv": "^6.1.0",
                "ajv-errors": "^1.0.0",
                "ajv-keywords": "^3.1.0"
            },
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/stylehacks": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
            "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
            "dependencies": {
                "browserslist": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-selector-parser": "^3.0.0"
            },
            "engines": {
                "node": ">=6.9.0"
            }
        },
        "node_modules/stylehacks/node_modules/postcss-selector-parser": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
            "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
            "dependencies": {
                "dot-prop": "^5.2.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/supports-color": {
            "version": "5.5.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
            "dependencies": {
                "has-flag": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/svg-parser": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
            "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
        },
        "node_modules/svgo": {
            "version": "1.3.2",
            "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
            "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
            "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
            "dependencies": {
                "chalk": "^2.4.1",
                "coa": "^2.0.2",
                "css-select": "^2.0.0",
                "css-select-base-adapter": "^0.1.1",
                "css-tree": "1.0.0-alpha.37",
                "csso": "^4.0.2",
                "js-yaml": "^3.13.1",
                "mkdirp": "~0.5.1",
                "object.values": "^1.1.0",
                "sax": "~1.2.4",
                "stable": "^0.1.8",
                "unquote": "~1.1.1",
                "util.promisify": "~1.0.0"
            },
            "bin": {
                "svgo": "bin/svgo"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/table": {
            "version": "5.4.6",
            "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
            "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
            "dependencies": {
                "ajv": "^6.10.2",
                "lodash": "^4.17.14",
                "slice-ansi": "^2.1.0",
                "string-width": "^3.0.0"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/table/node_modules/emoji-regex": {
            "version": "7.0.3",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
            "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
        },
        "node_modules/table/node_modules/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=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/table/node_modules/string-width": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
            "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
            "dependencies": {
                "emoji-regex": "^7.0.1",
                "is-fullwidth-code-point": "^2.0.0",
                "strip-ansi": "^5.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/tapable": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
            "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/terser": {
            "version": "4.8.0",
            "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
            "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
            "dependencies": {
                "commander": "^2.20.0",
                "source-map": "~0.6.1",
                "source-map-support": "~0.5.12"
            },
            "bin": {
                "terser": "bin/terser"
            },
            "engines": {
                "node": ">=6.0.0"
            }
        },
        "node_modules/terser-webpack-plugin": {
            "version": "2.3.5",
            "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz",
            "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==",
            "dependencies": {
                "cacache": "^13.0.1",
                "find-cache-dir": "^3.2.0",
                "jest-worker": "^25.1.0",
                "p-limit": "^2.2.2",
                "schema-utils": "^2.6.4",
                "serialize-javascript": "^2.1.2",
                "source-map": "^0.6.1",
                "terser": "^4.4.3",
                "webpack-sources": "^1.4.3"
            },
            "engines": {
                "node": ">= 8.9.0"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/webpack"
            },
            "peerDependencies": {
                "webpack": "^4.0.0 || ^5.0.0"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": {
            "version": "3.3.1",
            "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
            "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
            "dependencies": {
                "commondir": "^1.0.1",
                "make-dir": "^3.0.2",
                "pkg-dir": "^4.1.0"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/find-up": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
            "dependencies": {
                "locate-path": "^5.0.0",
                "path-exists": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/has-flag": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/jest-worker": {
            "version": "25.5.0",
            "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz",
            "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==",
            "dependencies": {
                "merge-stream": "^2.0.0",
                "supports-color": "^7.0.0"
            },
            "engines": {
                "node": ">= 8.3"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/locate-path": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
            "dependencies": {
                "p-locate": "^4.1.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/make-dir": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
            "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
            "dependencies": {
                "semver": "^6.0.0"
            },
            "engines": {
                "node": ">=8"
            },
            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/p-locate": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
            "dependencies": {
                "p-limit": "^2.2.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/path-exists": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/pkg-dir": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
            "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
            "dependencies": {
                "find-up": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/terser-webpack-plugin/node_modules/supports-color": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
            "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
            "dependencies": {
                "has-flag": "^4.0.0"
            },
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/test-exclude": {
            "version": "5.2.3",
            "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
            "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
            "dependencies": {
                "glob": "^7.1.3",
                "minimatch": "^3.0.4",
                "read-pkg-up": "^4.0.0",
                "require-main-filename": "^2.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/text-table": {
            "version": "0.2.0",
            "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
            "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
        },
        "node_modules/throat": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
            "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo="
        },
        "node_modules/through": {
            "version": "2.3.8",
            "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
            "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
        },
        "node_modules/through2": {
            "version": "2.0.5",
            "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
            "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
            "dependencies": {
                "readable-stream": "~2.3.6",
                "xtend": "~4.0.1"
            }
        },
        "node_modules/through2/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/through2/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/through2/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/thunky": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
            "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
        },
        "node_modules/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==",
            "dependencies": {
                "setimmediate": "^1.0.4"
            },
            "engines": {
                "node": ">=0.6.0"
            }
        },
        "node_modules/timsort": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
            "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
        },
        "node_modules/tiny-invariant": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz",
            "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw=="
        },
        "node_modules/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=="
        },
        "node_modules/tmp": {
            "version": "0.0.33",
            "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
            "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
            "dependencies": {
                "os-tmpdir": "~1.0.2"
            },
            "engines": {
                "node": ">=0.6.0"
            }
        },
        "node_modules/tmpl": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
            "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
        },
        "node_modules/to-arraybuffer": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
            "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
        },
        "node_modules/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=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "kind-of": "^3.0.2"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/to-regex": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
            "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
            "dependencies": {
                "define-property": "^2.0.2",
                "extend-shallow": "^3.0.2",
                "regex-not": "^1.0.2",
                "safe-regex": "^1.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/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=",
            "dependencies": {
                "is-number": "^3.0.0",
                "repeat-string": "^1.6.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/toidentifier": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
            "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
            "engines": {
                "node": ">=0.6"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "psl": "^1.1.28",
                "punycode": "^2.1.1"
            },
            "engines": {
                "node": ">=0.8"
            }
        },
        "node_modules/tr46": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
            "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
            "dependencies": {
                "punycode": "^2.1.0"
            }
        },
        "node_modules/ts-pnp": {
            "version": "1.1.6",
            "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz",
            "integrity": "sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==",
            "engines": {
                "node": ">=6"
            },
            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }
            }
        },
        "node_modules/tslib": {
            "version": "1.13.0",
            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
            "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
        },
        "node_modules/tsutils": {
            "version": "3.17.1",
            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
            "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
            "dependencies": {
                "tslib": "^1.8.1"
            },
            "engines": {
                "node": ">= 6"
            },
            "peerDependencies": {
                "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
            }
        },
        "node_modules/tty-browserify": {
            "version": "0.0.0",
            "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
            "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
        },
        "node_modules/tunnel-agent": {
            "version": "0.6.0",
            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
            "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
            "dependencies": {
                "safe-buffer": "^5.0.1"
            },
            "engines": {
                "node": "*"
            }
        },
        "node_modules/tweetnacl": {
            "version": "0.14.5",
            "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
            "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
        },
        "node_modules/type": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
            "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
        },
        "node_modules/type-check": {
            "version": "0.3.2",
            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
            "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
            "dependencies": {
                "prelude-ls": "~1.1.2"
            },
            "engines": {
                "node": ">= 0.8.0"
            }
        },
        "node_modules/type-fest": {
            "version": "0.8.1",
            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
            "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/type-is": {
            "version": "1.6.18",
            "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
            "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
            "dependencies": {
                "media-typer": "0.3.0",
                "mime-types": "~2.1.24"
            },
            "engines": {
                "node": ">= 0.6"
            }
        },
        "node_modules/typedarray": {
            "version": "0.0.6",
            "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
            "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
        },
        "node_modules/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==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "unicode-canonical-property-names-ecmascript": "^1.0.4",
                "unicode-property-aliases-ecmascript": "^1.0.4"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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==",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "arr-union": "^3.1.0",
                "get-value": "^2.0.6",
                "is-extendable": "^0.1.1",
                "set-value": "^2.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/uniq": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
            "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
        },
        "node_modules/uniqs": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
            "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
        },
        "node_modules/unique-filename": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
            "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
            "dependencies": {
                "unique-slug": "^2.0.0"
            }
        },
        "node_modules/unique-slug": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
            "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
            "dependencies": {
                "imurmurhash": "^0.1.4"
            }
        },
        "node_modules/universalify": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
            "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
            "engines": {
                "node": ">= 4.0.0"
            }
        },
        "node_modules/unpipe": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
            "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/unquote": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
            "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
        },
        "node_modules/unset-value": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
            "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
            "dependencies": {
                "has-value": "^0.3.1",
                "isobject": "^3.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/unset-value/node_modules/has-value": {
            "version": "0.3.1",
            "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
            "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
            "dependencies": {
                "get-value": "^2.0.3",
                "has-values": "^0.1.4",
                "isobject": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
            "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
            "dependencies": {
                "isarray": "1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/unset-value/node_modules/has-values": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
            "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/unset-value/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/upath": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
            "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
            "engines": {
                "node": ">=4",
                "yarn": "*"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "punycode": "^2.1.0"
            }
        },
        "node_modules/urix": {
            "version": "0.1.0",
            "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
            "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
            "deprecated": "Please see https://github.com/lydell/urix#deprecated"
        },
        "node_modules/url": {
            "version": "0.11.0",
            "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
            "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
            "dependencies": {
                "punycode": "1.3.2",
                "querystring": "0.2.0"
            }
        },
        "node_modules/url-loader": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz",
            "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==",
            "dependencies": {
                "loader-utils": "^1.2.3",
                "mime": "^2.4.4",
                "schema-utils": "^2.5.0"
            },
            "engines": {
                "node": ">= 8.9.0"
            },
            "peerDependencies": {
                "file-loader": "*",
                "webpack": "^4.0.0"
            },
            "peerDependenciesMeta": {
                "file-loader": {
                    "optional": true
                }
            }
        },
        "node_modules/url-parse": {
            "version": "1.5.3",
            "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz",
            "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==",
            "dependencies": {
                "querystringify": "^2.1.1",
                "requires-port": "^1.0.0"
            }
        },
        "node_modules/url/node_modules/punycode": {
            "version": "1.3.2",
            "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
            "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
        },
        "node_modules/use": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
            "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/util": {
            "version": "0.10.3",
            "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
            "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
            "dependencies": {
                "inherits": "2.0.1"
            }
        },
        "node_modules/util-deprecate": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
            "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
        },
        "node_modules/util.promisify": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
            "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
            "dependencies": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.2",
                "has-symbols": "^1.0.1",
                "object.getownpropertydescriptors": "^2.1.0"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/util/node_modules/inherits": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
            "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
        },
        "node_modules/utila": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
            "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
        },
        "node_modules/utils-merge": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
            "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
            "engines": {
                "node": ">= 0.4.0"
            }
        },
        "node_modules/uuid": {
            "version": "3.4.0",
            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
            "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
            "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
            "bin": {
                "uuid": "bin/uuid"
            }
        },
        "node_modules/v8-compile-cache": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
            "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ=="
        },
        "node_modules/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==",
            "dependencies": {
                "spdx-correct": "^3.0.0",
                "spdx-expression-parse": "^3.0.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/vary": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
            "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
            "engines": {
                "node": ">= 0.8"
            }
        },
        "node_modules/vendors": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
            "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
            "funding": {
                "type": "github",
                "url": "https://github.com/sponsors/wooorm"
            }
        },
        "node_modules/verror": {
            "version": "1.10.0",
            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
            "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
            "engines": [
                "node >=0.6.0"
            ],
            "dependencies": {
                "assert-plus": "^1.0.0",
                "core-util-is": "1.0.2",
                "extsprintf": "^1.2.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/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==",
            "dependencies": {
                "browser-process-hrtime": "^1.0.0"
            }
        },
        "node_modules/w3c-xmlserializer": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
            "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
            "dependencies": {
                "domexception": "^1.0.1",
                "webidl-conversions": "^4.0.2",
                "xml-name-validator": "^3.0.0"
            }
        },
        "node_modules/wait-for-expect": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz",
            "integrity": "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag=="
        },
        "node_modules/walker": {
            "version": "1.0.7",
            "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
            "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
            "dependencies": {
                "makeerror": "1.0.x"
            }
        },
        "node_modules/watchpack": {
            "version": "1.7.4",
            "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
            "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
            "dependencies": {
                "graceful-fs": "^4.1.2",
                "neo-async": "^2.5.0"
            },
            "optionalDependencies": {
                "chokidar": "^3.4.1",
                "watchpack-chokidar2": "^2.0.0"
            }
        },
        "node_modules/watchpack-chokidar2": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
            "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
            "optional": true,
            "dependencies": {
                "chokidar": "^2.1.8"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/binary-extensions": {
            "version": "1.13.1",
            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
            "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
            "optional": true,
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/chokidar": {
            "version": "2.1.8",
            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
            "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
            "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.",
            "optional": true,
            "dependencies": {
                "anymatch": "^2.0.0",
                "async-each": "^1.0.1",
                "braces": "^2.3.2",
                "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"
            },
            "optionalDependencies": {
                "fsevents": "^1.2.7"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/fsevents": {
            "version": "1.2.13",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
            "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
            "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
            "hasInstallScript": true,
            "optional": true,
            "os": [
                "darwin"
            ],
            "dependencies": {
                "bindings": "^1.5.0",
                "nan": "^2.12.1"
            },
            "engines": {
                "node": ">= 4.0"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/glob-parent": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
            "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
            "optional": true,
            "dependencies": {
                "is-glob": "^3.1.0",
                "path-dirname": "^1.0.0"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
            "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
            "optional": true,
            "dependencies": {
                "is-extglob": "^2.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/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=",
            "optional": true,
            "dependencies": {
                "binary-extensions": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
            "optional": true
        },
        "node_modules/watchpack-chokidar2/node_modules/normalize-path": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
            "optional": true,
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/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==",
            "optional": true,
            "dependencies": {
                "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"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/readdirp": {
            "version": "2.2.1",
            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
            "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
            "optional": true,
            "dependencies": {
                "graceful-fs": "^4.1.11",
                "micromatch": "^3.1.10",
                "readable-stream": "^2.0.2"
            },
            "engines": {
                "node": ">=0.10"
            }
        },
        "node_modules/watchpack-chokidar2/node_modules/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==",
            "optional": true,
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/wbuf": {
            "version": "1.7.3",
            "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
            "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
            "dependencies": {
                "minimalistic-assert": "^1.0.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/webpack": {
            "version": "4.42.0",
            "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz",
            "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==",
            "dependencies": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-module-context": "1.8.5",
                "@webassemblyjs/wasm-edit": "1.8.5",
                "@webassemblyjs/wasm-parser": "1.8.5",
                "acorn": "^6.2.1",
                "ajv": "^6.10.2",
                "ajv-keywords": "^3.4.1",
                "chrome-trace-event": "^1.0.2",
                "enhanced-resolve": "^4.1.0",
                "eslint-scope": "^4.0.3",
                "json-parse-better-errors": "^1.0.2",
                "loader-runner": "^2.4.0",
                "loader-utils": "^1.2.3",
                "memory-fs": "^0.4.1",
                "micromatch": "^3.1.10",
                "mkdirp": "^0.5.1",
                "neo-async": "^2.6.1",
                "node-libs-browser": "^2.2.1",
                "schema-utils": "^1.0.0",
                "tapable": "^1.1.3",
                "terser-webpack-plugin": "^1.4.3",
                "watchpack": "^1.6.0",
                "webpack-sources": "^1.4.1"
            },
            "bin": {
                "webpack": "bin/webpack.js"
            },
            "engines": {
                "node": ">=6.11.5"
            },
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/webpack"
            }
        },
        "node_modules/webpack-dev-middleware": {
            "version": "3.7.2",
            "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
            "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
            "dependencies": {
                "memory-fs": "^0.4.1",
                "mime": "^2.4.4",
                "mkdirp": "^0.5.1",
                "range-parser": "^1.2.1",
                "webpack-log": "^2.0.0"
            },
            "engines": {
                "node": ">= 6"
            },
            "peerDependencies": {
                "webpack": "^4.0.0"
            }
        },
        "node_modules/webpack-dev-server": {
            "version": "3.10.3",
            "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz",
            "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==",
            "dependencies": {
                "ansi-html": "0.0.7",
                "bonjour": "^3.5.0",
                "chokidar": "^2.1.8",
                "compression": "^1.7.4",
                "connect-history-api-fallback": "^1.6.0",
                "debug": "^4.1.1",
                "del": "^4.1.1",
                "express": "^4.17.1",
                "html-entities": "^1.2.1",
                "http-proxy-middleware": "0.19.1",
                "import-local": "^2.0.0",
                "internal-ip": "^4.3.0",
                "ip": "^1.1.5",
                "is-absolute-url": "^3.0.3",
                "killable": "^1.0.1",
                "loglevel": "^1.6.6",
                "opn": "^5.5.0",
                "p-retry": "^3.0.1",
                "portfinder": "^1.0.25",
                "schema-utils": "^1.0.0",
                "selfsigned": "^1.10.7",
                "semver": "^6.3.0",
                "serve-index": "^1.9.1",
                "sockjs": "0.3.19",
                "sockjs-client": "1.4.0",
                "spdy": "^4.0.1",
                "strip-ansi": "^3.0.1",
                "supports-color": "^6.1.0",
                "url": "^0.11.0",
                "webpack-dev-middleware": "^3.7.2",
                "webpack-log": "^2.0.0",
                "ws": "^6.2.1",
                "yargs": "12.0.5"
            },
            "bin": {
                "webpack-dev-server": "bin/webpack-dev-server.js"
            },
            "engines": {
                "node": ">= 6.11.5"
            },
            "peerDependencies": {
                "webpack": "^4.0.0 || ^5.0.0"
            },
            "peerDependenciesMeta": {
                "webpack-cli": {
                    "optional": true
                }
            }
        },
        "node_modules/webpack-dev-server/node_modules/ansi-regex": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/binary-extensions": {
            "version": "1.13.1",
            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
            "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/chokidar": {
            "version": "2.1.8",
            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
            "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
            "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.",
            "dependencies": {
                "anymatch": "^2.0.0",
                "async-each": "^1.0.1",
                "braces": "^2.3.2",
                "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"
            },
            "optionalDependencies": {
                "fsevents": "^1.2.7"
            }
        },
        "node_modules/webpack-dev-server/node_modules/cliui": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
            "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
            "dependencies": {
                "string-width": "^2.1.1",
                "strip-ansi": "^4.0.0",
                "wrap-ansi": "^2.0.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
            "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
            "dependencies": {
                "ansi-regex": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/webpack-dev-server/node_modules/fsevents": {
            "version": "1.2.13",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
            "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
            "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
            "hasInstallScript": true,
            "optional": true,
            "os": [
                "darwin"
            ],
            "dependencies": {
                "bindings": "^1.5.0",
                "nan": "^2.12.1"
            },
            "engines": {
                "node": ">= 4.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/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=="
        },
        "node_modules/webpack-dev-server/node_modules/glob-parent": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
            "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
            "dependencies": {
                "is-glob": "^3.1.0",
                "path-dirname": "^1.0.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
            "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
            "dependencies": {
                "is-extglob": "^2.1.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/is-absolute-url": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
            "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
            "engines": {
                "node": ">=8"
            }
        },
        "node_modules/webpack-dev-server/node_modules/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=",
            "dependencies": {
                "binary-extensions": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/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=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/webpack-dev-server/node_modules/isarray": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
            "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "node_modules/webpack-dev-server/node_modules/normalize-path": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/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==",
            "dependencies": {
                "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"
            }
        },
        "node_modules/webpack-dev-server/node_modules/readdirp": {
            "version": "2.2.1",
            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
            "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
            "dependencies": {
                "graceful-fs": "^4.1.11",
                "micromatch": "^3.1.10",
                "readable-stream": "^2.0.2"
            },
            "engines": {
                "node": ">=0.10"
            }
        },
        "node_modules/webpack-dev-server/node_modules/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="
        },
        "node_modules/webpack-dev-server/node_modules/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==",
            "dependencies": {
                "ajv": "^6.1.0",
                "ajv-errors": "^1.0.0",
                "ajv-keywords": "^3.1.0"
            },
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/webpack-dev-server/node_modules/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==",
            "dependencies": {
                "safe-buffer": "~5.1.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/string-width": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
            "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
            "dependencies": {
                "is-fullwidth-code-point": "^2.0.0",
                "strip-ansi": "^4.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
            "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
            "dependencies": {
                "ansi-regex": "^3.0.0"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/webpack-dev-server/node_modules/strip-ansi": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
            "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
            "dependencies": {
                "ansi-regex": "^2.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/supports-color": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
            "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
            "dependencies": {
                "has-flag": "^3.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/webpack-dev-server/node_modules/wrap-ansi": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
            "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
            "dependencies": {
                "string-width": "^1.0.1",
                "strip-ansi": "^3.0.1"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/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=",
            "dependencies": {
                "number-is-nan": "^1.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/string-width": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
            "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
            "dependencies": {
                "code-point-at": "^1.0.0",
                "is-fullwidth-code-point": "^1.0.0",
                "strip-ansi": "^3.0.0"
            },
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/ws": {
            "version": "6.2.2",
            "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
            "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
            "dependencies": {
                "async-limiter": "~1.0.0"
            }
        },
        "node_modules/webpack-dev-server/node_modules/yargs": {
            "version": "12.0.5",
            "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
            "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
            "dependencies": {
                "cliui": "^4.0.0",
                "decamelize": "^1.2.0",
                "find-up": "^3.0.0",
                "get-caller-file": "^1.0.1",
                "os-locale": "^3.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 || ^4.0.0",
                "yargs-parser": "^11.1.1"
            }
        },
        "node_modules/webpack-dev-server/node_modules/yargs-parser": {
            "version": "11.1.1",
            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
            "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
            "dependencies": {
                "camelcase": "^5.0.0",
                "decamelize": "^1.2.0"
            }
        },
        "node_modules/webpack-log": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
            "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
            "dependencies": {
                "ansi-colors": "^3.0.0",
                "uuid": "^3.3.2"
            },
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/webpack-manifest-plugin": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz",
            "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==",
            "dependencies": {
                "fs-extra": "^7.0.0",
                "lodash": ">=3.5 <5",
                "object.entries": "^1.1.0",
                "tapable": "^1.0.0"
            },
            "engines": {
                "node": ">=6.11.5"
            },
            "peerDependencies": {
                "webpack": "2 || 3 || 4"
            }
        },
        "node_modules/webpack-manifest-plugin/node_modules/fs-extra": {
            "version": "7.0.1",
            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
            "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
            "dependencies": {
                "graceful-fs": "^4.1.2",
                "jsonfile": "^4.0.0",
                "universalify": "^0.1.0"
            },
            "engines": {
                "node": ">=6 <7 || >=8"
            }
        },
        "node_modules/webpack-sources": {
            "version": "1.4.3",
            "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
            "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
            "dependencies": {
                "source-list-map": "^2.0.0",
                "source-map": "~0.6.1"
            }
        },
        "node_modules/webpack/node_modules/acorn": {
            "version": "6.4.1",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
            "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
            "bin": {
                "acorn": "bin/acorn"
            },
            "engines": {
                "node": ">=0.4.0"
            }
        },
        "node_modules/webpack/node_modules/cacache": {
            "version": "12.0.4",
            "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
            "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
            "dependencies": {
                "bluebird": "^3.5.5",
                "chownr": "^1.1.1",
                "figgy-pudding": "^3.5.1",
                "glob": "^7.1.4",
                "graceful-fs": "^4.1.15",
                "infer-owner": "^1.0.3",
                "lru-cache": "^5.1.1",
                "mississippi": "^3.0.0",
                "mkdirp": "^0.5.1",
                "move-concurrently": "^1.0.1",
                "promise-inflight": "^1.0.1",
                "rimraf": "^2.6.3",
                "ssri": "^6.0.1",
                "unique-filename": "^1.1.1",
                "y18n": "^4.0.0"
            }
        },
        "node_modules/webpack/node_modules/eslint-scope": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
            "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
            "dependencies": {
                "esrecurse": "^4.1.0",
                "estraverse": "^4.1.1"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/webpack/node_modules/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==",
            "dependencies": {
                "ajv": "^6.1.0",
                "ajv-errors": "^1.0.0",
                "ajv-keywords": "^3.1.0"
            },
            "engines": {
                "node": ">= 4"
            }
        },
        "node_modules/webpack/node_modules/serialize-javascript": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
            "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
            "dependencies": {
                "randombytes": "^2.1.0"
            }
        },
        "node_modules/webpack/node_modules/ssri": {
            "version": "6.0.2",
            "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
            "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
            "dependencies": {
                "figgy-pudding": "^3.5.1"
            }
        },
        "node_modules/webpack/node_modules/terser-webpack-plugin": {
            "version": "1.4.4",
            "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz",
            "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==",
            "dependencies": {
                "cacache": "^12.0.2",
                "find-cache-dir": "^2.1.0",
                "is-wsl": "^1.1.0",
                "schema-utils": "^1.0.0",
                "serialize-javascript": "^3.1.0",
                "source-map": "^0.6.1",
                "terser": "^4.1.2",
                "webpack-sources": "^1.4.0",
                "worker-farm": "^1.7.0"
            },
            "engines": {
                "node": ">= 6.9.0"
            },
            "peerDependencies": {
                "webpack": "^4.0.0"
            }
        },
        "node_modules/websocket-driver": {
            "version": "0.7.4",
            "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
            "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
            "dependencies": {
                "http-parser-js": ">=0.5.1",
                "safe-buffer": ">=5.1.0",
                "websocket-extensions": ">=0.1.1"
            },
            "engines": {
                "node": ">=0.8.0"
            }
        },
        "node_modules/websocket-extensions": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
            "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
            "engines": {
                "node": ">=0.8.0"
            }
        },
        "node_modules/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==",
            "dependencies": {
                "iconv-lite": "0.4.24"
            }
        },
        "node_modules/whatwg-fetch": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz",
            "integrity": "sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w=="
        },
        "node_modules/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=="
        },
        "node_modules/whatwg-url": {
            "version": "6.5.0",
            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
            "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
            "dependencies": {
                "lodash.sortby": "^4.7.0",
                "tr46": "^1.0.1",
                "webidl-conversions": "^4.0.2"
            }
        },
        "node_modules/which": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
            "dependencies": {
                "isexe": "^2.0.0"
            },
            "bin": {
                "which": "bin/which"
            }
        },
        "node_modules/which-module": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
            "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
        },
        "node_modules/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==",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/workbox-background-sync": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz",
            "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-broadcast-update": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz",
            "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-build": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz",
            "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==",
            "dependencies": {
                "@babel/runtime": "^7.3.4",
                "@hapi/joi": "^15.0.0",
                "common-tags": "^1.8.0",
                "fs-extra": "^4.0.2",
                "glob": "^7.1.3",
                "lodash.template": "^4.4.0",
                "pretty-bytes": "^5.1.0",
                "stringify-object": "^3.3.0",
                "strip-comments": "^1.0.2",
                "workbox-background-sync": "^4.3.1",
                "workbox-broadcast-update": "^4.3.1",
                "workbox-cacheable-response": "^4.3.1",
                "workbox-core": "^4.3.1",
                "workbox-expiration": "^4.3.1",
                "workbox-google-analytics": "^4.3.1",
                "workbox-navigation-preload": "^4.3.1",
                "workbox-precaching": "^4.3.1",
                "workbox-range-requests": "^4.3.1",
                "workbox-routing": "^4.3.1",
                "workbox-strategies": "^4.3.1",
                "workbox-streams": "^4.3.1",
                "workbox-sw": "^4.3.1",
                "workbox-window": "^4.3.1"
            },
            "engines": {
                "node": ">=4.0.0"
            }
        },
        "node_modules/workbox-build/node_modules/fs-extra": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
            "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
            "dependencies": {
                "graceful-fs": "^4.1.2",
                "jsonfile": "^4.0.0",
                "universalify": "^0.1.0"
            }
        },
        "node_modules/workbox-cacheable-response": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz",
            "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-core": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz",
            "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg=="
        },
        "node_modules/workbox-expiration": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz",
            "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-google-analytics": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz",
            "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==",
            "dependencies": {
                "workbox-background-sync": "^4.3.1",
                "workbox-core": "^4.3.1",
                "workbox-routing": "^4.3.1",
                "workbox-strategies": "^4.3.1"
            }
        },
        "node_modules/workbox-navigation-preload": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz",
            "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-precaching": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz",
            "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-range-requests": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz",
            "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-routing": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz",
            "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-strategies": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz",
            "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-streams": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz",
            "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/workbox-sw": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz",
            "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w=="
        },
        "node_modules/workbox-webpack-plugin": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz",
            "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==",
            "dependencies": {
                "@babel/runtime": "^7.0.0",
                "json-stable-stringify": "^1.0.1",
                "workbox-build": "^4.3.1"
            },
            "engines": {
                "node": ">=4.0.0"
            },
            "peerDependencies": {
                "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0"
            }
        },
        "node_modules/workbox-window": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz",
            "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==",
            "dependencies": {
                "workbox-core": "^4.3.1"
            }
        },
        "node_modules/worker-farm": {
            "version": "1.7.0",
            "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
            "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
            "dependencies": {
                "errno": "~0.1.7"
            }
        },
        "node_modules/worker-rpc": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz",
            "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==",
            "dependencies": {
                "microevent.ts": "~0.1.1"
            }
        },
        "node_modules/wrap-ansi": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
            "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
            "dependencies": {
                "ansi-styles": "^3.2.0",
                "string-width": "^3.0.0",
                "strip-ansi": "^5.0.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/wrap-ansi/node_modules/emoji-regex": {
            "version": "7.0.3",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
            "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
        },
        "node_modules/wrap-ansi/node_modules/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=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/wrap-ansi/node_modules/string-width": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
            "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
            "dependencies": {
                "emoji-regex": "^7.0.1",
                "is-fullwidth-code-point": "^2.0.0",
                "strip-ansi": "^5.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        },
        "node_modules/wrappy": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
            "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
        },
        "node_modules/write": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
            "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
            "dependencies": {
                "mkdirp": "^0.5.1"
            },
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/write-file-atomic": {
            "version": "2.4.1",
            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
            "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
            "dependencies": {
                "graceful-fs": "^4.1.11",
                "imurmurhash": "^0.1.4",
                "signal-exit": "^3.0.2"
            }
        },
        "node_modules/ws": {
            "version": "5.2.3",
            "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz",
            "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
            "dependencies": {
                "async-limiter": "~1.0.0"
            }
        },
        "node_modules/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=="
        },
        "node_modules/xmlchars": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
            "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
        },
        "node_modules/xregexp": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz",
            "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==",
            "dependencies": {
                "@babel/runtime-corejs3": "^7.8.3"
            }
        },
        "node_modules/xtend": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
            "engines": {
                "node": ">=0.4"
            }
        },
        "node_modules/y18n": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
            "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
        },
        "node_modules/yallist": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
        },
        "node_modules/yaml": {
            "version": "1.10.0",
            "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
            "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
            "engines": {
                "node": ">= 6"
            }
        },
        "node_modules/yargs": {
            "version": "13.3.2",
            "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
            "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
            "dependencies": {
                "cliui": "^5.0.0",
                "find-up": "^3.0.0",
                "get-caller-file": "^2.0.1",
                "require-directory": "^2.1.1",
                "require-main-filename": "^2.0.0",
                "set-blocking": "^2.0.0",
                "string-width": "^3.0.0",
                "which-module": "^2.0.0",
                "y18n": "^4.0.0",
                "yargs-parser": "^13.1.2"
            }
        },
        "node_modules/yargs-parser": {
            "version": "13.1.2",
            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
            "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
            "dependencies": {
                "camelcase": "^5.0.0",
                "decamelize": "^1.2.0"
            }
        },
        "node_modules/yargs/node_modules/emoji-regex": {
            "version": "7.0.3",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
            "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
        },
        "node_modules/yargs/node_modules/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=",
            "engines": {
                "node": ">=4"
            }
        },
        "node_modules/yargs/node_modules/string-width": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
            "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
            "dependencies": {
                "emoji-regex": "^7.0.1",
                "is-fullwidth-code-point": "^2.0.0",
                "strip-ansi": "^5.1.0"
            },
            "engines": {
                "node": ">=6"
            }
        }
    },
    "dependencies": {
        "@babel/code-frame": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
            "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
            "requires": {
                "@babel/highlight": "^7.10.4"
            }
        },
        "@babel/compat-data": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz",
            "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==",
            "requires": {
                "browserslist": "^4.12.0",
                "invariant": "^2.2.4",
                "semver": "^5.5.0"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "@babel/core": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
            "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
            "requires": {
                "@babel/code-frame": "^7.8.3",
                "@babel/generator": "^7.9.0",
                "@babel/helper-module-transforms": "^7.9.0",
                "@babel/helpers": "^7.9.0",
                "@babel/parser": "^7.9.0",
                "@babel/template": "^7.8.6",
                "@babel/traverse": "^7.9.0",
                "@babel/types": "^7.9.0",
                "convert-source-map": "^1.7.0",
                "debug": "^4.1.0",
                "gensync": "^1.0.0-beta.1",
                "json5": "^2.1.2",
                "lodash": "^4.17.13",
                "resolve": "^1.3.2",
                "semver": "^5.4.1",
                "source-map": "^0.5.0"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                },
                "source-map": {
                    "version": "0.5.7",
                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
                    "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
                }
            }
        },
        "@babel/generator": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
            "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
            "requires": {
                "@babel/types": "^7.11.0",
                "jsesc": "^2.5.1",
                "source-map": "^0.5.0"
            },
            "dependencies": {
                "source-map": {
                    "version": "0.5.7",
                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
                    "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
                }
            }
        },
        "@babel/helper-annotate-as-pure": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
            "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
            "requires": {
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-builder-binary-assignment-operator-visitor": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
            "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
            "requires": {
                "@babel/helper-explode-assignable-expression": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-builder-react-jsx": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz",
            "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==",
            "requires": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-builder-react-jsx-experimental": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz",
            "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==",
            "requires": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-module-imports": "^7.10.4",
                "@babel/types": "^7.10.5"
            }
        },
        "@babel/helper-compilation-targets": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz",
            "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==",
            "requires": {
                "@babel/compat-data": "^7.10.4",
                "browserslist": "^4.12.0",
                "invariant": "^2.2.4",
                "levenary": "^1.1.1",
                "semver": "^5.5.0"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "@babel/helper-create-class-features-plugin": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
            "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
            "requires": {
                "@babel/helper-function-name": "^7.10.4",
                "@babel/helper-member-expression-to-functions": "^7.10.5",
                "@babel/helper-optimise-call-expression": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-replace-supers": "^7.10.4",
                "@babel/helper-split-export-declaration": "^7.10.4"
            }
        },
        "@babel/helper-create-regexp-features-plugin": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
            "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==",
            "requires": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-regex": "^7.10.4",
                "regexpu-core": "^4.7.0"
            }
        },
        "@babel/helper-define-map": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
            "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
            "requires": {
                "@babel/helper-function-name": "^7.10.4",
                "@babel/types": "^7.10.5",
                "lodash": "^4.17.19"
            }
        },
        "@babel/helper-explode-assignable-expression": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz",
            "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==",
            "requires": {
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-function-name": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
            "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
            "requires": {
                "@babel/helper-get-function-arity": "^7.10.4",
                "@babel/template": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-get-function-arity": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
            "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
            "requires": {
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-hoist-variables": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
            "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
            "requires": {
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-member-expression-to-functions": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
            "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
            "requires": {
                "@babel/types": "^7.11.0"
            }
        },
        "@babel/helper-module-imports": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
            "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
            "requires": {
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-module-transforms": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
            "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
            "requires": {
                "@babel/helper-module-imports": "^7.10.4",
                "@babel/helper-replace-supers": "^7.10.4",
                "@babel/helper-simple-access": "^7.10.4",
                "@babel/helper-split-export-declaration": "^7.11.0",
                "@babel/template": "^7.10.4",
                "@babel/types": "^7.11.0",
                "lodash": "^4.17.19"
            }
        },
        "@babel/helper-optimise-call-expression": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
            "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
            "requires": {
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-plugin-utils": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
            "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
        },
        "@babel/helper-regex": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
            "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
            "requires": {
                "lodash": "^4.17.19"
            }
        },
        "@babel/helper-remap-async-to-generator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz",
            "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==",
            "requires": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-wrap-function": "^7.10.4",
                "@babel/template": "^7.10.4",
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-replace-supers": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
            "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
            "requires": {
                "@babel/helper-member-expression-to-functions": "^7.10.4",
                "@babel/helper-optimise-call-expression": "^7.10.4",
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-simple-access": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
            "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
            "requires": {
                "@babel/template": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helper-skip-transparent-expression-wrappers": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz",
            "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==",
            "requires": {
                "@babel/types": "^7.11.0"
            }
        },
        "@babel/helper-split-export-declaration": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
            "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
            "requires": {
                "@babel/types": "^7.11.0"
            }
        },
        "@babel/helper-validator-identifier": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
            "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
        },
        "@babel/helper-wrap-function": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
            "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
            "requires": {
                "@babel/helper-function-name": "^7.10.4",
                "@babel/template": "^7.10.4",
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/helpers": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
            "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
            "requires": {
                "@babel/template": "^7.10.4",
                "@babel/traverse": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/highlight": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
            "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
            "requires": {
                "@babel/helper-validator-identifier": "^7.10.4",
                "chalk": "^2.0.0",
                "js-tokens": "^4.0.0"
            }
        },
        "@babel/parser": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz",
            "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw=="
        },
        "@babel/plugin-proposal-async-generator-functions": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
            "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-remap-async-to-generator": "^7.10.4",
                "@babel/plugin-syntax-async-generators": "^7.8.0"
            }
        },
        "@babel/plugin-proposal-class-properties": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
            "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
            "requires": {
                "@babel/helper-create-class-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-proposal-decorators": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz",
            "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==",
            "requires": {
                "@babel/helper-create-class-features-plugin": "^7.8.3",
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-syntax-decorators": "^7.8.3"
            }
        },
        "@babel/plugin-proposal-dynamic-import": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
            "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-dynamic-import": "^7.8.0"
            }
        },
        "@babel/plugin-proposal-export-namespace-from": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz",
            "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
            }
        },
        "@babel/plugin-proposal-json-strings": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
            "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-json-strings": "^7.8.0"
            }
        },
        "@babel/plugin-proposal-logical-assignment-operators": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz",
            "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
            }
        },
        "@babel/plugin-proposal-nullish-coalescing-operator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
            "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
            }
        },
        "@babel/plugin-proposal-numeric-separator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
            "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-numeric-separator": "^7.10.4"
            }
        },
        "@babel/plugin-proposal-object-rest-spread": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
            "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
                "@babel/plugin-transform-parameters": "^7.10.4"
            }
        },
        "@babel/plugin-proposal-optional-catch-binding": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz",
            "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
            }
        },
        "@babel/plugin-proposal-optional-chaining": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz",
            "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
                "@babel/plugin-syntax-optional-chaining": "^7.8.0"
            }
        },
        "@babel/plugin-proposal-private-methods": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz",
            "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==",
            "requires": {
                "@babel/helper-create-class-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-proposal-unicode-property-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
            "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==",
            "requires": {
                "@babel/helper-create-regexp-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-syntax-async-generators": {
            "version": "7.8.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
            "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.0"
            }
        },
        "@babel/plugin-syntax-class-properties": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
            "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-syntax-decorators": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz",
            "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-syntax-dynamic-import": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
            "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.0"
            }
        },
        "@babel/plugin-syntax-export-namespace-from": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
            "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.3"
            }
        },
        "@babel/plugin-syntax-flow": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz",
            "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-syntax-json-strings": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
            "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.0"
            }
        },
        "@babel/plugin-syntax-jsx": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz",
            "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-syntax-logical-assignment-operators": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
            "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-syntax-nullish-coalescing-operator": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
            "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.0"
            }
        },
        "@babel/plugin-syntax-numeric-separator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
            "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-syntax-object-rest-spread": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
            "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.0"
            }
        },
        "@babel/plugin-syntax-optional-catch-binding": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
            "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.0"
            }
        },
        "@babel/plugin-syntax-optional-chaining": {
            "version": "7.8.3",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
            "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.0"
            }
        },
        "@babel/plugin-syntax-top-level-await": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz",
            "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-syntax-typescript": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz",
            "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-arrow-functions": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz",
            "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-async-to-generator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz",
            "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==",
            "requires": {
                "@babel/helper-module-imports": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-remap-async-to-generator": "^7.10.4"
            }
        },
        "@babel/plugin-transform-block-scoped-functions": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz",
            "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-block-scoping": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz",
            "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-classes": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz",
            "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==",
            "requires": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-define-map": "^7.10.4",
                "@babel/helper-function-name": "^7.10.4",
                "@babel/helper-optimise-call-expression": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-replace-supers": "^7.10.4",
                "@babel/helper-split-export-declaration": "^7.10.4",
                "globals": "^11.1.0"
            }
        },
        "@babel/plugin-transform-computed-properties": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz",
            "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-destructuring": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz",
            "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-dotall-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz",
            "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==",
            "requires": {
                "@babel/helper-create-regexp-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-duplicate-keys": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz",
            "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-exponentiation-operator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz",
            "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==",
            "requires": {
                "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-flow-strip-types": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz",
            "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-syntax-flow": "^7.8.3"
            }
        },
        "@babel/plugin-transform-for-of": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz",
            "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-function-name": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz",
            "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==",
            "requires": {
                "@babel/helper-function-name": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-literals": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz",
            "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-member-expression-literals": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
            "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-modules-amd": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
            "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
            "requires": {
                "@babel/helper-module-transforms": "^7.10.5",
                "@babel/helper-plugin-utils": "^7.10.4",
                "babel-plugin-dynamic-import-node": "^2.3.3"
            }
        },
        "@babel/plugin-transform-modules-commonjs": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
            "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
            "requires": {
                "@babel/helper-module-transforms": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-simple-access": "^7.10.4",
                "babel-plugin-dynamic-import-node": "^2.3.3"
            }
        },
        "@babel/plugin-transform-modules-systemjs": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz",
            "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==",
            "requires": {
                "@babel/helper-hoist-variables": "^7.10.4",
                "@babel/helper-module-transforms": "^7.10.5",
                "@babel/helper-plugin-utils": "^7.10.4",
                "babel-plugin-dynamic-import-node": "^2.3.3"
            }
        },
        "@babel/plugin-transform-modules-umd": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz",
            "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==",
            "requires": {
                "@babel/helper-module-transforms": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-named-capturing-groups-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz",
            "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==",
            "requires": {
                "@babel/helper-create-regexp-features-plugin": "^7.10.4"
            }
        },
        "@babel/plugin-transform-new-target": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz",
            "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-object-super": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz",
            "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-replace-supers": "^7.10.4"
            }
        },
        "@babel/plugin-transform-parameters": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz",
            "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==",
            "requires": {
                "@babel/helper-get-function-arity": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-property-literals": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz",
            "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-react-constant-elements": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz",
            "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-react-display-name": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz",
            "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-react-jsx": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz",
            "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==",
            "requires": {
                "@babel/helper-builder-react-jsx": "^7.10.4",
                "@babel/helper-builder-react-jsx-experimental": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-jsx": "^7.10.4"
            }
        },
        "@babel/plugin-transform-react-jsx-development": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz",
            "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==",
            "requires": {
                "@babel/helper-builder-react-jsx-experimental": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-jsx": "^7.10.4"
            }
        },
        "@babel/plugin-transform-react-jsx-self": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz",
            "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-jsx": "^7.10.4"
            }
        },
        "@babel/plugin-transform-react-jsx-source": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz",
            "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-jsx": "^7.10.4"
            }
        },
        "@babel/plugin-transform-react-pure-annotations": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz",
            "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==",
            "requires": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-regenerator": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz",
            "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==",
            "requires": {
                "regenerator-transform": "^0.14.2"
            }
        },
        "@babel/plugin-transform-reserved-words": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz",
            "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-runtime": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz",
            "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==",
            "requires": {
                "@babel/helper-module-imports": "^7.8.3",
                "@babel/helper-plugin-utils": "^7.8.3",
                "resolve": "^1.8.1",
                "semver": "^5.5.1"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "@babel/plugin-transform-shorthand-properties": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz",
            "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-spread": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz",
            "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
            }
        },
        "@babel/plugin-transform-sticky-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz",
            "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/helper-regex": "^7.10.4"
            }
        },
        "@babel/plugin-transform-template-literals": {
            "version": "7.10.5",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz",
            "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==",
            "requires": {
                "@babel/helper-annotate-as-pure": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-typeof-symbol": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz",
            "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-typescript": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz",
            "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==",
            "requires": {
                "@babel/helper-create-class-features-plugin": "^7.10.5",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-syntax-typescript": "^7.10.4"
            }
        },
        "@babel/plugin-transform-unicode-escapes": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz",
            "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/plugin-transform-unicode-regex": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
            "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==",
            "requires": {
                "@babel/helper-create-regexp-features-plugin": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4"
            }
        },
        "@babel/preset-env": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz",
            "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==",
            "requires": {
                "@babel/compat-data": "^7.11.0",
                "@babel/helper-compilation-targets": "^7.10.4",
                "@babel/helper-module-imports": "^7.10.4",
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
                "@babel/plugin-proposal-class-properties": "^7.10.4",
                "@babel/plugin-proposal-dynamic-import": "^7.10.4",
                "@babel/plugin-proposal-export-namespace-from": "^7.10.4",
                "@babel/plugin-proposal-json-strings": "^7.10.4",
                "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0",
                "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
                "@babel/plugin-proposal-numeric-separator": "^7.10.4",
                "@babel/plugin-proposal-object-rest-spread": "^7.11.0",
                "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
                "@babel/plugin-proposal-optional-chaining": "^7.11.0",
                "@babel/plugin-proposal-private-methods": "^7.10.4",
                "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
                "@babel/plugin-syntax-async-generators": "^7.8.0",
                "@babel/plugin-syntax-class-properties": "^7.10.4",
                "@babel/plugin-syntax-dynamic-import": "^7.8.0",
                "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
                "@babel/plugin-syntax-json-strings": "^7.8.0",
                "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
                "@babel/plugin-syntax-numeric-separator": "^7.10.4",
                "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
                "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
                "@babel/plugin-syntax-optional-chaining": "^7.8.0",
                "@babel/plugin-syntax-top-level-await": "^7.10.4",
                "@babel/plugin-transform-arrow-functions": "^7.10.4",
                "@babel/plugin-transform-async-to-generator": "^7.10.4",
                "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
                "@babel/plugin-transform-block-scoping": "^7.10.4",
                "@babel/plugin-transform-classes": "^7.10.4",
                "@babel/plugin-transform-computed-properties": "^7.10.4",
                "@babel/plugin-transform-destructuring": "^7.10.4",
                "@babel/plugin-transform-dotall-regex": "^7.10.4",
                "@babel/plugin-transform-duplicate-keys": "^7.10.4",
                "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
                "@babel/plugin-transform-for-of": "^7.10.4",
                "@babel/plugin-transform-function-name": "^7.10.4",
                "@babel/plugin-transform-literals": "^7.10.4",
                "@babel/plugin-transform-member-expression-literals": "^7.10.4",
                "@babel/plugin-transform-modules-amd": "^7.10.4",
                "@babel/plugin-transform-modules-commonjs": "^7.10.4",
                "@babel/plugin-transform-modules-systemjs": "^7.10.4",
                "@babel/plugin-transform-modules-umd": "^7.10.4",
                "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
                "@babel/plugin-transform-new-target": "^7.10.4",
                "@babel/plugin-transform-object-super": "^7.10.4",
                "@babel/plugin-transform-parameters": "^7.10.4",
                "@babel/plugin-transform-property-literals": "^7.10.4",
                "@babel/plugin-transform-regenerator": "^7.10.4",
                "@babel/plugin-transform-reserved-words": "^7.10.4",
                "@babel/plugin-transform-shorthand-properties": "^7.10.4",
                "@babel/plugin-transform-spread": "^7.11.0",
                "@babel/plugin-transform-sticky-regex": "^7.10.4",
                "@babel/plugin-transform-template-literals": "^7.10.4",
                "@babel/plugin-transform-typeof-symbol": "^7.10.4",
                "@babel/plugin-transform-unicode-escapes": "^7.10.4",
                "@babel/plugin-transform-unicode-regex": "^7.10.4",
                "@babel/preset-modules": "^0.1.3",
                "@babel/types": "^7.11.0",
                "browserslist": "^4.12.0",
                "core-js-compat": "^3.6.2",
                "invariant": "^2.2.2",
                "levenary": "^1.1.1",
                "semver": "^5.5.0"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "@babel/preset-modules": {
            "version": "0.1.3",
            "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz",
            "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.0.0",
                "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
                "@babel/plugin-transform-dotall-regex": "^7.4.4",
                "@babel/types": "^7.4.4",
                "esutils": "^2.0.2"
            }
        },
        "@babel/preset-react": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz",
            "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.10.4",
                "@babel/plugin-transform-react-display-name": "^7.10.4",
                "@babel/plugin-transform-react-jsx": "^7.10.4",
                "@babel/plugin-transform-react-jsx-development": "^7.10.4",
                "@babel/plugin-transform-react-jsx-self": "^7.10.4",
                "@babel/plugin-transform-react-jsx-source": "^7.10.4",
                "@babel/plugin-transform-react-pure-annotations": "^7.10.4"
            }
        },
        "@babel/preset-typescript": {
            "version": "7.9.0",
            "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz",
            "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.8.3",
                "@babel/plugin-transform-typescript": "^7.9.0"
            }
        },
        "@babel/runtime": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.0.tgz",
            "integrity": "sha512-qArkXsjJq7H+T86WrIFV0Fnu/tNOkZ4cgXmjkzAu3b/58D5mFIO8JH/y77t7C9q0OdDRdh9s7Ue5GasYssxtXw==",
            "requires": {
                "regenerator-runtime": "^0.13.4"
            }
        },
        "@babel/runtime-corejs3": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.0.tgz",
            "integrity": "sha512-K0ioacsw8JgzDSPpUiGWokMvLzGvnZPXLrTsJfyHPrFsnp4yoKn+Ap/8NNZgWKZG9o5+qotH8tAa8AXn8gTN5A==",
            "requires": {
                "core-js-pure": "^3.0.0",
                "regenerator-runtime": "^0.13.4"
            }
        },
        "@babel/template": {
            "version": "7.10.4",
            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
            "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
            "requires": {
                "@babel/code-frame": "^7.10.4",
                "@babel/parser": "^7.10.4",
                "@babel/types": "^7.10.4"
            }
        },
        "@babel/traverse": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz",
            "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==",
            "requires": {
                "@babel/code-frame": "^7.10.4",
                "@babel/generator": "^7.11.0",
                "@babel/helper-function-name": "^7.10.4",
                "@babel/helper-split-export-declaration": "^7.11.0",
                "@babel/parser": "^7.11.0",
                "@babel/types": "^7.11.0",
                "debug": "^4.1.0",
                "globals": "^11.1.0",
                "lodash": "^4.17.19"
            }
        },
        "@babel/types": {
            "version": "7.11.0",
            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
            "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
            "requires": {
                "@babel/helper-validator-identifier": "^7.10.4",
                "lodash": "^4.17.19",
                "to-fast-properties": "^2.0.0"
            }
        },
        "@cnakazawa/watch": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
            "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
            "requires": {
                "exec-sh": "^0.3.2",
                "minimist": "^1.2.0"
            }
        },
        "@csstools/convert-colors": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
            "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw=="
        },
        "@csstools/normalize.css": {
            "version": "10.1.0",
            "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz",
            "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
        },
        "@emotion/hash": {
            "version": "0.8.0",
            "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
            "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
        },
        "@hapi/address": {
            "version": "2.1.4",
            "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
            "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ=="
        },
        "@hapi/bourne": {
            "version": "1.3.2",
            "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
            "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA=="
        },
        "@hapi/hoek": {
            "version": "8.5.1",
            "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
            "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow=="
        },
        "@hapi/joi": {
            "version": "15.1.1",
            "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
            "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
            "requires": {
                "@hapi/address": "2.x.x",
                "@hapi/bourne": "1.x.x",
                "@hapi/hoek": "8.x.x",
                "@hapi/topo": "3.x.x"
            }
        },
        "@hapi/topo": {
            "version": "3.1.6",
            "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
            "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
            "requires": {
                "@hapi/hoek": "^8.3.0"
            }
        },
        "@jest/console": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz",
            "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==",
            "requires": {
                "@jest/source-map": "^24.9.0",
                "chalk": "^2.0.1",
                "slash": "^2.0.0"
            }
        },
        "@jest/core": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz",
            "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==",
            "requires": {
                "@jest/console": "^24.7.1",
                "@jest/reporters": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "ansi-escapes": "^3.0.0",
                "chalk": "^2.0.1",
                "exit": "^0.1.2",
                "graceful-fs": "^4.1.15",
                "jest-changed-files": "^24.9.0",
                "jest-config": "^24.9.0",
                "jest-haste-map": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-regex-util": "^24.3.0",
                "jest-resolve": "^24.9.0",
                "jest-resolve-dependencies": "^24.9.0",
                "jest-runner": "^24.9.0",
                "jest-runtime": "^24.9.0",
                "jest-snapshot": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-validate": "^24.9.0",
                "jest-watcher": "^24.9.0",
                "micromatch": "^3.1.10",
                "p-each-series": "^1.0.0",
                "realpath-native": "^1.1.0",
                "rimraf": "^2.5.4",
                "slash": "^2.0.0",
                "strip-ansi": "^5.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "@jest/environment": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz",
            "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==",
            "requires": {
                "@jest/fake-timers": "^24.9.0",
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "jest-mock": "^24.9.0"
            }
        },
        "@jest/fake-timers": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz",
            "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==",
            "requires": {
                "@jest/types": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-mock": "^24.9.0"
            }
        },
        "@jest/reporters": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz",
            "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==",
            "requires": {
                "@jest/environment": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "exit": "^0.1.2",
                "glob": "^7.1.2",
                "istanbul-lib-coverage": "^2.0.2",
                "istanbul-lib-instrument": "^3.0.1",
                "istanbul-lib-report": "^2.0.4",
                "istanbul-lib-source-maps": "^3.0.1",
                "istanbul-reports": "^2.2.6",
                "jest-haste-map": "^24.9.0",
                "jest-resolve": "^24.9.0",
                "jest-runtime": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-worker": "^24.6.0",
                "node-notifier": "^5.4.2",
                "slash": "^2.0.0",
                "source-map": "^0.6.0",
                "string-length": "^2.0.0"
            }
        },
        "@jest/source-map": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz",
            "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==",
            "requires": {
                "callsites": "^3.0.0",
                "graceful-fs": "^4.1.15",
                "source-map": "^0.6.0"
            },
            "dependencies": {
                "callsites": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
                    "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
                }
            }
        },
        "@jest/test-result": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz",
            "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==",
            "requires": {
                "@jest/console": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/istanbul-lib-coverage": "^2.0.0"
            }
        },
        "@jest/test-sequencer": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz",
            "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==",
            "requires": {
                "@jest/test-result": "^24.9.0",
                "jest-haste-map": "^24.9.0",
                "jest-runner": "^24.9.0",
                "jest-runtime": "^24.9.0"
            }
        },
        "@jest/transform": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz",
            "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==",
            "requires": {
                "@babel/core": "^7.1.0",
                "@jest/types": "^24.9.0",
                "babel-plugin-istanbul": "^5.1.0",
                "chalk": "^2.0.1",
                "convert-source-map": "^1.4.0",
                "fast-json-stable-stringify": "^2.0.0",
                "graceful-fs": "^4.1.15",
                "jest-haste-map": "^24.9.0",
                "jest-regex-util": "^24.9.0",
                "jest-util": "^24.9.0",
                "micromatch": "^3.1.10",
                "pirates": "^4.0.1",
                "realpath-native": "^1.1.0",
                "slash": "^2.0.0",
                "source-map": "^0.6.1",
                "write-file-atomic": "2.4.1"
            }
        },
        "@jest/types": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
            "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
            "requires": {
                "@types/istanbul-lib-coverage": "^2.0.0",
                "@types/istanbul-reports": "^1.1.1",
                "@types/yargs": "^13.0.0"
            }
        },
        "@material-ui/core": {
            "version": "4.11.0",
            "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.0.tgz",
            "integrity": "sha512-bYo9uIub8wGhZySHqLQ833zi4ZML+XCBE1XwJ8EuUVSpTWWG57Pm+YugQToJNFsEyiKFhPh8DPD0bgupz8n01g==",
            "requires": {
                "@babel/runtime": "^7.4.4",
                "@material-ui/styles": "^4.10.0",
                "@material-ui/system": "^4.9.14",
                "@material-ui/types": "^5.1.0",
                "@material-ui/utils": "^4.10.2",
                "@types/react-transition-group": "^4.2.0",
                "clsx": "^1.0.4",
                "hoist-non-react-statics": "^3.3.2",
                "popper.js": "1.16.1-lts",
                "prop-types": "^15.7.2",
                "react-is": "^16.8.0",
                "react-transition-group": "^4.4.0"
            }
        },
        "@material-ui/icons": {
            "version": "4.9.1",
            "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz",
            "integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==",
            "requires": {
                "@babel/runtime": "^7.4.4"
            }
        },
        "@material-ui/lab": {
            "version": "4.0.0-alpha.56",
            "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.56.tgz",
            "integrity": "sha512-xPlkK+z/6y/24ka4gVJgwPfoCF4RCh8dXb1BNE7MtF9bXEBLN/lBxNTK8VAa0qm3V2oinA6xtUIdcRh0aeRtVw==",
            "requires": {
                "@babel/runtime": "^7.4.4",
                "@material-ui/utils": "^4.10.2",
                "clsx": "^1.0.4",
                "prop-types": "^15.7.2",
                "react-is": "^16.8.0"
            }
        },
        "@material-ui/styles": {
            "version": "4.11.4",
            "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz",
            "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==",
            "requires": {
                "@babel/runtime": "^7.4.4",
                "@emotion/hash": "^0.8.0",
                "@material-ui/types": "5.1.0",
                "@material-ui/utils": "^4.11.2",
                "clsx": "^1.0.4",
                "csstype": "^2.5.2",
                "hoist-non-react-statics": "^3.3.2",
                "jss": "^10.5.1",
                "jss-plugin-camel-case": "^10.5.1",
                "jss-plugin-default-unit": "^10.5.1",
                "jss-plugin-global": "^10.5.1",
                "jss-plugin-nested": "^10.5.1",
                "jss-plugin-props-sort": "^10.5.1",
                "jss-plugin-rule-value-function": "^10.5.1",
                "jss-plugin-vendor-prefixer": "^10.5.1",
                "prop-types": "^15.7.2"
            },
            "dependencies": {
                "@material-ui/utils": {
                    "version": "4.11.2",
                    "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz",
                    "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==",
                    "requires": {
                        "@babel/runtime": "^7.4.4",
                        "prop-types": "^15.7.2",
                        "react-is": "^16.8.0 || ^17.0.0"
                    }
                }
            }
        },
        "@material-ui/system": {
            "version": "4.9.14",
            "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.14.tgz",
            "integrity": "sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w==",
            "requires": {
                "@babel/runtime": "^7.4.4",
                "@material-ui/utils": "^4.9.6",
                "csstype": "^2.5.2",
                "prop-types": "^15.7.2"
            }
        },
        "@material-ui/types": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz",
            "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==",
            "requires": {}
        },
        "@material-ui/utils": {
            "version": "4.10.2",
            "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.10.2.tgz",
            "integrity": "sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw==",
            "requires": {
                "@babel/runtime": "^7.4.4",
                "prop-types": "^15.7.2",
                "react-is": "^16.8.0"
            }
        },
        "@mrmlnc/readdir-enhanced": {
            "version": "2.2.1",
            "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
            "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
            "requires": {
                "call-me-maybe": "^1.0.1",
                "glob-to-regexp": "^0.3.0"
            }
        },
        "@nodelib/fs.stat": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
            "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
        },
        "@sheerun/mutationobserver-shim": {
            "version": "0.3.3",
            "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz",
            "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw=="
        },
        "@svgr/babel-plugin-add-jsx-attribute": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
            "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig=="
        },
        "@svgr/babel-plugin-remove-jsx-attribute": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz",
            "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ=="
        },
        "@svgr/babel-plugin-remove-jsx-empty-expression": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz",
            "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w=="
        },
        "@svgr/babel-plugin-replace-jsx-attribute-value": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz",
            "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w=="
        },
        "@svgr/babel-plugin-svg-dynamic-title": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz",
            "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w=="
        },
        "@svgr/babel-plugin-svg-em-dimensions": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz",
            "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w=="
        },
        "@svgr/babel-plugin-transform-react-native-svg": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz",
            "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw=="
        },
        "@svgr/babel-plugin-transform-svg-component": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz",
            "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw=="
        },
        "@svgr/babel-preset": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz",
            "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==",
            "requires": {
                "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0",
                "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0",
                "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0",
                "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0",
                "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3",
                "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0",
                "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0",
                "@svgr/babel-plugin-transform-svg-component": "^4.2.0"
            }
        },
        "@svgr/core": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz",
            "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==",
            "requires": {
                "@svgr/plugin-jsx": "^4.3.3",
                "camelcase": "^5.3.1",
                "cosmiconfig": "^5.2.1"
            }
        },
        "@svgr/hast-util-to-babel-ast": {
            "version": "4.3.2",
            "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz",
            "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==",
            "requires": {
                "@babel/types": "^7.4.4"
            }
        },
        "@svgr/plugin-jsx": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz",
            "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==",
            "requires": {
                "@babel/core": "^7.4.5",
                "@svgr/babel-preset": "^4.3.3",
                "@svgr/hast-util-to-babel-ast": "^4.3.2",
                "svg-parser": "^2.0.0"
            }
        },
        "@svgr/plugin-svgo": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz",
            "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==",
            "requires": {
                "cosmiconfig": "^5.2.1",
                "merge-deep": "^3.0.2",
                "svgo": "^1.2.2"
            }
        },
        "@svgr/webpack": {
            "version": "4.3.3",
            "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz",
            "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==",
            "requires": {
                "@babel/core": "^7.4.5",
                "@babel/plugin-transform-react-constant-elements": "^7.0.0",
                "@babel/preset-env": "^7.4.5",
                "@babel/preset-react": "^7.0.0",
                "@svgr/core": "^4.3.3",
                "@svgr/plugin-jsx": "^4.3.3",
                "@svgr/plugin-svgo": "^4.3.1",
                "loader-utils": "^1.2.3"
            }
        },
        "@testing-library/dom": {
            "version": "6.16.0",
            "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz",
            "integrity": "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==",
            "requires": {
                "@babel/runtime": "^7.8.4",
                "@sheerun/mutationobserver-shim": "^0.3.2",
                "@types/testing-library__dom": "^6.12.1",
                "aria-query": "^4.0.2",
                "dom-accessibility-api": "^0.3.0",
                "pretty-format": "^25.1.0",
                "wait-for-expect": "^3.0.2"
            },
            "dependencies": {
                "@jest/types": {
                    "version": "25.5.0",
                    "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
                    "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
                    "requires": {
                        "@types/istanbul-lib-coverage": "^2.0.0",
                        "@types/istanbul-reports": "^1.1.1",
                        "@types/yargs": "^15.0.0",
                        "chalk": "^3.0.0"
                    }
                },
                "@types/yargs": {
                    "version": "15.0.5",
                    "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
                    "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
                    "requires": {
                        "@types/yargs-parser": "*"
                    }
                },
                "ansi-regex": {
                    "version": "5.0.1",
                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
                    "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
                },
                "ansi-styles": {
                    "version": "4.2.1",
                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
                    "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
                    "requires": {
                        "@types/color-name": "^1.1.1",
                        "color-convert": "^2.0.1"
                    }
                },
                "chalk": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
                    "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
                    "requires": {
                        "ansi-styles": "^4.1.0",
                        "supports-color": "^7.1.0"
                    }
                },
                "color-convert": {
                    "version": "2.0.1",
                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
                    "requires": {
                        "color-name": "~1.1.4"
                    }
                },
                "color-name": {
                    "version": "1.1.4",
                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
                },
                "has-flag": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
                },
                "pretty-format": {
                    "version": "25.5.0",
                    "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
                    "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
                    "requires": {
                        "@jest/types": "^25.5.0",
                        "ansi-regex": "^5.0.0",
                        "ansi-styles": "^4.0.0",
                        "react-is": "^16.12.0"
                    }
                },
                "supports-color": {
                    "version": "7.1.0",
                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
                    "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
                    "requires": {
                        "has-flag": "^4.0.0"
                    }
                }
            }
        },
        "@testing-library/jest-dom": {
            "version": "4.2.4",
            "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz",
            "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==",
            "requires": {
                "@babel/runtime": "^7.5.1",
                "chalk": "^2.4.1",
                "css": "^2.2.3",
                "css.escape": "^1.5.1",
                "jest-diff": "^24.0.0",
                "jest-matcher-utils": "^24.0.0",
                "lodash": "^4.17.11",
                "pretty-format": "^24.0.0",
                "redent": "^3.0.0"
            }
        },
        "@testing-library/react": {
            "version": "9.5.0",
            "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz",
            "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==",
            "requires": {
                "@babel/runtime": "^7.8.4",
                "@testing-library/dom": "^6.15.0",
                "@types/testing-library__react": "^9.1.2"
            }
        },
        "@testing-library/user-event": {
            "version": "7.2.1",
            "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz",
            "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==",
            "requires": {}
        },
        "@types/babel__core": {
            "version": "7.1.9",
            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz",
            "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==",
            "requires": {
                "@babel/parser": "^7.1.0",
                "@babel/types": "^7.0.0",
                "@types/babel__generator": "*",
                "@types/babel__template": "*",
                "@types/babel__traverse": "*"
            }
        },
        "@types/babel__generator": {
            "version": "7.6.1",
            "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz",
            "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==",
            "requires": {
                "@babel/types": "^7.0.0"
            }
        },
        "@types/babel__template": {
            "version": "7.0.2",
            "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
            "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
            "requires": {
                "@babel/parser": "^7.1.0",
                "@babel/types": "^7.0.0"
            }
        },
        "@types/babel__traverse": {
            "version": "7.0.13",
            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz",
            "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==",
            "requires": {
                "@babel/types": "^7.3.0"
            }
        },
        "@types/color-name": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
            "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
        },
        "@types/eslint-visitor-keys": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
            "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag=="
        },
        "@types/glob": {
            "version": "7.1.3",
            "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
            "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
            "requires": {
                "@types/minimatch": "*",
                "@types/node": "*"
            }
        },
        "@types/istanbul-lib-coverage": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
            "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
        },
        "@types/istanbul-lib-report": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
            "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
            "requires": {
                "@types/istanbul-lib-coverage": "*"
            }
        },
        "@types/istanbul-reports": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
            "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
            "requires": {
                "@types/istanbul-lib-coverage": "*",
                "@types/istanbul-lib-report": "*"
            }
        },
        "@types/json-schema": {
            "version": "7.0.5",
            "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
            "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ=="
        },
        "@types/minimatch": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
            "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
        },
        "@types/node": {
            "version": "14.0.27",
            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
            "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g=="
        },
        "@types/parse-json": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
            "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
        },
        "@types/prop-types": {
            "version": "15.7.3",
            "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
            "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
        },
        "@types/q": {
            "version": "1.5.4",
            "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
            "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
        },
        "@types/react": {
            "version": "16.9.44",
            "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.44.tgz",
            "integrity": "sha512-BtLoJrXdW8DVZauKP+bY4Kmiq7ubcJq+H/aCpRfvPF7RAT3RwR73Sg8szdc2YasbAlWBDrQ6Q+AFM0KwtQY+WQ==",
            "requires": {
                "@types/prop-types": "*",
                "csstype": "^3.0.2"
            },
            "dependencies": {
                "csstype": {
                    "version": "3.0.2",
                    "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz",
                    "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw=="
                }
            }
        },
        "@types/react-dom": {
            "version": "16.9.8",
            "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz",
            "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==",
            "requires": {
                "@types/react": "*"
            }
        },
        "@types/react-transition-group": {
            "version": "4.4.0",
            "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz",
            "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==",
            "requires": {
                "@types/react": "*"
            }
        },
        "@types/stack-utils": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
            "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw=="
        },
        "@types/testing-library__dom": {
            "version": "6.14.0",
            "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz",
            "integrity": "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==",
            "requires": {
                "pretty-format": "^24.3.0"
            }
        },
        "@types/testing-library__react": {
            "version": "9.1.3",
            "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz",
            "integrity": "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==",
            "requires": {
                "@types/react-dom": "*",
                "@types/testing-library__dom": "*",
                "pretty-format": "^25.1.0"
            },
            "dependencies": {
                "@jest/types": {
                    "version": "25.5.0",
                    "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
                    "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
                    "requires": {
                        "@types/istanbul-lib-coverage": "^2.0.0",
                        "@types/istanbul-reports": "^1.1.1",
                        "@types/yargs": "^15.0.0",
                        "chalk": "^3.0.0"
                    }
                },
                "@types/yargs": {
                    "version": "15.0.5",
                    "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
                    "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
                    "requires": {
                        "@types/yargs-parser": "*"
                    }
                },
                "ansi-regex": {
                    "version": "5.0.1",
                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
                    "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
                },
                "ansi-styles": {
                    "version": "4.2.1",
                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
                    "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
                    "requires": {
                        "@types/color-name": "^1.1.1",
                        "color-convert": "^2.0.1"
                    }
                },
                "chalk": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
                    "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
                    "requires": {
                        "ansi-styles": "^4.1.0",
                        "supports-color": "^7.1.0"
                    }
                },
                "color-convert": {
                    "version": "2.0.1",
                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
                    "requires": {
                        "color-name": "~1.1.4"
                    }
                },
                "color-name": {
                    "version": "1.1.4",
                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
                },
                "has-flag": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
                },
                "pretty-format": {
                    "version": "25.5.0",
                    "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
                    "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
                    "requires": {
                        "@jest/types": "^25.5.0",
                        "ansi-regex": "^5.0.0",
                        "ansi-styles": "^4.0.0",
                        "react-is": "^16.12.0"
                    }
                },
                "supports-color": {
                    "version": "7.1.0",
                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
                    "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
                    "requires": {
                        "has-flag": "^4.0.0"
                    }
                }
            }
        },
        "@types/yargs": {
            "version": "13.0.9",
            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
            "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
            "requires": {
                "@types/yargs-parser": "*"
            }
        },
        "@types/yargs-parser": {
            "version": "15.0.0",
            "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
            "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw=="
        },
        "@typescript-eslint/eslint-plugin": {
            "version": "2.34.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz",
            "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==",
            "requires": {
                "@typescript-eslint/experimental-utils": "2.34.0",
                "functional-red-black-tree": "^1.0.1",
                "regexpp": "^3.0.0",
                "tsutils": "^3.17.1"
            }
        },
        "@typescript-eslint/experimental-utils": {
            "version": "2.34.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz",
            "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==",
            "requires": {
                "@types/json-schema": "^7.0.3",
                "@typescript-eslint/typescript-estree": "2.34.0",
                "eslint-scope": "^5.0.0",
                "eslint-utils": "^2.0.0"
            }
        },
        "@typescript-eslint/parser": {
            "version": "2.34.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz",
            "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==",
            "requires": {
                "@types/eslint-visitor-keys": "^1.0.0",
                "@typescript-eslint/experimental-utils": "2.34.0",
                "@typescript-eslint/typescript-estree": "2.34.0",
                "eslint-visitor-keys": "^1.1.0"
            }
        },
        "@typescript-eslint/typescript-estree": {
            "version": "2.34.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz",
            "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==",
            "requires": {
                "debug": "^4.1.1",
                "eslint-visitor-keys": "^1.1.0",
                "glob": "^7.1.6",
                "is-glob": "^4.0.1",
                "lodash": "^4.17.15",
                "semver": "^7.3.2",
                "tsutils": "^3.17.1"
            },
            "dependencies": {
                "semver": {
                    "version": "7.3.2",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
                    "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
                }
            }
        },
        "@webassemblyjs/ast": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
            "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
            "requires": {
                "@webassemblyjs/helper-module-context": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/wast-parser": "1.8.5"
            }
        },
        "@webassemblyjs/floating-point-hex-parser": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
            "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ=="
        },
        "@webassemblyjs/helper-api-error": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
            "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA=="
        },
        "@webassemblyjs/helper-buffer": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
            "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q=="
        },
        "@webassemblyjs/helper-code-frame": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
            "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
            "requires": {
                "@webassemblyjs/wast-printer": "1.8.5"
            }
        },
        "@webassemblyjs/helper-fsm": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
            "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow=="
        },
        "@webassemblyjs/helper-module-context": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
            "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "mamacro": "^0.0.3"
            }
        },
        "@webassemblyjs/helper-wasm-bytecode": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
            "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ=="
        },
        "@webassemblyjs/helper-wasm-section": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
            "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-buffer": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/wasm-gen": "1.8.5"
            }
        },
        "@webassemblyjs/ieee754": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
            "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
            "requires": {
                "@xtuc/ieee754": "^1.2.0"
            }
        },
        "@webassemblyjs/leb128": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
            "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
            "requires": {
                "@xtuc/long": "4.2.2"
            }
        },
        "@webassemblyjs/utf8": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
            "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw=="
        },
        "@webassemblyjs/wasm-edit": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
            "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-buffer": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/helper-wasm-section": "1.8.5",
                "@webassemblyjs/wasm-gen": "1.8.5",
                "@webassemblyjs/wasm-opt": "1.8.5",
                "@webassemblyjs/wasm-parser": "1.8.5",
                "@webassemblyjs/wast-printer": "1.8.5"
            }
        },
        "@webassemblyjs/wasm-gen": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
            "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/ieee754": "1.8.5",
                "@webassemblyjs/leb128": "1.8.5",
                "@webassemblyjs/utf8": "1.8.5"
            }
        },
        "@webassemblyjs/wasm-opt": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
            "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-buffer": "1.8.5",
                "@webassemblyjs/wasm-gen": "1.8.5",
                "@webassemblyjs/wasm-parser": "1.8.5"
            }
        },
        "@webassemblyjs/wasm-parser": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
            "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-api-error": "1.8.5",
                "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
                "@webassemblyjs/ieee754": "1.8.5",
                "@webassemblyjs/leb128": "1.8.5",
                "@webassemblyjs/utf8": "1.8.5"
            }
        },
        "@webassemblyjs/wast-parser": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
            "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/floating-point-hex-parser": "1.8.5",
                "@webassemblyjs/helper-api-error": "1.8.5",
                "@webassemblyjs/helper-code-frame": "1.8.5",
                "@webassemblyjs/helper-fsm": "1.8.5",
                "@xtuc/long": "4.2.2"
            }
        },
        "@webassemblyjs/wast-printer": {
            "version": "1.8.5",
            "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
            "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/wast-parser": "1.8.5",
                "@xtuc/long": "4.2.2"
            }
        },
        "@xtuc/ieee754": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
            "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
        },
        "@xtuc/long": {
            "version": "4.2.2",
            "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
            "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
        },
        "abab": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz",
            "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ=="
        },
        "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"
            }
        },
        "acorn": {
            "version": "7.3.1",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
            "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA=="
        },
        "acorn-globals": {
            "version": "4.3.4",
            "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
            "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
            "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=="
                }
            }
        },
        "acorn-jsx": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
            "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
            "requires": {}
        },
        "acorn-walk": {
            "version": "6.2.0",
            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
            "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA=="
        },
        "address": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
            "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA=="
        },
        "adjust-sourcemap-loader": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz",
            "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==",
            "requires": {
                "assert": "1.4.1",
                "camelcase": "5.0.0",
                "loader-utils": "1.2.3",
                "object-path": "0.11.4",
                "regex-parser": "2.2.10"
            },
            "dependencies": {
                "camelcase": {
                    "version": "5.0.0",
                    "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
                    "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA=="
                },
                "emojis-list": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
                    "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
                },
                "json5": {
                    "version": "1.0.1",
                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
                    "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
                    "requires": {
                        "minimist": "^1.2.0"
                    }
                },
                "loader-utils": {
                    "version": "1.2.3",
                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
                    "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
                    "requires": {
                        "big.js": "^5.2.2",
                        "emojis-list": "^2.0.0",
                        "json5": "^1.0.1"
                    }
                }
            }
        },
        "aggregate-error": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
            "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
            "requires": {
                "clean-stack": "^2.0.0",
                "indent-string": "^4.0.0"
            }
        },
        "ajv": {
            "version": "6.12.3",
            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
            "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
            "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-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==",
            "requires": {}
        },
        "ajv-keywords": {
            "version": "3.5.2",
            "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
            "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
            "requires": {}
        },
        "alphanum-sort": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
            "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
        },
        "ansi-colors": {
            "version": "3.2.4",
            "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
            "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA=="
        },
        "ansi-escapes": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
            "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
            "requires": {
                "type-fest": "^0.11.0"
            },
            "dependencies": {
                "type-fest": {
                    "version": "0.11.0",
                    "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
                    "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ=="
                }
            }
        },
        "ansi-html": {
            "version": "0.0.7",
            "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
            "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
        },
        "ansi-regex": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
            "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
        },
        "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==",
            "requires": {
                "micromatch": "^3.1.4",
                "normalize-path": "^2.1.1"
            }
        },
        "aproba": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
            "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
        },
        "argparse": {
            "version": "1.0.10",
            "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
            "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
            "requires": {
                "sprintf-js": "~1.0.2"
            }
        },
        "aria-query": {
            "version": "4.2.2",
            "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
            "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
            "requires": {
                "@babel/runtime": "^7.10.2",
                "@babel/runtime-corejs3": "^7.10.2"
            }
        },
        "arity-n": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz",
            "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U="
        },
        "arr-diff": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
            "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
        },
        "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=="
        },
        "arr-union": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
            "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
        },
        "array-equal": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
            "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
        },
        "array-flatten": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
            "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
        },
        "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==",
            "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=",
            "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="
        },
        "array-unique": {
            "version": "0.3.2",
            "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
            "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
        },
        "array.prototype.flat": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
            "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
            "requires": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0-next.1"
            }
        },
        "arrify": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
            "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
        },
        "asap": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
            "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
        },
        "asn1": {
            "version": "0.2.4",
            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
            "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
            "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==",
            "requires": {
                "bn.js": "^4.0.0",
                "inherits": "^2.0.1",
                "minimalistic-assert": "^1.0.0"
            },
            "dependencies": {
                "bn.js": {
                    "version": "4.11.9",
                    "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
                    "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
                }
            }
        },
        "assert": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
            "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
            "requires": {
                "util": "0.10.3"
            }
        },
        "assert-plus": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
            "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
        },
        "assign-symbols": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
            "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
        },
        "ast-types-flow": {
            "version": "0.0.7",
            "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
            "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
        },
        "astral-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
            "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
        },
        "async": {
            "version": "2.6.3",
            "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
            "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
            "requires": {
                "lodash": "^4.17.14"
            }
        },
        "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=="
        },
        "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=="
        },
        "asynckit": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
            "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
        },
        "atob": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
            "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
        },
        "autoprefixer": {
            "version": "9.8.6",
            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
            "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
            "requires": {
                "browserslist": "^4.12.0",
                "caniuse-lite": "^1.0.30001109",
                "colorette": "^1.2.1",
                "normalize-range": "^0.1.2",
                "num2fraction": "^1.2.2",
                "postcss": "^7.0.32",
                "postcss-value-parser": "^4.1.0"
            }
        },
        "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="
        },
        "aws4": {
            "version": "1.10.0",
            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
            "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
        },
        "axobject-query": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
            "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
        },
        "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=",
            "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="
                },
                "ansi-styles": {
                    "version": "2.2.1",
                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
                    "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
                },
                "chalk": {
                    "version": "1.1.3",
                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
                    "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
                    "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="
                },
                "strip-ansi": {
                    "version": "3.0.1",
                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
                    "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
                    "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="
                }
            }
        },
        "babel-eslint": {
            "version": "10.1.0",
            "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
            "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
            "requires": {
                "@babel/code-frame": "^7.0.0",
                "@babel/parser": "^7.7.0",
                "@babel/traverse": "^7.7.0",
                "@babel/types": "^7.7.0",
                "eslint-visitor-keys": "^1.0.0",
                "resolve": "^1.12.0"
            }
        },
        "babel-extract-comments": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz",
            "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==",
            "requires": {
                "babylon": "^6.18.0"
            }
        },
        "babel-jest": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz",
            "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==",
            "requires": {
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/babel__core": "^7.1.0",
                "babel-plugin-istanbul": "^5.1.0",
                "babel-preset-jest": "^24.9.0",
                "chalk": "^2.4.2",
                "slash": "^2.0.0"
            }
        },
        "babel-loader": {
            "version": "8.1.0",
            "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
            "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
            "requires": {
                "find-cache-dir": "^2.1.0",
                "loader-utils": "^1.4.0",
                "mkdirp": "^0.5.3",
                "pify": "^4.0.1",
                "schema-utils": "^2.6.5"
            },
            "dependencies": {
                "pify": {
                    "version": "4.0.1",
                    "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
                    "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
                }
            }
        },
        "babel-plugin-dynamic-import-node": {
            "version": "2.3.3",
            "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
            "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
            "requires": {
                "object.assign": "^4.1.0"
            }
        },
        "babel-plugin-istanbul": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz",
            "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==",
            "requires": {
                "@babel/helper-plugin-utils": "^7.0.0",
                "find-up": "^3.0.0",
                "istanbul-lib-instrument": "^3.3.0",
                "test-exclude": "^5.2.3"
            }
        },
        "babel-plugin-jest-hoist": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz",
            "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==",
            "requires": {
                "@types/babel__traverse": "^7.0.6"
            }
        },
        "babel-plugin-macros": {
            "version": "2.8.0",
            "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
            "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
            "requires": {
                "@babel/runtime": "^7.7.2",
                "cosmiconfig": "^6.0.0",
                "resolve": "^1.12.0"
            },
            "dependencies": {
                "cosmiconfig": {
                    "version": "6.0.0",
                    "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
                    "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
                    "requires": {
                        "@types/parse-json": "^4.0.0",
                        "import-fresh": "^3.1.0",
                        "parse-json": "^5.0.0",
                        "path-type": "^4.0.0",
                        "yaml": "^1.7.2"
                    }
                },
                "import-fresh": {
                    "version": "3.2.1",
                    "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
                    "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
                    "requires": {
                        "parent-module": "^1.0.0",
                        "resolve-from": "^4.0.0"
                    }
                },
                "parse-json": {
                    "version": "5.0.1",
                    "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
                    "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
                    "requires": {
                        "@babel/code-frame": "^7.0.0",
                        "error-ex": "^1.3.1",
                        "json-parse-better-errors": "^1.0.1",
                        "lines-and-columns": "^1.1.6"
                    }
                },
                "path-type": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
                    "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
                },
                "resolve-from": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
                    "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
                }
            }
        },
        "babel-plugin-named-asset-import": {
            "version": "0.3.6",
            "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz",
            "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==",
            "requires": {}
        },
        "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="
        },
        "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=",
            "requires": {
                "babel-plugin-syntax-object-rest-spread": "^6.8.0",
                "babel-runtime": "^6.26.0"
            }
        },
        "babel-plugin-transform-react-remove-prop-types": {
            "version": "0.4.24",
            "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
            "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
        },
        "babel-preset-jest": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz",
            "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==",
            "requires": {
                "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
                "babel-plugin-jest-hoist": "^24.9.0"
            }
        },
        "babel-preset-react-app": {
            "version": "9.1.2",
            "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz",
            "integrity": "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==",
            "requires": {
                "@babel/core": "7.9.0",
                "@babel/plugin-proposal-class-properties": "7.8.3",
                "@babel/plugin-proposal-decorators": "7.8.3",
                "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3",
                "@babel/plugin-proposal-numeric-separator": "7.8.3",
                "@babel/plugin-proposal-optional-chaining": "7.9.0",
                "@babel/plugin-transform-flow-strip-types": "7.9.0",
                "@babel/plugin-transform-react-display-name": "7.8.3",
                "@babel/plugin-transform-runtime": "7.9.0",
                "@babel/preset-env": "7.9.0",
                "@babel/preset-react": "7.9.1",
                "@babel/preset-typescript": "7.9.0",
                "@babel/runtime": "7.9.0",
                "babel-plugin-macros": "2.8.0",
                "babel-plugin-transform-react-remove-prop-types": "0.4.24"
            },
            "dependencies": {
                "@babel/plugin-proposal-class-properties": {
                    "version": "7.8.3",
                    "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz",
                    "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==",
                    "requires": {
                        "@babel/helper-create-class-features-plugin": "^7.8.3",
                        "@babel/helper-plugin-utils": "^7.8.3"
                    }
                },
                "@babel/plugin-proposal-nullish-coalescing-operator": {
                    "version": "7.8.3",
                    "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz",
                    "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==",
                    "requires": {
                        "@babel/helper-plugin-utils": "^7.8.3",
                        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
                    }
                },
                "@babel/plugin-proposal-numeric-separator": {
                    "version": "7.8.3",
                    "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz",
                    "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==",
                    "requires": {
                        "@babel/helper-plugin-utils": "^7.8.3",
                        "@babel/plugin-syntax-numeric-separator": "^7.8.3"
                    }
                },
                "@babel/plugin-proposal-optional-chaining": {
                    "version": "7.9.0",
                    "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz",
                    "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==",
                    "requires": {
                        "@babel/helper-plugin-utils": "^7.8.3",
                        "@babel/plugin-syntax-optional-chaining": "^7.8.0"
                    }
                },
                "@babel/plugin-transform-react-display-name": {
                    "version": "7.8.3",
                    "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz",
                    "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==",
                    "requires": {
                        "@babel/helper-plugin-utils": "^7.8.3"
                    }
                },
                "@babel/preset-env": {
                    "version": "7.9.0",
                    "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz",
                    "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==",
                    "requires": {
                        "@babel/compat-data": "^7.9.0",
                        "@babel/helper-compilation-targets": "^7.8.7",
                        "@babel/helper-module-imports": "^7.8.3",
                        "@babel/helper-plugin-utils": "^7.8.3",
                        "@babel/plugin-proposal-async-generator-functions": "^7.8.3",
                        "@babel/plugin-proposal-dynamic-import": "^7.8.3",
                        "@babel/plugin-proposal-json-strings": "^7.8.3",
                        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
                        "@babel/plugin-proposal-numeric-separator": "^7.8.3",
                        "@babel/plugin-proposal-object-rest-spread": "^7.9.0",
                        "@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
                        "@babel/plugin-proposal-optional-chaining": "^7.9.0",
                        "@babel/plugin-proposal-unicode-property-regex": "^7.8.3",
                        "@babel/plugin-syntax-async-generators": "^7.8.0",
                        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
                        "@babel/plugin-syntax-json-strings": "^7.8.0",
                        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
                        "@babel/plugin-syntax-numeric-separator": "^7.8.0",
                        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
                        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
                        "@babel/plugin-syntax-optional-chaining": "^7.8.0",
                        "@babel/plugin-syntax-top-level-await": "^7.8.3",
                        "@babel/plugin-transform-arrow-functions": "^7.8.3",
                        "@babel/plugin-transform-async-to-generator": "^7.8.3",
                        "@babel/plugin-transform-block-scoped-functions": "^7.8.3",
                        "@babel/plugin-transform-block-scoping": "^7.8.3",
                        "@babel/plugin-transform-classes": "^7.9.0",
                        "@babel/plugin-transform-computed-properties": "^7.8.3",
                        "@babel/plugin-transform-destructuring": "^7.8.3",
                        "@babel/plugin-transform-dotall-regex": "^7.8.3",
                        "@babel/plugin-transform-duplicate-keys": "^7.8.3",
                        "@babel/plugin-transform-exponentiation-operator": "^7.8.3",
                        "@babel/plugin-transform-for-of": "^7.9.0",
                        "@babel/plugin-transform-function-name": "^7.8.3",
                        "@babel/plugin-transform-literals": "^7.8.3",
                        "@babel/plugin-transform-member-expression-literals": "^7.8.3",
                        "@babel/plugin-transform-modules-amd": "^7.9.0",
                        "@babel/plugin-transform-modules-commonjs": "^7.9.0",
                        "@babel/plugin-transform-modules-systemjs": "^7.9.0",
                        "@babel/plugin-transform-modules-umd": "^7.9.0",
                        "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
                        "@babel/plugin-transform-new-target": "^7.8.3",
                        "@babel/plugin-transform-object-super": "^7.8.3",
                        "@babel/plugin-transform-parameters": "^7.8.7",
                        "@babel/plugin-transform-property-literals": "^7.8.3",
                        "@babel/plugin-transform-regenerator": "^7.8.7",
                        "@babel/plugin-transform-reserved-words": "^7.8.3",
                        "@babel/plugin-transform-shorthand-properties": "^7.8.3",
                        "@babel/plugin-transform-spread": "^7.8.3",
                        "@babel/plugin-transform-sticky-regex": "^7.8.3",
                        "@babel/plugin-transform-template-literals": "^7.8.3",
                        "@babel/plugin-transform-typeof-symbol": "^7.8.4",
                        "@babel/plugin-transform-unicode-regex": "^7.8.3",
                        "@babel/preset-modules": "^0.1.3",
                        "@babel/types": "^7.9.0",
                        "browserslist": "^4.9.1",
                        "core-js-compat": "^3.6.2",
                        "invariant": "^2.2.2",
                        "levenary": "^1.1.1",
                        "semver": "^5.5.0"
                    }
                },
                "@babel/preset-react": {
                    "version": "7.9.1",
                    "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz",
                    "integrity": "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==",
                    "requires": {
                        "@babel/helper-plugin-utils": "^7.8.3",
                        "@babel/plugin-transform-react-display-name": "^7.8.3",
                        "@babel/plugin-transform-react-jsx": "^7.9.1",
                        "@babel/plugin-transform-react-jsx-development": "^7.9.0",
                        "@babel/plugin-transform-react-jsx-self": "^7.9.0",
                        "@babel/plugin-transform-react-jsx-source": "^7.9.0"
                    }
                },
                "@babel/runtime": {
                    "version": "7.9.0",
                    "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz",
                    "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==",
                    "requires": {
                        "regenerator-runtime": "^0.13.4"
                    }
                },
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "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=",
            "requires": {
                "core-js": "^2.4.0",
                "regenerator-runtime": "^0.11.0"
            },
            "dependencies": {
                "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=="
                },
                "regenerator-runtime": {
                    "version": "0.11.1",
                    "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
                    "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
                }
            }
        },
        "babylon": {
            "version": "6.18.0",
            "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
            "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
        },
        "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==",
            "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=",
                    "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==",
                    "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==",
                    "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==",
                    "requires": {
                        "is-accessor-descriptor": "^1.0.0",
                        "is-data-descriptor": "^1.0.0",
                        "kind-of": "^6.0.2"
                    }
                },
                "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=="
                }
            }
        },
        "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=="
        },
        "batch": {
            "version": "0.6.1",
            "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
            "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
        },
        "bcrypt-pbkdf": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
            "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
            "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=="
        },
        "binary-extensions": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
            "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ=="
        },
        "bluebird": {
            "version": "3.7.2",
            "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
            "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
        },
        "bn.js": {
            "version": "5.1.2",
            "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz",
            "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA=="
        },
        "body-parser": {
            "version": "1.19.0",
            "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
            "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
            "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=="
                },
                "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"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                },
                "qs": {
                    "version": "6.7.0",
                    "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
                    "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
                }
            }
        },
        "bonjour": {
            "version": "3.5.0",
            "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
            "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
            "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="
        },
        "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": "2.3.2",
            "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
            "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
            "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=",
                    "requires": {
                        "is-extendable": "^0.1.0"
                    }
                }
            }
        },
        "brorand": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
            "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
        },
        "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=="
        },
        "browser-resolve": {
            "version": "1.11.3",
            "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
            "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
            "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="
                }
            }
        },
        "browserify-aes": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
            "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
            "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==",
            "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==",
            "requires": {
                "cipher-base": "^1.0.1",
                "des.js": "^1.0.0",
                "inherits": "^2.0.1",
                "safe-buffer": "^5.1.2"
            }
        },
        "browserify-rsa": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
            "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
            "requires": {
                "bn.js": "^4.1.0",
                "randombytes": "^2.0.1"
            },
            "dependencies": {
                "bn.js": {
                    "version": "4.11.9",
                    "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
                    "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
                }
            }
        },
        "browserify-sign": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz",
            "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==",
            "requires": {
                "bn.js": "^5.1.1",
                "browserify-rsa": "^4.0.1",
                "create-hash": "^1.2.0",
                "create-hmac": "^1.1.7",
                "elliptic": "^6.5.2",
                "inherits": "^2.0.4",
                "parse-asn1": "^5.1.5",
                "readable-stream": "^3.6.0",
                "safe-buffer": "^5.2.0"
            },
            "dependencies": {
                "safe-buffer": {
                    "version": "5.2.1",
                    "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
                    "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
                }
            }
        },
        "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==",
            "requires": {
                "pako": "~1.0.5"
            }
        },
        "browserslist": {
            "version": "4.17.4",
            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz",
            "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==",
            "requires": {
                "caniuse-lite": "^1.0.30001265",
                "electron-to-chromium": "^1.3.867",
                "escalade": "^3.1.1",
                "node-releases": "^2.0.0",
                "picocolors": "^1.0.0"
            },
            "dependencies": {
                "node-releases": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz",
                    "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA=="
                }
            }
        },
        "bser": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
            "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
            "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==",
            "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="
                }
            }
        },
        "buffer-equal-constant-time": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
            "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
        },
        "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=="
        },
        "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=="
        },
        "buffer-xor": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
            "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
        },
        "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="
        },
        "bytes": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
            "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
        },
        "cacache": {
            "version": "13.0.1",
            "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
            "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==",
            "requires": {
                "chownr": "^1.1.2",
                "figgy-pudding": "^3.5.1",
                "fs-minipass": "^2.0.0",
                "glob": "^7.1.4",
                "graceful-fs": "^4.2.2",
                "infer-owner": "^1.0.4",
                "lru-cache": "^5.1.1",
                "minipass": "^3.0.0",
                "minipass-collect": "^1.0.2",
                "minipass-flush": "^1.0.5",
                "minipass-pipeline": "^1.2.2",
                "mkdirp": "^0.5.1",
                "move-concurrently": "^1.0.1",
                "p-map": "^3.0.0",
                "promise-inflight": "^1.0.1",
                "rimraf": "^2.7.1",
                "ssri": "^7.0.0",
                "unique-filename": "^1.1.1"
            },
            "dependencies": {
                "rimraf": {
                    "version": "2.7.1",
                    "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
                    "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
                    "requires": {
                        "glob": "^7.1.3"
                    }
                }
            }
        },
        "cache-base": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
            "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
            "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"
            }
        },
        "call-me-maybe": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
            "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
        },
        "caller-callsite": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
            "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
            "requires": {
                "callsites": "^2.0.0"
            }
        },
        "caller-path": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
            "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
            "requires": {
                "caller-callsite": "^2.0.0"
            }
        },
        "callsites": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
            "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
        },
        "camel-case": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz",
            "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==",
            "requires": {
                "pascal-case": "^3.1.1",
                "tslib": "^1.10.0"
            }
        },
        "camelcase": {
            "version": "5.3.1",
            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
        },
        "caniuse-api": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
            "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
            "requires": {
                "browserslist": "^4.0.0",
                "caniuse-lite": "^1.0.0",
                "lodash.memoize": "^4.1.2",
                "lodash.uniq": "^4.5.0"
            }
        },
        "caniuse-lite": {
            "version": "1.0.30001269",
            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001269.tgz",
            "integrity": "sha512-UOy8okEVs48MyHYgV+RdW1Oiudl1H6KolybD6ZquD0VcrPSgj25omXO1S7rDydjpqaISCwA8Pyx+jUQKZwWO5w=="
        },
        "capture-exit": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
            "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
            "requires": {
                "rsvp": "^4.8.4"
            }
        },
        "case-sensitive-paths-webpack-plugin": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz",
            "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ=="
        },
        "caseless": {
            "version": "0.12.0",
            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
            "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
        },
        "chalk": {
            "version": "2.4.2",
            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
            "requires": {
                "ansi-styles": "^3.2.1",
                "escape-string-regexp": "^1.0.5",
                "supports-color": "^5.3.0"
            }
        },
        "chardet": {
            "version": "0.7.0",
            "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
            "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
        },
        "chokidar": {
            "version": "3.4.1",
            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz",
            "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==",
            "requires": {
                "anymatch": "~3.1.1",
                "braces": "~3.0.2",
                "fsevents": "~2.1.2",
                "glob-parent": "~5.1.0",
                "is-binary-path": "~2.1.0",
                "is-glob": "~4.0.1",
                "normalize-path": "~3.0.0",
                "readdirp": "~3.4.0"
            },
            "dependencies": {
                "anymatch": {
                    "version": "3.1.1",
                    "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
                    "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
                    "requires": {
                        "normalize-path": "^3.0.0",
                        "picomatch": "^2.0.4"
                    }
                },
                "braces": {
                    "version": "3.0.2",
                    "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
                    "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
                    "requires": {
                        "fill-range": "^7.0.1"
                    }
                },
                "fill-range": {
                    "version": "7.0.1",
                    "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
                    "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
                    "requires": {
                        "to-regex-range": "^5.0.1"
                    }
                },
                "is-number": {
                    "version": "7.0.0",
                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
                    "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
                },
                "normalize-path": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
                    "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
                },
                "to-regex-range": {
                    "version": "5.0.1",
                    "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
                    "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
                    "requires": {
                        "is-number": "^7.0.0"
                    }
                }
            }
        },
        "chownr": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
            "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
        },
        "chrome-trace-event": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
            "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
            "requires": {
                "tslib": "^1.9.0"
            }
        },
        "ci-info": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
            "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
        },
        "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==",
            "requires": {
                "inherits": "^2.0.1",
                "safe-buffer": "^5.0.1"
            }
        },
        "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==",
            "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=",
                    "requires": {
                        "is-descriptor": "^0.1.0"
                    }
                }
            }
        },
        "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==",
            "requires": {
                "source-map": "~0.6.0"
            }
        },
        "clean-stack": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
            "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
        },
        "cli-cursor": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
            "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
            "requires": {
                "restore-cursor": "^3.1.0"
            }
        },
        "cli-width": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
            "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
        },
        "cliui": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
            "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
            "requires": {
                "string-width": "^3.1.0",
                "strip-ansi": "^5.2.0",
                "wrap-ansi": "^5.1.0"
            },
            "dependencies": {
                "emoji-regex": {
                    "version": "7.0.3",
                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
                    "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
                },
                "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="
                },
                "string-width": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
                    "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
                    "requires": {
                        "emoji-regex": "^7.0.1",
                        "is-fullwidth-code-point": "^2.0.0",
                        "strip-ansi": "^5.1.0"
                    }
                }
            }
        },
        "clone-deep": {
            "version": "0.2.4",
            "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
            "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=",
            "requires": {
                "for-own": "^0.1.3",
                "is-plain-object": "^2.0.1",
                "kind-of": "^3.0.2",
                "lazy-cache": "^1.0.3",
                "shallow-clone": "^0.1.2"
            }
        },
        "clsx": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz",
            "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA=="
        },
        "co": {
            "version": "4.6.0",
            "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
            "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
        },
        "coa": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
            "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
            "requires": {
                "@types/q": "^1.5.1",
                "chalk": "^2.4.1",
                "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="
        },
        "collection-visit": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
            "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
            "requires": {
                "map-visit": "^1.0.0",
                "object-visit": "^1.0.0"
            }
        },
        "color": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
            "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
            "requires": {
                "color-convert": "^1.9.1",
                "color-string": "^1.5.2"
            }
        },
        "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": "1.6.0",
            "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz",
            "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==",
            "requires": {
                "color-name": "^1.0.0",
                "simple-swizzle": "^0.2.2"
            }
        },
        "colorette": {
            "version": "1.2.1",
            "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
            "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw=="
        },
        "combined-stream": {
            "version": "1.0.8",
            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
            "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=="
        },
        "common-tags": {
            "version": "1.8.0",
            "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
            "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw=="
        },
        "commondir": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
            "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
        },
        "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=="
        },
        "compose-function": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz",
            "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=",
            "requires": {
                "arity-n": "^1.0.4"
            }
        },
        "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": {
                "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"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                }
            }
        },
        "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==",
            "requires": {
                "buffer-from": "^1.0.0",
                "inherits": "^2.0.3",
                "readable-stream": "^2.2.2",
                "typedarray": "^0.0.6"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "confusing-browser-globals": {
            "version": "1.0.9",
            "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
            "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw=="
        },
        "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=="
        },
        "console-browserify": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
            "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
        },
        "constants-browserify": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
            "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
        },
        "contains-path": {
            "version": "0.1.0",
            "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
            "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
        },
        "content-disposition": {
            "version": "0.5.3",
            "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
            "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
            "requires": {
                "safe-buffer": "5.1.2"
            }
        },
        "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==",
            "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=="
        },
        "cookie-signature": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
            "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
        },
        "copy-concurrently": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
            "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
            "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="
        },
        "core-js": {
            "version": "3.6.5",
            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
            "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
        },
        "core-js-compat": {
            "version": "3.6.5",
            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
            "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
            "requires": {
                "browserslist": "^4.8.5",
                "semver": "7.0.0"
            },
            "dependencies": {
                "semver": {
                    "version": "7.0.0",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
                    "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
                }
            }
        },
        "core-js-pure": {
            "version": "3.6.5",
            "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz",
            "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA=="
        },
        "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="
        },
        "cosmiconfig": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
            "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
            "requires": {
                "import-fresh": "^2.0.0",
                "is-directory": "^0.3.1",
                "js-yaml": "^3.13.1",
                "parse-json": "^4.0.0"
            }
        },
        "create-ecdh": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
            "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
            "requires": {
                "bn.js": "^4.1.0",
                "elliptic": "^6.0.0"
            },
            "dependencies": {
                "bn.js": {
                    "version": "4.11.9",
                    "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
                    "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
                }
            }
        },
        "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==",
            "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==",
            "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-spawn": {
            "version": "6.0.5",
            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
            "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
            "requires": {
                "nice-try": "^1.0.4",
                "path-key": "^2.0.1",
                "semver": "^5.5.0",
                "shebang-command": "^1.2.0",
                "which": "^1.2.9"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "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==",
            "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": {
            "version": "2.2.4",
            "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
            "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
            "requires": {
                "inherits": "^2.0.3",
                "source-map": "^0.6.1",
                "source-map-resolve": "^0.5.2",
                "urix": "^0.1.0"
            }
        },
        "css-blank-pseudo": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
            "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
            "requires": {
                "postcss": "^7.0.5"
            }
        },
        "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="
        },
        "css-declaration-sorter": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
            "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
            "requires": {
                "postcss": "^7.0.1",
                "timsort": "^0.3.0"
            }
        },
        "css-has-pseudo": {
            "version": "0.10.0",
            "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
            "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
            "requires": {
                "postcss": "^7.0.6",
                "postcss-selector-parser": "^5.0.0-rc.4"
            },
            "dependencies": {
                "cssesc": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
                    "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
                },
                "postcss-selector-parser": {
                    "version": "5.0.0",
                    "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
                    "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
                    "requires": {
                        "cssesc": "^2.0.0",
                        "indexes-of": "^1.0.1",
                        "uniq": "^1.0.1"
                    }
                }
            }
        },
        "css-loader": {
            "version": "3.4.2",
            "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz",
            "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==",
            "requires": {
                "camelcase": "^5.3.1",
                "cssesc": "^3.0.0",
                "icss-utils": "^4.1.1",
                "loader-utils": "^1.2.3",
                "normalize-path": "^3.0.0",
                "postcss": "^7.0.23",
                "postcss-modules-extract-imports": "^2.0.0",
                "postcss-modules-local-by-default": "^3.0.2",
                "postcss-modules-scope": "^2.1.1",
                "postcss-modules-values": "^3.0.0",
                "postcss-value-parser": "^4.0.2",
                "schema-utils": "^2.6.0"
            },
            "dependencies": {
                "normalize-path": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
                    "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
                }
            }
        },
        "css-prefers-color-scheme": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
            "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
            "requires": {
                "postcss": "^7.0.5"
            }
        },
        "css-select": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
            "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
            "requires": {
                "boolbase": "^1.0.0",
                "css-what": "^3.2.1",
                "domutils": "^1.7.0",
                "nth-check": "^1.0.2"
            }
        },
        "css-select-base-adapter": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
            "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
        },
        "css-tree": {
            "version": "1.0.0-alpha.37",
            "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
            "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
            "requires": {
                "mdn-data": "2.0.4",
                "source-map": "^0.6.1"
            }
        },
        "css-vendor": {
            "version": "2.0.8",
            "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz",
            "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==",
            "requires": {
                "@babel/runtime": "^7.8.3",
                "is-in-browser": "^1.0.2"
            }
        },
        "css-what": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
            "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg=="
        },
        "css.escape": {
            "version": "1.5.1",
            "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
            "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
        },
        "cssdb": {
            "version": "4.4.0",
            "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz",
            "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ=="
        },
        "cssesc": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
        },
        "cssnano": {
            "version": "4.1.10",
            "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
            "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
            "requires": {
                "cosmiconfig": "^5.0.0",
                "cssnano-preset-default": "^4.0.7",
                "is-resolvable": "^1.0.0",
                "postcss": "^7.0.0"
            }
        },
        "cssnano-preset-default": {
            "version": "4.0.7",
            "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
            "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
            "requires": {
                "css-declaration-sorter": "^4.0.1",
                "cssnano-util-raw-cache": "^4.0.1",
                "postcss": "^7.0.0",
                "postcss-calc": "^7.0.1",
                "postcss-colormin": "^4.0.3",
                "postcss-convert-values": "^4.0.1",
                "postcss-discard-comments": "^4.0.2",
                "postcss-discard-duplicates": "^4.0.2",
                "postcss-discard-empty": "^4.0.1",
                "postcss-discard-overridden": "^4.0.1",
                "postcss-merge-longhand": "^4.0.11",
                "postcss-merge-rules": "^4.0.3",
                "postcss-minify-font-values": "^4.0.2",
                "postcss-minify-gradients": "^4.0.2",
                "postcss-minify-params": "^4.0.2",
                "postcss-minify-selectors": "^4.0.2",
                "postcss-normalize-charset": "^4.0.1",
                "postcss-normalize-display-values": "^4.0.2",
                "postcss-normalize-positions": "^4.0.2",
                "postcss-normalize-repeat-style": "^4.0.2",
                "postcss-normalize-string": "^4.0.2",
                "postcss-normalize-timing-functions": "^4.0.2",
                "postcss-normalize-unicode": "^4.0.1",
                "postcss-normalize-url": "^4.0.1",
                "postcss-normalize-whitespace": "^4.0.2",
                "postcss-ordered-values": "^4.1.2",
                "postcss-reduce-initial": "^4.0.3",
                "postcss-reduce-transforms": "^4.0.2",
                "postcss-svgo": "^4.0.2",
                "postcss-unique-selectors": "^4.0.1"
            }
        },
        "cssnano-util-get-arguments": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
            "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8="
        },
        "cssnano-util-get-match": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
            "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0="
        },
        "cssnano-util-raw-cache": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
            "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
            "requires": {
                "postcss": "^7.0.0"
            }
        },
        "cssnano-util-same-parent": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
            "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q=="
        },
        "csso": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
            "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
            "requires": {
                "css-tree": "1.0.0-alpha.39"
            },
            "dependencies": {
                "css-tree": {
                    "version": "1.0.0-alpha.39",
                    "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
                    "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
                    "requires": {
                        "mdn-data": "2.0.6",
                        "source-map": "^0.6.1"
                    }
                },
                "mdn-data": {
                    "version": "2.0.6",
                    "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
                    "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA=="
                }
            }
        },
        "cssom": {
            "version": "0.3.8",
            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
            "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
        },
        "cssstyle": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
            "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
            "requires": {
                "cssom": "0.3.x"
            }
        },
        "csstype": {
            "version": "2.6.13",
            "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.13.tgz",
            "integrity": "sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A=="
        },
        "cyclist": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
            "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
        },
        "d": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
            "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
            "requires": {
                "es5-ext": "^0.10.50",
                "type": "^1.0.1"
            }
        },
        "damerau-levenshtein": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
            "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
        },
        "dashdash": {
            "version": "1.14.1",
            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
            "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
            "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==",
            "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==",
                    "requires": {
                        "lodash.sortby": "^4.7.0",
                        "tr46": "^1.0.1",
                        "webidl-conversions": "^4.0.2"
                    }
                }
            }
        },
        "debug": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
            "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
            "requires": {
                "ms": "^2.1.1"
            }
        },
        "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-equal": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
            "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
            "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-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="
        },
        "default-gateway": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
            "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
            "requires": {
                "execa": "^1.0.0",
                "ip-regex": "^2.1.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==",
            "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==",
            "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==",
                    "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==",
                    "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==",
                    "requires": {
                        "is-accessor-descriptor": "^1.0.0",
                        "is-data-descriptor": "^1.0.0",
                        "kind-of": "^6.0.2"
                    }
                },
                "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=="
                }
            }
        },
        "del": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
            "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
            "requires": {
                "@types/glob": "^7.1.1",
                "globby": "^6.1.0",
                "is-path-cwd": "^2.0.0",
                "is-path-in-cwd": "^2.0.0",
                "p-map": "^2.0.0",
                "pify": "^4.0.1",
                "rimraf": "^2.6.3"
            },
            "dependencies": {
                "globby": {
                    "version": "6.1.0",
                    "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
                    "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
                    "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="
                        }
                    }
                },
                "p-map": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
                    "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
                },
                "pify": {
                    "version": "4.0.1",
                    "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
                    "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
                }
            }
        },
        "delayed-stream": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
            "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
        },
        "depd": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
            "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
        },
        "des.js": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
            "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
            "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-newline": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
            "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I="
        },
        "detect-node": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
            "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw=="
        },
        "detect-port-alt": {
            "version": "1.1.6",
            "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
            "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
            "requires": {
                "address": "^1.0.1",
                "debug": "^2.6.0"
            },
            "dependencies": {
                "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"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                }
            }
        },
        "diff-sequences": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
            "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew=="
        },
        "diffie-hellman": {
            "version": "5.0.3",
            "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
            "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
            "requires": {
                "bn.js": "^4.1.0",
                "miller-rabin": "^4.0.0",
                "randombytes": "^2.0.0"
            },
            "dependencies": {
                "bn.js": {
                    "version": "4.11.9",
                    "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
                    "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
                }
            }
        },
        "dir-glob": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
            "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
            "requires": {
                "arrify": "^1.0.1",
                "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="
        },
        "dns-packet": {
            "version": "1.3.4",
            "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
            "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
            "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=",
            "requires": {
                "buffer-indexof": "^1.0.0"
            }
        },
        "doctrine": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
            "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
            "requires": {
                "esutils": "^2.0.2"
            }
        },
        "dom-accessibility-api": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz",
            "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA=="
        },
        "dom-converter": {
            "version": "0.2.0",
            "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
            "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
            "requires": {
                "utila": "~0.4"
            }
        },
        "dom-helpers": {
            "version": "5.1.4",
            "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz",
            "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==",
            "requires": {
                "@babel/runtime": "^7.8.7",
                "csstype": "^2.6.7"
            }
        },
        "dom-serializer": {
            "version": "0.2.2",
            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
            "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
            "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=="
                }
            }
        },
        "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=="
        },
        "domelementtype": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
            "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
        },
        "domexception": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
            "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
            "requires": {
                "webidl-conversions": "^4.0.2"
            }
        },
        "domhandler": {
            "version": "4.2.2",
            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz",
            "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==",
            "requires": {
                "domelementtype": "^2.2.0"
            },
            "dependencies": {
                "domelementtype": {
                    "version": "2.2.0",
                    "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
                    "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
                }
            }
        },
        "domutils": {
            "version": "1.7.0",
            "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
            "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
            "requires": {
                "dom-serializer": "0",
                "domelementtype": "1"
            }
        },
        "dot-case": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz",
            "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==",
            "requires": {
                "no-case": "^3.0.3",
                "tslib": "^1.10.0"
            }
        },
        "dot-prop": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
            "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
            "requires": {
                "is-obj": "^2.0.0"
            }
        },
        "dotenv": {
            "version": "8.2.0",
            "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
            "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
        },
        "dotenv-expand": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
            "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
        },
        "duplexer": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
            "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
        },
        "duplexify": {
            "version": "3.7.1",
            "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
            "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
            "requires": {
                "end-of-stream": "^1.0.0",
                "inherits": "^2.0.1",
                "readable-stream": "^2.0.0",
                "stream-shift": "^1.0.0"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "ecc-jsbn": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
            "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
            "requires": {
                "jsbn": "~0.1.0",
                "safer-buffer": "^2.1.0"
            }
        },
        "ecdsa-sig-formatter": {
            "version": "1.0.11",
            "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
            "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
            "requires": {
                "safe-buffer": "^5.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.873",
            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.873.tgz",
            "integrity": "sha512-TiHlCgl2uP26Z0c67u442c0a2MZCWZNCRnPTQDPhVJ4h9G6z2zU0lApD9H0K9R5yFL5SfdaiVsVD2izOY24xBQ=="
        },
        "elliptic": {
            "version": "6.5.4",
            "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
            "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
            "requires": {
                "bn.js": "^4.11.9",
                "brorand": "^1.1.0",
                "hash.js": "^1.0.0",
                "hmac-drbg": "^1.0.1",
                "inherits": "^2.0.4",
                "minimalistic-assert": "^1.0.1",
                "minimalistic-crypto-utils": "^1.0.1"
            },
            "dependencies": {
                "bn.js": {
                    "version": "4.11.9",
                    "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
                    "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
                }
            }
        },
        "emoji-regex": {
            "version": "8.0.0",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
        },
        "emojis-list": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
            "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
        },
        "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==",
            "requires": {
                "once": "^1.4.0"
            }
        },
        "enhanced-resolve": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
            "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
            "requires": {
                "graceful-fs": "^4.1.2",
                "memory-fs": "^0.5.0",
                "tapable": "^1.0.0"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "memory-fs": {
                    "version": "0.5.0",
                    "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
                    "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
                    "requires": {
                        "errno": "^0.1.3",
                        "readable-stream": "^2.0.1"
                    }
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "entities": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
            "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
        },
        "errno": {
            "version": "0.1.7",
            "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
            "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
            "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==",
            "requires": {
                "is-arrayish": "^0.2.1"
            }
        },
        "es-abstract": {
            "version": "1.17.6",
            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
            "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
            "requires": {
                "es-to-primitive": "^1.2.1",
                "function-bind": "^1.1.1",
                "has": "^1.0.3",
                "has-symbols": "^1.0.1",
                "is-callable": "^1.2.0",
                "is-regex": "^1.1.0",
                "object-inspect": "^1.7.0",
                "object-keys": "^1.1.1",
                "object.assign": "^4.1.0",
                "string.prototype.trimend": "^1.0.1",
                "string.prototype.trimstart": "^1.0.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==",
            "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==",
            "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=",
            "requires": {
                "d": "1",
                "es5-ext": "^0.10.35",
                "es6-symbol": "^3.1.1"
            }
        },
        "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==",
            "requires": {
                "d": "^1.0.1",
                "ext": "^1.1.2"
            }
        },
        "escalade": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
        },
        "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.3",
            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
            "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
            "requires": {
                "esprima": "^4.0.1",
                "estraverse": "^4.2.0",
                "esutils": "^2.0.2",
                "optionator": "^0.8.1",
                "source-map": "~0.6.1"
            }
        },
        "eslint": {
            "version": "6.8.0",
            "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
            "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
            "requires": {
                "@babel/code-frame": "^7.0.0",
                "ajv": "^6.10.0",
                "chalk": "^2.1.0",
                "cross-spawn": "^6.0.5",
                "debug": "^4.0.1",
                "doctrine": "^3.0.0",
                "eslint-scope": "^5.0.0",
                "eslint-utils": "^1.4.3",
                "eslint-visitor-keys": "^1.1.0",
                "espree": "^6.1.2",
                "esquery": "^1.0.1",
                "esutils": "^2.0.2",
                "file-entry-cache": "^5.0.1",
                "functional-red-black-tree": "^1.0.1",
                "glob-parent": "^5.0.0",
                "globals": "^12.1.0",
                "ignore": "^4.0.6",
                "import-fresh": "^3.0.0",
                "imurmurhash": "^0.1.4",
                "inquirer": "^7.0.0",
                "is-glob": "^4.0.0",
                "js-yaml": "^3.13.1",
                "json-stable-stringify-without-jsonify": "^1.0.1",
                "levn": "^0.3.0",
                "lodash": "^4.17.14",
                "minimatch": "^3.0.4",
                "mkdirp": "^0.5.1",
                "natural-compare": "^1.4.0",
                "optionator": "^0.8.3",
                "progress": "^2.0.0",
                "regexpp": "^2.0.1",
                "semver": "^6.1.2",
                "strip-ansi": "^5.2.0",
                "strip-json-comments": "^3.0.1",
                "table": "^5.2.3",
                "text-table": "^0.2.0",
                "v8-compile-cache": "^2.0.3"
            },
            "dependencies": {
                "eslint-utils": {
                    "version": "1.4.3",
                    "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
                    "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
                    "requires": {
                        "eslint-visitor-keys": "^1.1.0"
                    }
                },
                "globals": {
                    "version": "12.4.0",
                    "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
                    "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
                    "requires": {
                        "type-fest": "^0.8.1"
                    }
                },
                "import-fresh": {
                    "version": "3.2.1",
                    "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
                    "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
                    "requires": {
                        "parent-module": "^1.0.0",
                        "resolve-from": "^4.0.0"
                    }
                },
                "regexpp": {
                    "version": "2.0.1",
                    "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
                    "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw=="
                },
                "resolve-from": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
                    "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
                }
            }
        },
        "eslint-config-react-app": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz",
            "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==",
            "requires": {
                "confusing-browser-globals": "^1.0.9"
            }
        },
        "eslint-import-resolver-node": {
            "version": "0.3.4",
            "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
            "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
            "requires": {
                "debug": "^2.6.9",
                "resolve": "^1.13.1"
            },
            "dependencies": {
                "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"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                }
            }
        },
        "eslint-loader": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz",
            "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==",
            "requires": {
                "fs-extra": "^8.1.0",
                "loader-fs-cache": "^1.0.2",
                "loader-utils": "^1.2.3",
                "object-hash": "^2.0.1",
                "schema-utils": "^2.6.1"
            }
        },
        "eslint-module-utils": {
            "version": "2.6.0",
            "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
            "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
            "requires": {
                "debug": "^2.6.9",
                "pkg-dir": "^2.0.0"
            },
            "dependencies": {
                "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"
                    }
                },
                "find-up": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
                    "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
                    "requires": {
                        "locate-path": "^2.0.0"
                    }
                },
                "locate-path": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
                    "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
                    "requires": {
                        "p-locate": "^2.0.0",
                        "path-exists": "^3.0.0"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                },
                "p-limit": {
                    "version": "1.3.0",
                    "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
                    "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
                    "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=",
                    "requires": {
                        "p-limit": "^1.1.0"
                    }
                },
                "p-try": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
                    "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
                },
                "pkg-dir": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
                    "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
                    "requires": {
                        "find-up": "^2.1.0"
                    }
                }
            }
        },
        "eslint-plugin-flowtype": {
            "version": "4.6.0",
            "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz",
            "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==",
            "requires": {
                "lodash": "^4.17.15"
            }
        },
        "eslint-plugin-import": {
            "version": "2.20.1",
            "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz",
            "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==",
            "requires": {
                "array-includes": "^3.0.3",
                "array.prototype.flat": "^1.2.1",
                "contains-path": "^0.1.0",
                "debug": "^2.6.9",
                "doctrine": "1.5.0",
                "eslint-import-resolver-node": "^0.3.2",
                "eslint-module-utils": "^2.4.1",
                "has": "^1.0.3",
                "minimatch": "^3.0.4",
                "object.values": "^1.1.0",
                "read-pkg-up": "^2.0.0",
                "resolve": "^1.12.0"
            },
            "dependencies": {
                "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"
                    }
                },
                "doctrine": {
                    "version": "1.5.0",
                    "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
                    "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
                    "requires": {
                        "esutils": "^2.0.2",
                        "isarray": "^1.0.0"
                    }
                },
                "find-up": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
                    "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
                    "requires": {
                        "locate-path": "^2.0.0"
                    }
                },
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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=",
                    "requires": {
                        "graceful-fs": "^4.1.2",
                        "parse-json": "^2.2.0",
                        "pify": "^2.0.0",
                        "strip-bom": "^3.0.0"
                    }
                },
                "locate-path": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
                    "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
                    "requires": {
                        "p-locate": "^2.0.0",
                        "path-exists": "^3.0.0"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                },
                "p-limit": {
                    "version": "1.3.0",
                    "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
                    "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
                    "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=",
                    "requires": {
                        "p-limit": "^1.1.0"
                    }
                },
                "p-try": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
                    "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
                },
                "parse-json": {
                    "version": "2.2.0",
                    "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
                    "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
                    "requires": {
                        "error-ex": "^1.2.0"
                    }
                },
                "path-type": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
                    "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
                    "requires": {
                        "pify": "^2.0.0"
                    }
                },
                "pify": {
                    "version": "2.3.0",
                    "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
                    "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
                },
                "read-pkg": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
                    "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
                    "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=",
                    "requires": {
                        "find-up": "^2.0.0",
                        "read-pkg": "^2.0.0"
                    }
                }
            }
        },
        "eslint-plugin-jsx-a11y": {
            "version": "6.2.3",
            "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz",
            "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==",
            "requires": {
                "@babel/runtime": "^7.4.5",
                "aria-query": "^3.0.0",
                "array-includes": "^3.0.3",
                "ast-types-flow": "^0.0.7",
                "axobject-query": "^2.0.2",
                "damerau-levenshtein": "^1.0.4",
                "emoji-regex": "^7.0.2",
                "has": "^1.0.3",
                "jsx-ast-utils": "^2.2.1"
            },
            "dependencies": {
                "aria-query": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz",
                    "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=",
                    "requires": {
                        "ast-types-flow": "0.0.7",
                        "commander": "^2.11.0"
                    }
                },
                "emoji-regex": {
                    "version": "7.0.3",
                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
                    "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
                }
            }
        },
        "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==",
            "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": {
                "doctrine": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
                    "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
                    "requires": {
                        "esutils": "^2.0.2"
                    }
                },
                "resolve": {
                    "version": "1.17.0",
                    "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
                    "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
                    "requires": {
                        "path-parse": "^1.0.6"
                    }
                }
            }
        },
        "eslint-plugin-react-hooks": {
            "version": "1.7.0",
            "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
            "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==",
            "requires": {}
        },
        "eslint-scope": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
            "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
            "requires": {
                "esrecurse": "^4.1.0",
                "estraverse": "^4.1.1"
            }
        },
        "eslint-utils": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
            "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
            "requires": {
                "eslint-visitor-keys": "^1.1.0"
            }
        },
        "eslint-visitor-keys": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
            "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
        },
        "espree": {
            "version": "6.2.1",
            "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
            "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
            "requires": {
                "acorn": "^7.1.1",
                "acorn-jsx": "^5.2.0",
                "eslint-visitor-keys": "^1.1.0"
            }
        },
        "esprima": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
        },
        "esquery": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
            "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
            "requires": {
                "estraverse": "^5.1.0"
            },
            "dependencies": {
                "estraverse": {
                    "version": "5.1.0",
                    "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
                    "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw=="
                }
            }
        },
        "esrecurse": {
            "version": "4.2.1",
            "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
            "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
            "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=="
        },
        "esutils": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
        },
        "etag": {
            "version": "1.8.1",
            "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
            "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
        },
        "eventemitter3": {
            "version": "4.0.4",
            "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
            "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ=="
        },
        "events": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
            "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg=="
        },
        "eventsource": {
            "version": "1.0.7",
            "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
            "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
            "requires": {
                "original": "^1.0.0"
            }
        },
        "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==",
            "requires": {
                "md5.js": "^1.3.4",
                "safe-buffer": "^5.1.1"
            }
        },
        "exec-sh": {
            "version": "0.3.4",
            "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
            "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A=="
        },
        "execa": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
            "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
            "requires": {
                "cross-spawn": "^6.0.0",
                "get-stream": "^4.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="
        },
        "expand-brackets": {
            "version": "2.1.4",
            "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
            "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
            "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": {
                "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"
                    }
                },
                "define-property": {
                    "version": "0.2.5",
                    "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
                    "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
                    "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=",
                    "requires": {
                        "is-extendable": "^0.1.0"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                }
            }
        },
        "expect": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
            "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
            "requires": {
                "@jest/types": "^24.9.0",
                "ansi-styles": "^3.2.0",
                "jest-get-type": "^24.9.0",
                "jest-matcher-utils": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-regex-util": "^24.9.0"
            }
        },
        "express": {
            "version": "4.17.1",
            "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
            "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
            "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="
                },
                "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"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                },
                "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="
                },
                "qs": {
                    "version": "6.7.0",
                    "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
                    "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
                }
            }
        },
        "ext": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
            "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
            "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=="
                }
            }
        },
        "extend": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
            "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
        },
        "extend-shallow": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
            "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
            "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==",
                    "requires": {
                        "is-plain-object": "^2.0.4"
                    }
                }
            }
        },
        "external-editor": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
            "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
            "requires": {
                "chardet": "^0.7.0",
                "iconv-lite": "^0.4.24",
                "tmp": "^0.0.33"
            }
        },
        "extglob": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
            "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
            "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=",
                    "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=",
                    "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==",
                    "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==",
                    "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==",
                    "requires": {
                        "is-accessor-descriptor": "^1.0.0",
                        "is-data-descriptor": "^1.0.0",
                        "kind-of": "^6.0.2"
                    }
                },
                "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=="
                }
            }
        },
        "extsprintf": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
            "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
        },
        "fast-deep-equal": {
            "version": "3.1.3",
            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
        },
        "fast-glob": {
            "version": "2.2.7",
            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
            "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
            "requires": {
                "@mrmlnc/readdir-enhanced": "^2.2.1",
                "@nodelib/fs.stat": "^1.1.2",
                "glob-parent": "^3.1.0",
                "is-glob": "^4.0.0",
                "merge2": "^1.2.3",
                "micromatch": "^3.1.10"
            },
            "dependencies": {
                "glob-parent": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
                    "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
                    "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=",
                            "requires": {
                                "is-extglob": "^2.1.0"
                            }
                        }
                    }
                }
            }
        },
        "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=="
        },
        "fast-levenshtein": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
            "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
        },
        "faye-websocket": {
            "version": "0.10.0",
            "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
            "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
            "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==",
            "requires": {
                "bser": "2.1.1"
            }
        },
        "figgy-pudding": {
            "version": "3.5.2",
            "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
            "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
        },
        "figures": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
            "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
            "requires": {
                "escape-string-regexp": "^1.0.5"
            }
        },
        "file-entry-cache": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
            "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
            "requires": {
                "flat-cache": "^2.0.1"
            }
        },
        "file-loader": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
            "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==",
            "requires": {
                "loader-utils": "^1.2.3",
                "schema-utils": "^2.5.0"
            }
        },
        "filesize": {
            "version": "6.0.1",
            "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz",
            "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg=="
        },
        "fill-range": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
            "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
            "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=",
                    "requires": {
                        "is-extendable": "^0.1.0"
                    }
                }
            }
        },
        "finalhandler": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
            "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
            "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"
            },
            "dependencies": {
                "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"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                }
            }
        },
        "find-cache-dir": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
            "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
            "requires": {
                "commondir": "^1.0.1",
                "make-dir": "^2.0.0",
                "pkg-dir": "^3.0.0"
            }
        },
        "find-up": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
            "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
            "requires": {
                "locate-path": "^3.0.0"
            }
        },
        "flat-cache": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
            "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
            "requires": {
                "flatted": "^2.0.0",
                "rimraf": "2.6.3",
                "write": "1.0.3"
            }
        },
        "flatted": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
            "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
        },
        "flatten": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
            "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg=="
        },
        "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==",
            "requires": {
                "inherits": "^2.0.3",
                "readable-stream": "^2.3.6"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "follow-redirects": {
            "version": "1.12.1",
            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz",
            "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg=="
        },
        "for-in": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
            "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
        },
        "for-own": {
            "version": "0.1.5",
            "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
            "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
            "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="
        },
        "fork-ts-checker-webpack-plugin": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz",
            "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==",
            "requires": {
                "babel-code-frame": "^6.22.0",
                "chalk": "^2.4.1",
                "chokidar": "^3.3.0",
                "micromatch": "^3.1.10",
                "minimatch": "^3.0.4",
                "semver": "^5.6.0",
                "tapable": "^1.0.0",
                "worker-rpc": "^0.1.0"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "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==",
            "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="
        },
        "fragment-cache": {
            "version": "0.2.1",
            "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
            "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
            "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=",
            "requires": {
                "inherits": "^2.0.1",
                "readable-stream": "^2.0.0"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "fs-extra": {
            "version": "8.1.0",
            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
            "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
            "requires": {
                "graceful-fs": "^4.2.0",
                "jsonfile": "^4.0.0",
                "universalify": "^0.1.0"
            }
        },
        "fs-minipass": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
            "requires": {
                "minipass": "^3.0.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=",
            "requires": {
                "graceful-fs": "^4.1.2",
                "iferr": "^0.1.5",
                "imurmurhash": "^0.1.4",
                "readable-stream": "1 || 2"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "fs.realpath": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
            "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
        },
        "fsevents": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
            "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
            "optional": true
        },
        "function-bind": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
        },
        "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="
        },
        "gensync": {
            "version": "1.0.0-beta.1",
            "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
            "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
        },
        "get-caller-file": {
            "version": "2.0.5",
            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
        },
        "get-own-enumerable-property-symbols": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
            "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
        },
        "get-stream": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
            "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
            "requires": {
                "pump": "^3.0.0"
            }
        },
        "get-value": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
            "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
        },
        "getpass": {
            "version": "0.1.7",
            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
            "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
            "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-parent": {
            "version": "5.1.2",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
            "requires": {
                "is-glob": "^4.0.1"
            }
        },
        "glob-to-regexp": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
            "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs="
        },
        "global-modules": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
            "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
            "requires": {
                "global-prefix": "^3.0.0"
            }
        },
        "global-prefix": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
            "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
            "requires": {
                "ini": "^1.3.5",
                "kind-of": "^6.0.2",
                "which": "^1.3.1"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "globals": {
            "version": "11.12.0",
            "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
            "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
        },
        "globby": {
            "version": "8.0.2",
            "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
            "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
            "requires": {
                "array-union": "^1.0.1",
                "dir-glob": "2.0.0",
                "fast-glob": "^2.0.2",
                "glob": "^7.1.2",
                "ignore": "^3.3.5",
                "pify": "^3.0.0",
                "slash": "^1.0.0"
            },
            "dependencies": {
                "ignore": {
                    "version": "3.3.10",
                    "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
                    "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
                },
                "slash": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
                    "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
                }
            }
        },
        "graceful-fs": {
            "version": "4.2.4",
            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
            "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
        },
        "growly": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
            "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
        },
        "gzip-size": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
            "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
            "requires": {
                "duplexer": "^0.1.1",
                "pify": "^4.0.1"
            },
            "dependencies": {
                "pify": {
                    "version": "4.0.1",
                    "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
                    "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
                }
            }
        },
        "handle-thing": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
            "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
        },
        "har-schema": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
            "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
        },
        "har-validator": {
            "version": "5.1.5",
            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
            "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
            "requires": {
                "ajv": "^6.12.3",
                "har-schema": "^2.0.0"
            }
        },
        "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=="
        },
        "has": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
            "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=",
            "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="
                }
            }
        },
        "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=="
        },
        "has-value": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
            "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
            "requires": {
                "get-value": "^2.0.6",
                "has-values": "^1.0.0",
                "isobject": "^3.0.0"
            }
        },
        "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=",
            "requires": {
                "is-number": "^3.0.0",
                "kind-of": "^4.0.0"
            },
            "dependencies": {
                "kind-of": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
                    "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
                    "requires": {
                        "is-buffer": "^1.1.5"
                    }
                }
            }
        },
        "hash-base": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
            "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
            "requires": {
                "inherits": "^2.0.4",
                "readable-stream": "^3.6.0",
                "safe-buffer": "^5.2.0"
            },
            "dependencies": {
                "safe-buffer": {
                    "version": "5.2.1",
                    "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
                    "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
                }
            }
        },
        "hash.js": {
            "version": "1.1.7",
            "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
            "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
            "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=="
        },
        "hex-color-regex": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
            "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
        },
        "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=",
            "requires": {
                "hash.js": "^1.0.3",
                "minimalistic-assert": "^1.0.0",
                "minimalistic-crypto-utils": "^1.0.1"
            }
        },
        "hoist-non-react-statics": {
            "version": "3.3.2",
            "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
            "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
            "requires": {
                "react-is": "^16.7.0"
            }
        },
        "hosted-git-info": {
            "version": "2.8.9",
            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
            "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
        },
        "hpack.js": {
            "version": "2.1.6",
            "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
            "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
            "requires": {
                "inherits": "^2.0.1",
                "obuf": "^1.0.0",
                "readable-stream": "^2.0.1",
                "wbuf": "^1.1.0"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "hsl-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
            "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4="
        },
        "hsla-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
            "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg="
        },
        "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==",
            "requires": {
                "whatwg-encoding": "^1.0.1"
            }
        },
        "html-entities": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
            "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA=="
        },
        "html-escaper": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
            "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
        },
        "html-minifier-terser": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
            "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
            "requires": {
                "camel-case": "^4.1.1",
                "clean-css": "^4.2.3",
                "commander": "^4.1.1",
                "he": "^1.2.0",
                "param-case": "^3.0.3",
                "relateurl": "^0.2.7",
                "terser": "^4.6.3"
            },
            "dependencies": {
                "commander": {
                    "version": "4.1.1",
                    "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
                    "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
                }
            }
        },
        "html-webpack-plugin": {
            "version": "4.0.0-beta.11",
            "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz",
            "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==",
            "requires": {
                "html-minifier-terser": "^5.0.1",
                "loader-utils": "^1.2.3",
                "lodash": "^4.17.15",
                "pretty-error": "^2.1.1",
                "tapable": "^1.1.3",
                "util.promisify": "1.0.0"
            },
            "dependencies": {
                "util.promisify": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
                    "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
                    "requires": {
                        "define-properties": "^1.1.2",
                        "object.getownpropertydescriptors": "^2.0.3"
                    }
                }
            }
        },
        "htmlparser2": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
            "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
            "requires": {
                "domelementtype": "^2.0.1",
                "domhandler": "^4.0.0",
                "domutils": "^2.5.2",
                "entities": "^2.0.0"
            },
            "dependencies": {
                "dom-serializer": {
                    "version": "1.3.2",
                    "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
                    "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
                    "requires": {
                        "domelementtype": "^2.0.1",
                        "domhandler": "^4.2.0",
                        "entities": "^2.0.0"
                    }
                },
                "domelementtype": {
                    "version": "2.2.0",
                    "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
                    "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
                },
                "domutils": {
                    "version": "2.8.0",
                    "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
                    "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
                    "requires": {
                        "dom-serializer": "^1.0.1",
                        "domelementtype": "^2.2.0",
                        "domhandler": "^4.2.0"
                    }
                }
            }
        },
        "http-deceiver": {
            "version": "1.2.7",
            "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
            "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
        },
        "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==",
            "requires": {
                "depd": "~1.1.2",
                "inherits": "2.0.3",
                "setprototypeof": "1.1.1",
                "statuses": ">= 1.5.0 < 2",
                "toidentifier": "1.0.0"
            },
            "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.5.2",
            "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
            "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ=="
        },
        "http-proxy": {
            "version": "1.18.1",
            "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
            "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
            "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==",
            "requires": {
                "http-proxy": "^1.17.0",
                "is-glob": "^4.0.0",
                "lodash": "^4.17.11",
                "micromatch": "^3.1.10"
            }
        },
        "http-signature": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
            "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
            "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="
        },
        "hyphenate-style-name": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
            "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
        },
        "iconv-lite": {
            "version": "0.4.24",
            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
            "requires": {
                "safer-buffer": ">= 2.1.2 < 3"
            }
        },
        "icss-utils": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
            "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
            "requires": {
                "postcss": "^7.0.14"
            }
        },
        "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=",
            "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=="
        },
        "iferr": {
            "version": "0.1.5",
            "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
            "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
        },
        "ignore": {
            "version": "4.0.6",
            "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
            "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
        },
        "immer": {
            "version": "1.10.0",
            "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz",
            "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg=="
        },
        "import-cwd": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
            "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
            "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=",
            "requires": {
                "caller-path": "^2.0.0",
                "resolve-from": "^3.0.0"
            }
        },
        "import-from": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
            "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
            "requires": {
                "resolve-from": "^3.0.0"
            }
        },
        "import-local": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
            "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
            "requires": {
                "pkg-dir": "^3.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="
        },
        "indent-string": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
        },
        "indexes-of": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
            "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
        },
        "infer-owner": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
            "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
        },
        "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.8",
            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
        },
        "inquirer": {
            "version": "7.3.3",
            "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
            "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
            "requires": {
                "ansi-escapes": "^4.2.1",
                "chalk": "^4.1.0",
                "cli-cursor": "^3.1.0",
                "cli-width": "^3.0.0",
                "external-editor": "^3.0.3",
                "figures": "^3.0.0",
                "lodash": "^4.17.19",
                "mute-stream": "0.0.8",
                "run-async": "^2.4.0",
                "rxjs": "^6.6.0",
                "string-width": "^4.1.0",
                "strip-ansi": "^6.0.0",
                "through": "^2.3.6"
            },
            "dependencies": {
                "ansi-regex": {
                    "version": "5.0.1",
                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
                    "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
                },
                "ansi-styles": {
                    "version": "4.2.1",
                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
                    "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
                    "requires": {
                        "@types/color-name": "^1.1.1",
                        "color-convert": "^2.0.1"
                    }
                },
                "chalk": {
                    "version": "4.1.0",
                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
                    "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
                    "requires": {
                        "ansi-styles": "^4.1.0",
                        "supports-color": "^7.1.0"
                    }
                },
                "color-convert": {
                    "version": "2.0.1",
                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
                    "requires": {
                        "color-name": "~1.1.4"
                    }
                },
                "color-name": {
                    "version": "1.1.4",
                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
                },
                "has-flag": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
                },
                "strip-ansi": {
                    "version": "6.0.0",
                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
                    "requires": {
                        "ansi-regex": "^5.0.0"
                    }
                },
                "supports-color": {
                    "version": "7.1.0",
                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
                    "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
                    "requires": {
                        "has-flag": "^4.0.0"
                    }
                }
            }
        },
        "internal-ip": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
            "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
            "requires": {
                "default-gateway": "^4.2.0",
                "ipaddr.js": "^1.9.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==",
            "requires": {
                "es-abstract": "^1.17.0-next.1",
                "has": "^1.0.3",
                "side-channel": "^1.0.2"
            }
        },
        "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": "2.0.0",
            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
            "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
        },
        "ip": {
            "version": "1.1.5",
            "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
            "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
        },
        "ip-regex": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
            "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
        },
        "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=="
        },
        "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="
        },
        "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=",
            "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=="
        },
        "is-arrayish": {
            "version": "0.2.1",
            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
            "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
        },
        "is-binary-path": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
            "requires": {
                "binary-extensions": "^2.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.2.0",
            "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
            "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw=="
        },
        "is-ci": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
            "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
            "requires": {
                "ci-info": "^2.0.0"
            }
        },
        "is-color-stop": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
            "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
            "requires": {
                "css-color-names": "^0.0.4",
                "hex-color-regex": "^1.1.0",
                "hsl-regex": "^1.0.0",
                "hsla-regex": "^1.0.0",
                "rgb-regex": "^1.0.1",
                "rgba-regex": "^1.0.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=",
            "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=="
        },
        "is-descriptor": {
            "version": "0.1.6",
            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
            "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
            "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=="
                }
            }
        },
        "is-directory": {
            "version": "0.3.1",
            "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
            "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
        },
        "is-docker": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
            "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ=="
        },
        "is-extendable": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
            "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
        },
        "is-extglob": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
            "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
        },
        "is-fullwidth-code-point": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
        },
        "is-generator-fn": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
            "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
        },
        "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==",
            "requires": {
                "is-extglob": "^2.1.1"
            }
        },
        "is-in-browser": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
            "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
        },
        "is-number": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
            "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
            "requires": {
                "kind-of": "^3.0.2"
            }
        },
        "is-obj": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
            "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
        },
        "is-path-cwd": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
            "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
        },
        "is-path-in-cwd": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
            "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
            "requires": {
                "is-path-inside": "^2.1.0"
            }
        },
        "is-path-inside": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
            "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
            "requires": {
                "path-is-inside": "^1.0.2"
            }
        },
        "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="
        },
        "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==",
            "requires": {
                "isobject": "^3.0.1"
            }
        },
        "is-regex": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
            "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
            "requires": {
                "has-symbols": "^1.0.1"
            }
        },
        "is-regexp": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
            "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
        },
        "is-resolvable": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
            "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
        },
        "is-root": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
            "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg=="
        },
        "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=="
        },
        "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==",
            "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="
        },
        "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=="
        },
        "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": "3.0.1",
            "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
            "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
        },
        "isstream": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
            "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
        },
        "istanbul-lib-coverage": {
            "version": "2.0.5",
            "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
            "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA=="
        },
        "istanbul-lib-instrument": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
            "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
            "requires": {
                "@babel/generator": "^7.4.0",
                "@babel/parser": "^7.4.3",
                "@babel/template": "^7.4.0",
                "@babel/traverse": "^7.4.3",
                "@babel/types": "^7.4.0",
                "istanbul-lib-coverage": "^2.0.5",
                "semver": "^6.0.0"
            }
        },
        "istanbul-lib-report": {
            "version": "2.0.8",
            "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
            "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
            "requires": {
                "istanbul-lib-coverage": "^2.0.5",
                "make-dir": "^2.1.0",
                "supports-color": "^6.1.0"
            },
            "dependencies": {
                "supports-color": {
                    "version": "6.1.0",
                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
                    "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
                    "requires": {
                        "has-flag": "^3.0.0"
                    }
                }
            }
        },
        "istanbul-lib-source-maps": {
            "version": "3.0.6",
            "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
            "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
            "requires": {
                "debug": "^4.1.1",
                "istanbul-lib-coverage": "^2.0.5",
                "make-dir": "^2.1.0",
                "rimraf": "^2.6.3",
                "source-map": "^0.6.1"
            }
        },
        "istanbul-reports": {
            "version": "2.2.7",
            "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz",
            "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==",
            "requires": {
                "html-escaper": "^2.0.0"
            }
        },
        "jest": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz",
            "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==",
            "requires": {
                "import-local": "^2.0.0",
                "jest-cli": "^24.9.0"
            }
        },
        "jest-changed-files": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz",
            "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==",
            "requires": {
                "@jest/types": "^24.9.0",
                "execa": "^1.0.0",
                "throat": "^4.0.0"
            }
        },
        "jest-cli": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz",
            "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==",
            "requires": {
                "@jest/core": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "exit": "^0.1.2",
                "import-local": "^2.0.0",
                "is-ci": "^2.0.0",
                "jest-config": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-validate": "^24.9.0",
                "prompts": "^2.0.1",
                "realpath-native": "^1.1.0",
                "yargs": "^13.3.0"
            }
        },
        "jest-config": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz",
            "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==",
            "requires": {
                "@babel/core": "^7.1.0",
                "@jest/test-sequencer": "^24.9.0",
                "@jest/types": "^24.9.0",
                "babel-jest": "^24.9.0",
                "chalk": "^2.0.1",
                "glob": "^7.1.1",
                "jest-environment-jsdom": "^24.9.0",
                "jest-environment-node": "^24.9.0",
                "jest-get-type": "^24.9.0",
                "jest-jasmine2": "^24.9.0",
                "jest-regex-util": "^24.3.0",
                "jest-resolve": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-validate": "^24.9.0",
                "micromatch": "^3.1.10",
                "pretty-format": "^24.9.0",
                "realpath-native": "^1.1.0"
            }
        },
        "jest-diff": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
            "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
            "requires": {
                "chalk": "^2.0.1",
                "diff-sequences": "^24.9.0",
                "jest-get-type": "^24.9.0",
                "pretty-format": "^24.9.0"
            }
        },
        "jest-docblock": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz",
            "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==",
            "requires": {
                "detect-newline": "^2.1.0"
            }
        },
        "jest-each": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz",
            "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==",
            "requires": {
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "jest-get-type": "^24.9.0",
                "jest-util": "^24.9.0",
                "pretty-format": "^24.9.0"
            }
        },
        "jest-environment-jsdom": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz",
            "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==",
            "requires": {
                "@jest/environment": "^24.9.0",
                "@jest/fake-timers": "^24.9.0",
                "@jest/types": "^24.9.0",
                "jest-mock": "^24.9.0",
                "jest-util": "^24.9.0",
                "jsdom": "^11.5.1"
            }
        },
        "jest-environment-jsdom-fourteen": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz",
            "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==",
            "requires": {
                "@jest/environment": "^24.3.0",
                "@jest/fake-timers": "^24.3.0",
                "@jest/types": "^24.3.0",
                "jest-mock": "^24.0.0",
                "jest-util": "^24.0.0",
                "jsdom": "^14.1.0"
            },
            "dependencies": {
                "acorn": {
                    "version": "6.4.1",
                    "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
                    "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA=="
                },
                "jsdom": {
                    "version": "14.1.0",
                    "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz",
                    "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==",
                    "requires": {
                        "abab": "^2.0.0",
                        "acorn": "^6.0.4",
                        "acorn-globals": "^4.3.0",
                        "array-equal": "^1.0.0",
                        "cssom": "^0.3.4",
                        "cssstyle": "^1.1.1",
                        "data-urls": "^1.1.0",
                        "domexception": "^1.0.1",
                        "escodegen": "^1.11.0",
                        "html-encoding-sniffer": "^1.0.2",
                        "nwsapi": "^2.1.3",
                        "parse5": "5.1.0",
                        "pn": "^1.1.0",
                        "request": "^2.88.0",
                        "request-promise-native": "^1.0.5",
                        "saxes": "^3.1.9",
                        "symbol-tree": "^3.2.2",
                        "tough-cookie": "^2.5.0",
                        "w3c-hr-time": "^1.0.1",
                        "w3c-xmlserializer": "^1.1.2",
                        "webidl-conversions": "^4.0.2",
                        "whatwg-encoding": "^1.0.5",
                        "whatwg-mimetype": "^2.3.0",
                        "whatwg-url": "^7.0.0",
                        "ws": "^6.1.2",
                        "xml-name-validator": "^3.0.0"
                    }
                },
                "parse5": {
                    "version": "5.1.0",
                    "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
                    "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="
                },
                "whatwg-url": {
                    "version": "7.1.0",
                    "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
                    "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
                    "requires": {
                        "lodash.sortby": "^4.7.0",
                        "tr46": "^1.0.1",
                        "webidl-conversions": "^4.0.2"
                    }
                },
                "ws": {
                    "version": "6.2.2",
                    "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
                    "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
                    "requires": {
                        "async-limiter": "~1.0.0"
                    }
                }
            }
        },
        "jest-environment-node": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz",
            "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==",
            "requires": {
                "@jest/environment": "^24.9.0",
                "@jest/fake-timers": "^24.9.0",
                "@jest/types": "^24.9.0",
                "jest-mock": "^24.9.0",
                "jest-util": "^24.9.0"
            }
        },
        "jest-get-type": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
            "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q=="
        },
        "jest-haste-map": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
            "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
            "requires": {
                "@jest/types": "^24.9.0",
                "anymatch": "^2.0.0",
                "fb-watchman": "^2.0.0",
                "fsevents": "^1.2.7",
                "graceful-fs": "^4.1.15",
                "invariant": "^2.2.4",
                "jest-serializer": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-worker": "^24.9.0",
                "micromatch": "^3.1.10",
                "sane": "^4.0.3",
                "walker": "^1.0.7"
            },
            "dependencies": {
                "fsevents": {
                    "version": "1.2.13",
                    "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
                    "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
                    "optional": true,
                    "requires": {
                        "bindings": "^1.5.0",
                        "nan": "^2.12.1"
                    }
                }
            }
        },
        "jest-jasmine2": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz",
            "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==",
            "requires": {
                "@babel/traverse": "^7.1.0",
                "@jest/environment": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "co": "^4.6.0",
                "expect": "^24.9.0",
                "is-generator-fn": "^2.0.0",
                "jest-each": "^24.9.0",
                "jest-matcher-utils": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-runtime": "^24.9.0",
                "jest-snapshot": "^24.9.0",
                "jest-util": "^24.9.0",
                "pretty-format": "^24.9.0",
                "throat": "^4.0.0"
            }
        },
        "jest-leak-detector": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz",
            "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==",
            "requires": {
                "jest-get-type": "^24.9.0",
                "pretty-format": "^24.9.0"
            }
        },
        "jest-matcher-utils": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz",
            "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==",
            "requires": {
                "chalk": "^2.0.1",
                "jest-diff": "^24.9.0",
                "jest-get-type": "^24.9.0",
                "pretty-format": "^24.9.0"
            }
        },
        "jest-message-util": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
            "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
            "requires": {
                "@babel/code-frame": "^7.0.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/stack-utils": "^1.0.1",
                "chalk": "^2.0.1",
                "micromatch": "^3.1.10",
                "slash": "^2.0.0",
                "stack-utils": "^1.0.1"
            }
        },
        "jest-mock": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz",
            "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==",
            "requires": {
                "@jest/types": "^24.9.0"
            }
        },
        "jest-pnp-resolver": {
            "version": "1.2.2",
            "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
            "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
            "requires": {}
        },
        "jest-regex-util": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
            "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA=="
        },
        "jest-resolve": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
            "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
            "requires": {
                "@jest/types": "^24.9.0",
                "browser-resolve": "^1.11.3",
                "chalk": "^2.0.1",
                "jest-pnp-resolver": "^1.2.1",
                "realpath-native": "^1.1.0"
            }
        },
        "jest-resolve-dependencies": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz",
            "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==",
            "requires": {
                "@jest/types": "^24.9.0",
                "jest-regex-util": "^24.3.0",
                "jest-snapshot": "^24.9.0"
            }
        },
        "jest-runner": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz",
            "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==",
            "requires": {
                "@jest/console": "^24.7.1",
                "@jest/environment": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.4.2",
                "exit": "^0.1.2",
                "graceful-fs": "^4.1.15",
                "jest-config": "^24.9.0",
                "jest-docblock": "^24.3.0",
                "jest-haste-map": "^24.9.0",
                "jest-jasmine2": "^24.9.0",
                "jest-leak-detector": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-resolve": "^24.9.0",
                "jest-runtime": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-worker": "^24.6.0",
                "source-map-support": "^0.5.6",
                "throat": "^4.0.0"
            }
        },
        "jest-runtime": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz",
            "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==",
            "requires": {
                "@jest/console": "^24.7.1",
                "@jest/environment": "^24.9.0",
                "@jest/source-map": "^24.3.0",
                "@jest/transform": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/yargs": "^13.0.0",
                "chalk": "^2.0.1",
                "exit": "^0.1.2",
                "glob": "^7.1.3",
                "graceful-fs": "^4.1.15",
                "jest-config": "^24.9.0",
                "jest-haste-map": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-mock": "^24.9.0",
                "jest-regex-util": "^24.3.0",
                "jest-resolve": "^24.9.0",
                "jest-snapshot": "^24.9.0",
                "jest-util": "^24.9.0",
                "jest-validate": "^24.9.0",
                "realpath-native": "^1.1.0",
                "slash": "^2.0.0",
                "strip-bom": "^3.0.0",
                "yargs": "^13.3.0"
            }
        },
        "jest-serializer": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
            "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ=="
        },
        "jest-snapshot": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
            "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
            "requires": {
                "@babel/types": "^7.0.0",
                "@jest/types": "^24.9.0",
                "chalk": "^2.0.1",
                "expect": "^24.9.0",
                "jest-diff": "^24.9.0",
                "jest-get-type": "^24.9.0",
                "jest-matcher-utils": "^24.9.0",
                "jest-message-util": "^24.9.0",
                "jest-resolve": "^24.9.0",
                "mkdirp": "^0.5.1",
                "natural-compare": "^1.4.0",
                "pretty-format": "^24.9.0",
                "semver": "^6.2.0"
            }
        },
        "jest-util": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
            "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
            "requires": {
                "@jest/console": "^24.9.0",
                "@jest/fake-timers": "^24.9.0",
                "@jest/source-map": "^24.9.0",
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "callsites": "^3.0.0",
                "chalk": "^2.0.1",
                "graceful-fs": "^4.1.15",
                "is-ci": "^2.0.0",
                "mkdirp": "^0.5.1",
                "slash": "^2.0.0",
                "source-map": "^0.6.0"
            },
            "dependencies": {
                "callsites": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
                    "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
                }
            }
        },
        "jest-validate": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz",
            "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==",
            "requires": {
                "@jest/types": "^24.9.0",
                "camelcase": "^5.3.1",
                "chalk": "^2.0.1",
                "jest-get-type": "^24.9.0",
                "leven": "^3.1.0",
                "pretty-format": "^24.9.0"
            }
        },
        "jest-watch-typeahead": {
            "version": "0.4.2",
            "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz",
            "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==",
            "requires": {
                "ansi-escapes": "^4.2.1",
                "chalk": "^2.4.1",
                "jest-regex-util": "^24.9.0",
                "jest-watcher": "^24.3.0",
                "slash": "^3.0.0",
                "string-length": "^3.1.0",
                "strip-ansi": "^5.0.0"
            },
            "dependencies": {
                "slash": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
                    "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
                },
                "string-length": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz",
                    "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==",
                    "requires": {
                        "astral-regex": "^1.0.0",
                        "strip-ansi": "^5.2.0"
                    }
                }
            }
        },
        "jest-watcher": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz",
            "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==",
            "requires": {
                "@jest/test-result": "^24.9.0",
                "@jest/types": "^24.9.0",
                "@types/yargs": "^13.0.0",
                "ansi-escapes": "^3.0.0",
                "chalk": "^2.0.1",
                "jest-util": "^24.9.0",
                "string-length": "^2.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "jest-worker": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
            "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
            "requires": {
                "merge-stream": "^2.0.0",
                "supports-color": "^6.1.0"
            },
            "dependencies": {
                "supports-color": {
                    "version": "6.1.0",
                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
                    "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
                    "requires": {
                        "has-flag": "^3.0.0"
                    }
                }
            }
        },
        "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.14.0",
            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
            "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
            "requires": {
                "argparse": "^1.0.7",
                "esprima": "^4.0.0"
            }
        },
        "jsbn": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
            "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
        },
        "jsdom": {
            "version": "11.12.0",
            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
            "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
            "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"
            },
            "dependencies": {
                "acorn": {
                    "version": "5.7.4",
                    "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
                    "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg=="
                }
            }
        },
        "jsesc": {
            "version": "2.5.2",
            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
            "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
        },
        "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=="
        },
        "json-schema": {
            "version": "0.2.3",
            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
            "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
        },
        "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=="
        },
        "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=",
            "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="
        },
        "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="
        },
        "json3": {
            "version": "3.3.3",
            "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
            "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
        },
        "json5": {
            "version": "2.1.3",
            "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
            "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
            "requires": {
                "minimist": "^1.2.5"
            }
        },
        "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="
        },
        "jsonwebtoken": {
            "version": "8.5.1",
            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
            "requires": {
                "jws": "^3.2.2",
                "lodash.includes": "^4.3.0",
                "lodash.isboolean": "^3.0.3",
                "lodash.isinteger": "^4.0.4",
                "lodash.isnumber": "^3.0.3",
                "lodash.isplainobject": "^4.0.6",
                "lodash.isstring": "^4.0.1",
                "lodash.once": "^4.0.0",
                "ms": "^2.1.1",
                "semver": "^5.6.0"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "jsprim": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
            "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
            "requires": {
                "assert-plus": "1.0.0",
                "extsprintf": "1.3.0",
                "json-schema": "0.2.3",
                "verror": "1.10.0"
            }
        },
        "jss": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz",
            "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==",
            "requires": {
                "@babel/runtime": "^7.3.1",
                "csstype": "^3.0.2",
                "is-in-browser": "^1.1.3",
                "tiny-warning": "^1.0.2"
            },
            "dependencies": {
                "csstype": {
                    "version": "3.0.8",
                    "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz",
                    "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw=="
                }
            }
        },
        "jss-plugin-camel-case": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz",
            "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==",
            "requires": {
                "@babel/runtime": "^7.3.1",
                "hyphenate-style-name": "^1.0.3",
                "jss": "10.7.1"
            }
        },
        "jss-plugin-default-unit": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz",
            "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==",
            "requires": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1"
            }
        },
        "jss-plugin-global": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz",
            "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==",
            "requires": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1"
            }
        },
        "jss-plugin-nested": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz",
            "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==",
            "requires": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1",
                "tiny-warning": "^1.0.2"
            }
        },
        "jss-plugin-props-sort": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz",
            "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==",
            "requires": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1"
            }
        },
        "jss-plugin-rule-value-function": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz",
            "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==",
            "requires": {
                "@babel/runtime": "^7.3.1",
                "jss": "10.7.1",
                "tiny-warning": "^1.0.2"
            }
        },
        "jss-plugin-vendor-prefixer": {
            "version": "10.7.1",
            "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz",
            "integrity": "sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==",
            "requires": {
                "@babel/runtime": "^7.3.1",
                "css-vendor": "^2.0.8",
                "jss": "10.7.1"
            }
        },
        "jsx-ast-utils": {
            "version": "2.4.1",
            "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
            "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
            "requires": {
                "array-includes": "^3.1.1",
                "object.assign": "^4.1.0"
            }
        },
        "jwa": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
            "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
            "requires": {
                "buffer-equal-constant-time": "1.0.1",
                "ecdsa-sig-formatter": "1.0.11",
                "safe-buffer": "^5.0.1"
            }
        },
        "jws": {
            "version": "3.2.2",
            "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
            "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
            "requires": {
                "jwa": "^1.4.1",
                "safe-buffer": "^5.0.1"
            }
        },
        "killable": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
            "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg=="
        },
        "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"
            }
        },
        "kleur": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
            "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
        },
        "last-call-webpack-plugin": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
            "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
            "requires": {
                "lodash": "^4.17.5",
                "webpack-sources": "^1.1.0"
            }
        },
        "lazy-cache": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
            "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
        },
        "lcid": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
            "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
            "requires": {
                "invert-kv": "^2.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=="
        },
        "leven": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
            "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
        },
        "levenary": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
            "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
            "requires": {
                "leven": "^3.1.0"
            }
        },
        "levn": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
            "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
            "requires": {
                "prelude-ls": "~1.1.2",
                "type-check": "~0.3.2"
            }
        },
        "lines-and-columns": {
            "version": "1.1.6",
            "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
            "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
        },
        "load-json-file": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
            "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
            "requires": {
                "graceful-fs": "^4.1.2",
                "parse-json": "^4.0.0",
                "pify": "^3.0.0",
                "strip-bom": "^3.0.0"
            }
        },
        "loader-fs-cache": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz",
            "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==",
            "requires": {
                "find-cache-dir": "^0.1.1",
                "mkdirp": "^0.5.1"
            },
            "dependencies": {
                "find-cache-dir": {
                    "version": "0.1.1",
                    "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
                    "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
                    "requires": {
                        "commondir": "^1.0.1",
                        "mkdirp": "^0.5.1",
                        "pkg-dir": "^1.0.0"
                    }
                },
                "find-up": {
                    "version": "1.1.2",
                    "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
                    "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
                    "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=",
                    "requires": {
                        "pinkie-promise": "^2.0.0"
                    }
                },
                "pkg-dir": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
                    "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
                    "requires": {
                        "find-up": "^1.0.0"
                    }
                }
            }
        },
        "loader-runner": {
            "version": "2.4.0",
            "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
            "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="
        },
        "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==",
            "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==",
                    "requires": {
                        "minimist": "^1.2.0"
                    }
                }
            }
        },
        "locate-path": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
            "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
            "requires": {
                "p-locate": "^3.0.0",
                "path-exists": "^3.0.0"
            }
        },
        "lodash": {
            "version": "4.17.21",
            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
        },
        "lodash._reinterpolate": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
            "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
        },
        "lodash.includes": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
            "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
        },
        "lodash.isboolean": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
            "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
        },
        "lodash.isinteger": {
            "version": "4.0.4",
            "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
            "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
        },
        "lodash.isnumber": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
            "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
        },
        "lodash.isplainobject": {
            "version": "4.0.6",
            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
            "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
        },
        "lodash.isstring": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
            "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
        },
        "lodash.memoize": {
            "version": "4.1.2",
            "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
            "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
        },
        "lodash.once": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
            "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
        },
        "lodash.sortby": {
            "version": "4.7.0",
            "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
            "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
        },
        "lodash.template": {
            "version": "4.5.0",
            "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
            "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
            "requires": {
                "lodash._reinterpolate": "^3.0.0",
                "lodash.templatesettings": "^4.0.0"
            }
        },
        "lodash.templatesettings": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
            "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
            "requires": {
                "lodash._reinterpolate": "^3.0.0"
            }
        },
        "lodash.uniq": {
            "version": "4.5.0",
            "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
            "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
        },
        "loglevel": {
            "version": "1.6.8",
            "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
            "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA=="
        },
        "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"
            }
        },
        "lower-case": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz",
            "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==",
            "requires": {
                "tslib": "^1.10.0"
            }
        },
        "lru-cache": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
            "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
            "requires": {
                "yallist": "^3.0.2"
            },
            "dependencies": {
                "yallist": {
                    "version": "3.1.1",
                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
                    "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
                }
            }
        },
        "make-dir": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
            "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
            "requires": {
                "pify": "^4.0.1",
                "semver": "^5.6.0"
            },
            "dependencies": {
                "pify": {
                    "version": "4.0.1",
                    "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
                    "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
                },
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "makeerror": {
            "version": "1.0.11",
            "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
            "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
            "requires": {
                "tmpl": "1.0.x"
            }
        },
        "mamacro": {
            "version": "0.0.3",
            "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
            "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA=="
        },
        "map-age-cleaner": {
            "version": "0.1.3",
            "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
            "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
            "requires": {
                "p-defer": "^1.0.0"
            }
        },
        "map-cache": {
            "version": "0.2.2",
            "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
            "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
        },
        "map-visit": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
            "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
            "requires": {
                "object-visit": "^1.0.0"
            }
        },
        "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==",
            "requires": {
                "hash-base": "^3.0.0",
                "inherits": "^2.0.1",
                "safe-buffer": "^5.1.2"
            }
        },
        "mdn-data": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
            "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
        },
        "media-typer": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
            "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
        },
        "mem": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
            "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
            "requires": {
                "map-age-cleaner": "^0.1.1",
                "mimic-fn": "^2.0.0",
                "p-is-promise": "^2.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=",
            "requires": {
                "errno": "^0.1.3",
                "readable-stream": "^2.0.1"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "merge-deep": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
            "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
            "requires": {
                "arr-union": "^3.1.0",
                "clone-deep": "^0.2.4",
                "kind-of": "^3.0.2"
            }
        },
        "merge-descriptors": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
            "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
        },
        "merge-stream": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
            "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
        },
        "merge2": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
        },
        "methods": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
            "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
        },
        "microevent.ts": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz",
            "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g=="
        },
        "micromatch": {
            "version": "3.1.10",
            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
            "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
            "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"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "miller-rabin": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
            "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
            "requires": {
                "bn.js": "^4.0.0",
                "brorand": "^1.0.1"
            },
            "dependencies": {
                "bn.js": {
                    "version": "4.11.9",
                    "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
                    "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
                }
            }
        },
        "mime": {
            "version": "2.4.6",
            "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
            "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
        },
        "mime-db": {
            "version": "1.44.0",
            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
            "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
        },
        "mime-types": {
            "version": "2.1.27",
            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
            "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
            "requires": {
                "mime-db": "1.44.0"
            }
        },
        "mimic-fn": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
            "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
        },
        "min-indent": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
        },
        "mini-create-react-context": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz",
            "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==",
            "requires": {
                "@babel/runtime": "^7.5.5",
                "tiny-warning": "^1.0.3"
            }
        },
        "mini-css-extract-plugin": {
            "version": "0.9.0",
            "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz",
            "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==",
            "requires": {
                "loader-utils": "^1.1.0",
                "normalize-url": "1.9.1",
                "schema-utils": "^1.0.0",
                "webpack-sources": "^1.1.0"
            },
            "dependencies": {
                "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==",
                    "requires": {
                        "ajv": "^6.1.0",
                        "ajv-errors": "^1.0.0",
                        "ajv-keywords": "^3.1.0"
                    }
                }
            }
        },
        "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=="
        },
        "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="
        },
        "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=="
        },
        "minipass": {
            "version": "3.1.3",
            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
            "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
            "requires": {
                "yallist": "^4.0.0"
            }
        },
        "minipass-collect": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
            "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
            "requires": {
                "minipass": "^3.0.0"
            }
        },
        "minipass-flush": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
            "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
            "requires": {
                "minipass": "^3.0.0"
            }
        },
        "minipass-pipeline": {
            "version": "1.2.4",
            "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
            "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
            "requires": {
                "minipass": "^3.0.0"
            }
        },
        "mississippi": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
            "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
            "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": "^3.0.0",
                "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==",
            "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==",
                    "requires": {
                        "is-plain-object": "^2.0.4"
                    }
                }
            }
        },
        "mixin-object": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
            "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
            "requires": {
                "for-in": "^0.1.3",
                "is-extendable": "^0.1.1"
            },
            "dependencies": {
                "for-in": {
                    "version": "0.1.8",
                    "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
                    "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE="
                }
            }
        },
        "mkdirp": {
            "version": "0.5.5",
            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
            "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
            "requires": {
                "minimist": "^1.2.5"
            }
        },
        "moment": {
            "version": "2.29.1",
            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
            "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
        },
        "move-concurrently": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
            "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
            "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"
            }
        },
        "ms": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
        },
        "multicast-dns": {
            "version": "6.2.3",
            "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
            "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
            "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="
        },
        "mute-stream": {
            "version": "0.0.8",
            "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
            "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
        },
        "nanomatch": {
            "version": "1.2.13",
            "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
            "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
            "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": {
                "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=="
                }
            }
        },
        "natural-compare": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
            "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
        },
        "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.2",
            "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
            "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
        },
        "next-tick": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
            "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
        },
        "nice-try": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
            "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
        },
        "no-case": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz",
            "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==",
            "requires": {
                "lower-case": "^2.0.1",
                "tslib": "^1.10.0"
            }
        },
        "node-forge": {
            "version": "0.10.0",
            "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
            "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="
        },
        "node-int64": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
            "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
        },
        "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==",
            "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": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "punycode": {
                    "version": "1.4.1",
                    "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
                    "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
                },
                "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==",
                    "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": {
                        "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==",
                            "requires": {
                                "safe-buffer": "~5.1.0"
                            }
                        }
                    }
                },
                "util": {
                    "version": "0.11.1",
                    "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
                    "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
                    "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="
                        }
                    }
                }
            }
        },
        "node-modules-regexp": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
            "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA="
        },
        "node-notifier": {
            "version": "5.4.5",
            "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz",
            "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==",
            "requires": {
                "growly": "^1.3.0",
                "is-wsl": "^1.1.0",
                "semver": "^5.5.0",
                "shellwords": "^0.1.1",
                "which": "^1.3.0"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "node-releases": {
            "version": "1.1.60",
            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz",
            "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA=="
        },
        "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==",
            "requires": {
                "hosted-git-info": "^2.1.4",
                "resolve": "^1.10.0",
                "semver": "2 || 3 || 4 || 5",
                "validate-npm-package-license": "^3.0.1"
            },
            "dependencies": {
                "semver": {
                    "version": "5.7.1",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                }
            }
        },
        "normalize-path": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
            "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
            "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="
        },
        "normalize-url": {
            "version": "1.9.1",
            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
            "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
            "requires": {
                "object-assign": "^4.0.1",
                "prepend-http": "^1.0.0",
                "query-string": "^4.1.0",
                "sort-keys": "^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==",
            "requires": {
                "boolbase": "~1.0.0"
            }
        },
        "num2fraction": {
            "version": "1.2.2",
            "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
            "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
        },
        "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="
        },
        "nwsapi": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
            "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
        },
        "oauth-sign": {
            "version": "0.9.0",
            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
            "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
        },
        "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=",
            "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=",
                    "requires": {
                        "is-descriptor": "^0.1.0"
                    }
                }
            }
        },
        "object-hash": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
            "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg=="
        },
        "object-inspect": {
            "version": "1.8.0",
            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
            "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
        },
        "object-is": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
            "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
            "requires": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.5"
            }
        },
        "object-keys": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
            "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
        },
        "object-path": {
            "version": "0.11.4",
            "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz",
            "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk="
        },
        "object-visit": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
            "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
            "requires": {
                "isobject": "^3.0.0"
            }
        },
        "object.assign": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
            "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
            "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.2",
            "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
            "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
            "requires": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.5",
                "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==",
            "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==",
            "requires": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0-next.1"
            }
        },
        "object.pick": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
            "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
            "requires": {
                "isobject": "^3.0.1"
            }
        },
        "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==",
            "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=="
        },
        "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": "5.1.1",
            "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.1.tgz",
            "integrity": "sha512-ZpZpjcJeugQfWsfyQlshVoowIIQ1qBGSVll4rfDq6JJVO//fesjoX808hXWfBjY+ROZgpKDI5TRSRBSoJiZ8eg==",
            "requires": {
                "mimic-fn": "^2.1.0"
            }
        },
        "open": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz",
            "integrity": "sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==",
            "requires": {
                "is-docker": "^2.0.0",
                "is-wsl": "^2.1.1"
            },
            "dependencies": {
                "is-wsl": {
                    "version": "2.2.0",
                    "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
                    "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
                    "requires": {
                        "is-docker": "^2.0.0"
                    }
                }
            }
        },
        "opn": {
            "version": "5.5.0",
            "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
            "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
            "requires": {
                "is-wsl": "^1.1.0"
            }
        },
        "optimize-css-assets-webpack-plugin": {
            "version": "5.0.3",
            "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz",
            "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==",
            "requires": {
                "cssnano": "^4.1.10",
                "last-call-webpack-plugin": "^3.0.0"
            }
        },
        "optionator": {
            "version": "0.8.3",
            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
            "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
            "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==",
            "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="
        },
        "os-locale": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
            "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
            "requires": {
                "execa": "^1.0.0",
                "lcid": "^2.0.0",
                "mem": "^4.0.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="
        },
        "p-defer": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
            "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
        },
        "p-each-series": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
            "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
            "requires": {
                "p-reduce": "^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-is-promise": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
            "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
        },
        "p-limit": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
            "requires": {
                "p-try": "^2.0.0"
            }
        },
        "p-locate": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
            "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
            "requires": {
                "p-limit": "^2.0.0"
            }
        },
        "p-map": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
            "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
            "requires": {
                "aggregate-error": "^3.0.0"
            }
        },
        "p-reduce": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
            "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo="
        },
        "p-retry": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
            "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
            "requires": {
                "retry": "^0.12.0"
            }
        },
        "p-try": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
        },
        "pako": {
            "version": "1.0.11",
            "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
            "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
        },
        "parallel-transform": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
            "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
            "requires": {
                "cyclist": "^1.0.1",
                "inherits": "^2.0.3",
                "readable-stream": "^2.1.5"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "param-case": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz",
            "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==",
            "requires": {
                "dot-case": "^3.0.3",
                "tslib": "^1.10.0"
            }
        },
        "parent-module": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
            "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
            "requires": {
                "callsites": "^3.0.0"
            },
            "dependencies": {
                "callsites": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
                    "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
                }
            }
        },
        "parse-asn1": {
            "version": "5.1.5",
            "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
            "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
            "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-json": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
            "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
            "requires": {
                "error-ex": "^1.3.1",
                "json-parse-better-errors": "^1.0.1"
            }
        },
        "parse5": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
            "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA=="
        },
        "parseurl": {
            "version": "1.3.3",
            "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
            "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
        },
        "pascal-case": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz",
            "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==",
            "requires": {
                "no-case": "^3.0.3",
                "tslib": "^1.10.0"
            }
        },
        "pascalcase": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
            "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
        },
        "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=="
        },
        "path-dirname": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
            "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
        },
        "path-exists": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
            "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
        },
        "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.7",
            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
        },
        "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"
            }
        },
        "pbkdf2": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
            "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
            "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="
        },
        "picocolors": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
            "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
        },
        "picomatch": {
            "version": "2.2.2",
            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
            "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
        },
        "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="
        },
        "pinkie-promise": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
            "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
            "requires": {
                "pinkie": "^2.0.0"
            }
        },
        "pirates": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
            "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
            "requires": {
                "node-modules-regexp": "^1.0.0"
            }
        },
        "pkg-dir": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
            "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
            "requires": {
                "find-up": "^3.0.0"
            }
        },
        "pkg-up": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
            "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
            "requires": {
                "find-up": "^3.0.0"
            }
        },
        "pn": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
            "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
        },
        "pnp-webpack-plugin": {
            "version": "1.6.4",
            "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
            "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==",
            "requires": {
                "ts-pnp": "^1.1.6"
            }
        },
        "popper.js": {
            "version": "1.16.1-lts",
            "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz",
            "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA=="
        },
        "portfinder": {
            "version": "1.0.28",
            "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
            "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
            "requires": {
                "async": "^2.6.2",
                "debug": "^3.1.1",
                "mkdirp": "^0.5.5"
            },
            "dependencies": {
                "debug": {
                    "version": "3.2.6",
                    "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
                    "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
                    "requires": {
                        "ms": "^2.1.1"
                    }
                }
            }
        },
        "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="
        },
        "postcss": {
            "version": "7.0.39",
            "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
            "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
            "requires": {
                "picocolors": "^0.2.1",
                "source-map": "^0.6.1"
            },
            "dependencies": {
                "picocolors": {
                    "version": "0.2.1",
                    "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
                    "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
                }
            }
        },
        "postcss-attribute-case-insensitive": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
            "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-selector-parser": "^6.0.2"
            }
        },
        "postcss-browser-comments": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz",
            "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==",
            "requires": {
                "postcss": "^7"
            }
        },
        "postcss-calc": {
            "version": "7.0.2",
            "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz",
            "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==",
            "requires": {
                "postcss": "^7.0.27",
                "postcss-selector-parser": "^6.0.2",
                "postcss-value-parser": "^4.0.2"
            }
        },
        "postcss-color-functional-notation": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
            "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            }
        },
        "postcss-color-gray": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
            "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
            "requires": {
                "@csstools/convert-colors": "^1.4.0",
                "postcss": "^7.0.5",
                "postcss-values-parser": "^2.0.0"
            }
        },
        "postcss-color-hex-alpha": {
            "version": "5.0.3",
            "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
            "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
            "requires": {
                "postcss": "^7.0.14",
                "postcss-values-parser": "^2.0.1"
            }
        },
        "postcss-color-mod-function": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
            "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
            "requires": {
                "@csstools/convert-colors": "^1.4.0",
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            }
        },
        "postcss-color-rebeccapurple": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
            "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            }
        },
        "postcss-colormin": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
            "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
            "requires": {
                "browserslist": "^4.0.0",
                "color": "^3.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-convert-values": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
            "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
            "requires": {
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-custom-media": {
            "version": "7.0.8",
            "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
            "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
            "requires": {
                "postcss": "^7.0.14"
            }
        },
        "postcss-custom-properties": {
            "version": "8.0.11",
            "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
            "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
            "requires": {
                "postcss": "^7.0.17",
                "postcss-values-parser": "^2.0.1"
            }
        },
        "postcss-custom-selectors": {
            "version": "5.1.2",
            "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
            "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-selector-parser": "^5.0.0-rc.3"
            },
            "dependencies": {
                "cssesc": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
                    "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
                },
                "postcss-selector-parser": {
                    "version": "5.0.0",
                    "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
                    "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
                    "requires": {
                        "cssesc": "^2.0.0",
                        "indexes-of": "^1.0.1",
                        "uniq": "^1.0.1"
                    }
                }
            }
        },
        "postcss-dir-pseudo-class": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
            "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-selector-parser": "^5.0.0-rc.3"
            },
            "dependencies": {
                "cssesc": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
                    "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
                },
                "postcss-selector-parser": {
                    "version": "5.0.0",
                    "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
                    "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
                    "requires": {
                        "cssesc": "^2.0.0",
                        "indexes-of": "^1.0.1",
                        "uniq": "^1.0.1"
                    }
                }
            }
        },
        "postcss-discard-comments": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
            "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
            "requires": {
                "postcss": "^7.0.0"
            }
        },
        "postcss-discard-duplicates": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
            "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
            "requires": {
                "postcss": "^7.0.0"
            }
        },
        "postcss-discard-empty": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
            "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
            "requires": {
                "postcss": "^7.0.0"
            }
        },
        "postcss-discard-overridden": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
            "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
            "requires": {
                "postcss": "^7.0.0"
            }
        },
        "postcss-double-position-gradients": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
            "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
            "requires": {
                "postcss": "^7.0.5",
                "postcss-values-parser": "^2.0.0"
            }
        },
        "postcss-env-function": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
            "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            }
        },
        "postcss-flexbugs-fixes": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz",
            "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==",
            "requires": {
                "postcss": "^7.0.0"
            }
        },
        "postcss-focus-visible": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
            "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-focus-within": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
            "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-font-variant": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz",
            "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-gap-properties": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
            "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-image-set-function": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
            "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            }
        },
        "postcss-initial": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz",
            "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==",
            "requires": {
                "lodash.template": "^4.5.0",
                "postcss": "^7.0.2"
            }
        },
        "postcss-lab-function": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
            "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
            "requires": {
                "@csstools/convert-colors": "^1.4.0",
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.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==",
            "requires": {
                "cosmiconfig": "^5.0.0",
                "import-cwd": "^2.0.0"
            }
        },
        "postcss-loader": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
            "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
            "requires": {
                "loader-utils": "^1.1.0",
                "postcss": "^7.0.0",
                "postcss-load-config": "^2.0.0",
                "schema-utils": "^1.0.0"
            },
            "dependencies": {
                "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==",
                    "requires": {
                        "ajv": "^6.1.0",
                        "ajv-errors": "^1.0.0",
                        "ajv-keywords": "^3.1.0"
                    }
                }
            }
        },
        "postcss-logical": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
            "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-media-minmax": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
            "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-merge-longhand": {
            "version": "4.0.11",
            "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
            "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
            "requires": {
                "css-color-names": "0.0.4",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0",
                "stylehacks": "^4.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-merge-rules": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
            "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
            "requires": {
                "browserslist": "^4.0.0",
                "caniuse-api": "^3.0.0",
                "cssnano-util-same-parent": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-selector-parser": "^3.0.0",
                "vendors": "^1.0.0"
            },
            "dependencies": {
                "postcss-selector-parser": {
                    "version": "3.1.2",
                    "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
                    "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
                    "requires": {
                        "dot-prop": "^5.2.0",
                        "indexes-of": "^1.0.1",
                        "uniq": "^1.0.1"
                    }
                }
            }
        },
        "postcss-minify-font-values": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
            "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
            "requires": {
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-minify-gradients": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
            "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
            "requires": {
                "cssnano-util-get-arguments": "^4.0.0",
                "is-color-stop": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-minify-params": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
            "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
            "requires": {
                "alphanum-sort": "^1.0.0",
                "browserslist": "^4.0.0",
                "cssnano-util-get-arguments": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0",
                "uniqs": "^2.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-minify-selectors": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
            "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
            "requires": {
                "alphanum-sort": "^1.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-selector-parser": "^3.0.0"
            },
            "dependencies": {
                "postcss-selector-parser": {
                    "version": "3.1.2",
                    "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
                    "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
                    "requires": {
                        "dot-prop": "^5.2.0",
                        "indexes-of": "^1.0.1",
                        "uniq": "^1.0.1"
                    }
                }
            }
        },
        "postcss-modules-extract-imports": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
            "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
            "requires": {
                "postcss": "^7.0.5"
            }
        },
        "postcss-modules-local-by-default": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
            "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
            "requires": {
                "icss-utils": "^4.1.1",
                "postcss": "^7.0.32",
                "postcss-selector-parser": "^6.0.2",
                "postcss-value-parser": "^4.1.0"
            }
        },
        "postcss-modules-scope": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
            "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
            "requires": {
                "postcss": "^7.0.6",
                "postcss-selector-parser": "^6.0.0"
            }
        },
        "postcss-modules-values": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
            "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
            "requires": {
                "icss-utils": "^4.0.0",
                "postcss": "^7.0.6"
            }
        },
        "postcss-nesting": {
            "version": "7.0.1",
            "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
            "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-normalize": {
            "version": "8.0.1",
            "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz",
            "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==",
            "requires": {
                "@csstools/normalize.css": "^10.1.0",
                "browserslist": "^4.6.2",
                "postcss": "^7.0.17",
                "postcss-browser-comments": "^3.0.0",
                "sanitize.css": "^10.0.0"
            }
        },
        "postcss-normalize-charset": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
            "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
            "requires": {
                "postcss": "^7.0.0"
            }
        },
        "postcss-normalize-display-values": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
            "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
            "requires": {
                "cssnano-util-get-match": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-normalize-positions": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
            "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
            "requires": {
                "cssnano-util-get-arguments": "^4.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-normalize-repeat-style": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
            "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
            "requires": {
                "cssnano-util-get-arguments": "^4.0.0",
                "cssnano-util-get-match": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-normalize-string": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
            "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
            "requires": {
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-normalize-timing-functions": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
            "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
            "requires": {
                "cssnano-util-get-match": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-normalize-unicode": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
            "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
            "requires": {
                "browserslist": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-normalize-url": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
            "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
            "requires": {
                "is-absolute-url": "^2.0.0",
                "normalize-url": "^3.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "normalize-url": {
                    "version": "3.3.0",
                    "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
                    "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
                },
                "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=="
                }
            }
        },
        "postcss-normalize-whitespace": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
            "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
            "requires": {
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-ordered-values": {
            "version": "4.1.2",
            "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
            "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
            "requires": {
                "cssnano-util-get-arguments": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-overflow-shorthand": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
            "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-page-break": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
            "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-place": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
            "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-values-parser": "^2.0.0"
            }
        },
        "postcss-preset-env": {
            "version": "6.7.0",
            "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
            "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
            "requires": {
                "autoprefixer": "^9.6.1",
                "browserslist": "^4.6.4",
                "caniuse-lite": "^1.0.30000981",
                "css-blank-pseudo": "^0.1.4",
                "css-has-pseudo": "^0.10.0",
                "css-prefers-color-scheme": "^3.1.1",
                "cssdb": "^4.4.0",
                "postcss": "^7.0.17",
                "postcss-attribute-case-insensitive": "^4.0.1",
                "postcss-color-functional-notation": "^2.0.1",
                "postcss-color-gray": "^5.0.0",
                "postcss-color-hex-alpha": "^5.0.3",
                "postcss-color-mod-function": "^3.0.3",
                "postcss-color-rebeccapurple": "^4.0.1",
                "postcss-custom-media": "^7.0.8",
                "postcss-custom-properties": "^8.0.11",
                "postcss-custom-selectors": "^5.1.2",
                "postcss-dir-pseudo-class": "^5.0.0",
                "postcss-double-position-gradients": "^1.0.0",
                "postcss-env-function": "^2.0.2",
                "postcss-focus-visible": "^4.0.0",
                "postcss-focus-within": "^3.0.0",
                "postcss-font-variant": "^4.0.0",
                "postcss-gap-properties": "^2.0.0",
                "postcss-image-set-function": "^3.0.1",
                "postcss-initial": "^3.0.0",
                "postcss-lab-function": "^2.0.1",
                "postcss-logical": "^3.0.0",
                "postcss-media-minmax": "^4.0.0",
                "postcss-nesting": "^7.0.0",
                "postcss-overflow-shorthand": "^2.0.0",
                "postcss-page-break": "^2.0.0",
                "postcss-place": "^4.0.1",
                "postcss-pseudo-class-any-link": "^6.0.0",
                "postcss-replace-overflow-wrap": "^3.0.0",
                "postcss-selector-matches": "^4.0.0",
                "postcss-selector-not": "^4.0.0"
            }
        },
        "postcss-pseudo-class-any-link": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
            "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
            "requires": {
                "postcss": "^7.0.2",
                "postcss-selector-parser": "^5.0.0-rc.3"
            },
            "dependencies": {
                "cssesc": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
                    "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
                },
                "postcss-selector-parser": {
                    "version": "5.0.0",
                    "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
                    "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
                    "requires": {
                        "cssesc": "^2.0.0",
                        "indexes-of": "^1.0.1",
                        "uniq": "^1.0.1"
                    }
                }
            }
        },
        "postcss-reduce-initial": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
            "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
            "requires": {
                "browserslist": "^4.0.0",
                "caniuse-api": "^3.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0"
            }
        },
        "postcss-reduce-transforms": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
            "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
            "requires": {
                "cssnano-util-get-match": "^4.0.0",
                "has": "^1.0.0",
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-replace-overflow-wrap": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
            "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
            "requires": {
                "postcss": "^7.0.2"
            }
        },
        "postcss-safe-parser": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz",
            "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==",
            "requires": {
                "postcss": "^7.0.0"
            }
        },
        "postcss-selector-matches": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
            "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
            "requires": {
                "balanced-match": "^1.0.0",
                "postcss": "^7.0.2"
            }
        },
        "postcss-selector-not": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz",
            "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==",
            "requires": {
                "balanced-match": "^1.0.0",
                "postcss": "^7.0.2"
            }
        },
        "postcss-selector-parser": {
            "version": "6.0.2",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
            "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
            "requires": {
                "cssesc": "^3.0.0",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            }
        },
        "postcss-svgo": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz",
            "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==",
            "requires": {
                "postcss": "^7.0.0",
                "postcss-value-parser": "^3.0.0",
                "svgo": "^1.0.0"
            },
            "dependencies": {
                "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=="
                }
            }
        },
        "postcss-unique-selectors": {
            "version": "4.0.1",
            "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
            "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
            "requires": {
                "alphanum-sort": "^1.0.0",
                "postcss": "^7.0.0",
                "uniqs": "^2.0.0"
            }
        },
        "postcss-value-parser": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
            "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
        },
        "postcss-values-parser": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
            "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
            "requires": {
                "flatten": "^1.0.2",
                "indexes-of": "^1.0.1",
                "uniq": "^1.0.1"
            }
        },
        "prelude-ls": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
            "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
        },
        "prepend-http": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
            "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
        },
        "pretty-bytes": {
            "version": "5.3.0",
            "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
            "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg=="
        },
        "pretty-error": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
            "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
            "requires": {
                "renderkid": "^2.0.1",
                "utila": "~0.4"
            }
        },
        "pretty-format": {
            "version": "24.9.0",
            "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
            "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
            "requires": {
                "@jest/types": "^24.9.0",
                "ansi-regex": "^4.0.0",
                "ansi-styles": "^3.2.0",
                "react-is": "^16.8.4"
            }
        },
        "process": {
            "version": "0.11.10",
            "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
            "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
        },
        "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=="
        },
        "progress": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
            "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
        },
        "promise": {
            "version": "8.1.0",
            "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
            "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
            "requires": {
                "asap": "~2.0.6"
            }
        },
        "promise-inflight": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
            "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
        },
        "prompts": {
            "version": "2.3.2",
            "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz",
            "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==",
            "requires": {
                "kleur": "^3.0.3",
                "sisteransi": "^1.0.4"
            }
        },
        "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"
            }
        },
        "proxy-addr": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
            "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
            "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="
        },
        "psl": {
            "version": "1.8.0",
            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
        },
        "public-encrypt": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
            "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
            "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": {
                "bn.js": {
                    "version": "4.11.9",
                    "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
                    "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
                }
            }
        },
        "pump": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
            "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==",
            "requires": {
                "duplexify": "^3.6.0",
                "inherits": "^2.0.3",
                "pump": "^2.0.0"
            },
            "dependencies": {
                "pump": {
                    "version": "2.0.1",
                    "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
                    "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
                    "requires": {
                        "end-of-stream": "^1.1.0",
                        "once": "^1.3.1"
                    }
                }
            }
        },
        "punycode": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
        },
        "q": {
            "version": "1.5.1",
            "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
            "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
        },
        "qs": {
            "version": "6.5.2",
            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
            "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
        },
        "query-string": {
            "version": "4.3.4",
            "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
            "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
            "requires": {
                "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="
        },
        "querystring-es3": {
            "version": "0.2.1",
            "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
            "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
        },
        "querystringify": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
            "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="
        },
        "raf": {
            "version": "3.4.1",
            "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
            "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
            "requires": {
                "performance-now": "^2.1.0"
            }
        },
        "randombytes": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
            "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
            "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==",
            "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.4.0",
            "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
            "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
            "requires": {
                "bytes": "3.1.0",
                "http-errors": "1.7.2",
                "iconv-lite": "0.4.24",
                "unpipe": "1.0.0"
            },
            "dependencies": {
                "bytes": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
                    "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
                }
            }
        },
        "react": {
            "version": "16.13.1",
            "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
            "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
            "requires": {
                "loose-envify": "^1.1.0",
                "object-assign": "^4.1.1",
                "prop-types": "^15.6.2"
            }
        },
        "react-app-polyfill": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz",
            "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==",
            "requires": {
                "core-js": "^3.5.0",
                "object-assign": "^4.1.1",
                "promise": "^8.0.3",
                "raf": "^3.4.1",
                "regenerator-runtime": "^0.13.3",
                "whatwg-fetch": "^3.0.0"
            }
        },
        "react-dev-utils": {
            "version": "10.2.1",
            "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz",
            "integrity": "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==",
            "requires": {
                "@babel/code-frame": "7.8.3",
                "address": "1.1.2",
                "browserslist": "4.10.0",
                "chalk": "2.4.2",
                "cross-spawn": "7.0.1",
                "detect-port-alt": "1.1.6",
                "escape-string-regexp": "2.0.0",
                "filesize": "6.0.1",
                "find-up": "4.1.0",
                "fork-ts-checker-webpack-plugin": "3.1.1",
                "global-modules": "2.0.0",
                "globby": "8.0.2",
                "gzip-size": "5.1.1",
                "immer": "1.10.0",
                "inquirer": "7.0.4",
                "is-root": "2.1.0",
                "loader-utils": "1.2.3",
                "open": "^7.0.2",
                "pkg-up": "3.1.0",
                "react-error-overlay": "^6.0.7",
                "recursive-readdir": "2.2.2",
                "shell-quote": "1.7.2",
                "strip-ansi": "6.0.0",
                "text-table": "0.2.0"
            },
            "dependencies": {
                "@babel/code-frame": {
                    "version": "7.8.3",
                    "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
                    "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
                    "requires": {
                        "@babel/highlight": "^7.8.3"
                    }
                },
                "browserslist": {
                    "version": "4.10.0",
                    "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz",
                    "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==",
                    "requires": {
                        "caniuse-lite": "^1.0.30001035",
                        "electron-to-chromium": "^1.3.378",
                        "node-releases": "^1.1.52",
                        "pkg-up": "^3.1.0"
                    }
                },
                "cli-width": {
                    "version": "2.2.1",
                    "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
                    "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
                },
                "cross-spawn": {
                    "version": "7.0.1",
                    "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
                    "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
                    "requires": {
                        "path-key": "^3.1.0",
                        "shebang-command": "^2.0.0",
                        "which": "^2.0.1"
                    }
                },
                "emojis-list": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
                    "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
                },
                "escape-string-regexp": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
                    "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
                },
                "find-up": {
                    "version": "4.1.0",
                    "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
                    "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
                    "requires": {
                        "locate-path": "^5.0.0",
                        "path-exists": "^4.0.0"
                    }
                },
                "inquirer": {
                    "version": "7.0.4",
                    "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz",
                    "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==",
                    "requires": {
                        "ansi-escapes": "^4.2.1",
                        "chalk": "^2.4.2",
                        "cli-cursor": "^3.1.0",
                        "cli-width": "^2.0.0",
                        "external-editor": "^3.0.3",
                        "figures": "^3.0.0",
                        "lodash": "^4.17.15",
                        "mute-stream": "0.0.8",
                        "run-async": "^2.2.0",
                        "rxjs": "^6.5.3",
                        "string-width": "^4.1.0",
                        "strip-ansi": "^5.1.0",
                        "through": "^2.3.6"
                    },
                    "dependencies": {
                        "strip-ansi": {
                            "version": "5.2.0",
                            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
                            "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
                            "requires": {
                                "ansi-regex": "^4.1.0"
                            }
                        }
                    }
                },
                "json5": {
                    "version": "1.0.1",
                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
                    "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
                    "requires": {
                        "minimist": "^1.2.0"
                    }
                },
                "loader-utils": {
                    "version": "1.2.3",
                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
                    "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
                    "requires": {
                        "big.js": "^5.2.2",
                        "emojis-list": "^2.0.0",
                        "json5": "^1.0.1"
                    }
                },
                "locate-path": {
                    "version": "5.0.0",
                    "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
                    "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
                    "requires": {
                        "p-locate": "^4.1.0"
                    }
                },
                "p-locate": {
                    "version": "4.1.0",
                    "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
                    "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
                    "requires": {
                        "p-limit": "^2.2.0"
                    }
                },
                "path-exists": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
                    "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
                },
                "path-key": {
                    "version": "3.1.1",
                    "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
                    "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
                },
                "shebang-command": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
                    "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
                    "requires": {
                        "shebang-regex": "^3.0.0"
                    }
                },
                "shebang-regex": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
                    "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
                },
                "strip-ansi": {
                    "version": "6.0.0",
                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
                    "requires": {
                        "ansi-regex": "^5.0.0"
                    },
                    "dependencies": {
                        "ansi-regex": {
                            "version": "5.0.1",
                            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
                            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
                        }
                    }
                },
                "which": {
                    "version": "2.0.2",
                    "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
                    "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
                    "requires": {
                        "isexe": "^2.0.0"
                    }
                }
            }
        },
        "react-dom": {
            "version": "16.13.1",
            "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
            "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
            "requires": {
                "loose-envify": "^1.1.0",
                "object-assign": "^4.1.1",
                "prop-types": "^15.6.2",
                "scheduler": "^0.19.1"
            }
        },
        "react-error-overlay": {
            "version": "6.0.7",
            "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz",
            "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA=="
        },
        "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": "5.2.0",
            "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz",
            "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==",
            "requires": {
                "@babel/runtime": "^7.1.2",
                "history": "^4.9.0",
                "hoist-non-react-statics": "^3.1.0",
                "loose-envify": "^1.3.1",
                "mini-create-react-context": "^0.4.0",
                "path-to-regexp": "^1.7.0",
                "prop-types": "^15.6.2",
                "react-is": "^16.6.0",
                "tiny-invariant": "^1.0.2",
                "tiny-warning": "^1.0.0"
            }
        },
        "react-router-dom": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz",
            "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==",
            "requires": {
                "@babel/runtime": "^7.1.2",
                "history": "^4.9.0",
                "loose-envify": "^1.3.1",
                "prop-types": "^15.6.2",
                "react-router": "5.2.0",
                "tiny-invariant": "^1.0.2",
                "tiny-warning": "^1.0.0"
            }
        },
        "react-scripts": {
            "version": "3.4.1",
            "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz",
            "integrity": "sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ==",
            "requires": {
                "@babel/core": "7.9.0",
                "@svgr/webpack": "4.3.3",
                "@typescript-eslint/eslint-plugin": "^2.10.0",
                "@typescript-eslint/parser": "^2.10.0",
                "babel-eslint": "10.1.0",
                "babel-jest": "^24.9.0",
                "babel-loader": "8.1.0",
                "babel-plugin-named-asset-import": "^0.3.6",
                "babel-preset-react-app": "^9.1.2",
                "camelcase": "^5.3.1",
                "case-sensitive-paths-webpack-plugin": "2.3.0",
                "css-loader": "3.4.2",
                "dotenv": "8.2.0",
                "dotenv-expand": "5.1.0",
                "eslint": "^6.6.0",
                "eslint-config-react-app": "^5.2.1",
                "eslint-loader": "3.0.3",
                "eslint-plugin-flowtype": "4.6.0",
                "eslint-plugin-import": "2.20.1",
                "eslint-plugin-jsx-a11y": "6.2.3",
                "eslint-plugin-react": "7.19.0",
                "eslint-plugin-react-hooks": "^1.6.1",
                "file-loader": "4.3.0",
                "fs-extra": "^8.1.0",
                "fsevents": "2.1.2",
                "html-webpack-plugin": "4.0.0-beta.11",
                "identity-obj-proxy": "3.0.0",
                "jest": "24.9.0",
                "jest-environment-jsdom-fourteen": "1.0.1",
                "jest-resolve": "24.9.0",
                "jest-watch-typeahead": "0.4.2",
                "mini-css-extract-plugin": "0.9.0",
                "optimize-css-assets-webpack-plugin": "5.0.3",
                "pnp-webpack-plugin": "1.6.4",
                "postcss-flexbugs-fixes": "4.1.0",
                "postcss-loader": "3.0.0",
                "postcss-normalize": "8.0.1",
                "postcss-preset-env": "6.7.0",
                "postcss-safe-parser": "4.0.1",
                "react-app-polyfill": "^1.0.6",
                "react-dev-utils": "^10.2.1",
                "resolve": "1.15.0",
                "resolve-url-loader": "3.1.1",
                "sass-loader": "8.0.2",
                "semver": "6.3.0",
                "style-loader": "0.23.1",
                "terser-webpack-plugin": "2.3.5",
                "ts-pnp": "1.1.6",
                "url-loader": "2.3.0",
                "webpack": "4.42.0",
                "webpack-dev-server": "3.10.3",
                "webpack-manifest-plugin": "2.2.0",
                "workbox-webpack-plugin": "4.3.1"
            }
        },
        "react-transition-group": {
            "version": "4.4.1",
            "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz",
            "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==",
            "requires": {
                "@babel/runtime": "^7.5.5",
                "dom-helpers": "^5.0.1",
                "loose-envify": "^1.4.0",
                "prop-types": "^15.6.2"
            }
        },
        "read-pkg": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
            "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
            "requires": {
                "load-json-file": "^4.0.0",
                "normalize-package-data": "^2.3.2",
                "path-type": "^3.0.0"
            }
        },
        "read-pkg-up": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
            "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
            "requires": {
                "find-up": "^3.0.0",
                "read-pkg": "^3.0.0"
            }
        },
        "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==",
            "requires": {
                "inherits": "^2.0.3",
                "string_decoder": "^1.1.1",
                "util-deprecate": "^1.0.1"
            }
        },
        "readdirp": {
            "version": "3.4.0",
            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
            "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
            "requires": {
                "picomatch": "^2.2.1"
            }
        },
        "realpath-native": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz",
            "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==",
            "requires": {
                "util.promisify": "^1.0.0"
            }
        },
        "recursive-readdir": {
            "version": "2.2.2",
            "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
            "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
            "requires": {
                "minimatch": "3.0.4"
            }
        },
        "redent": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
            "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
            "requires": {
                "indent-string": "^4.0.0",
                "strip-indent": "^3.0.0"
            }
        },
        "regenerate": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
            "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A=="
        },
        "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==",
            "requires": {
                "regenerate": "^1.4.0"
            }
        },
        "regenerator-runtime": {
            "version": "0.13.7",
            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
            "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
        },
        "regenerator-transform": {
            "version": "0.14.5",
            "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
            "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
            "requires": {
                "@babel/runtime": "^7.8.4"
            }
        },
        "regex-not": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
            "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
            "requires": {
                "extend-shallow": "^3.0.2",
                "safe-regex": "^1.1.0"
            }
        },
        "regex-parser": {
            "version": "2.2.10",
            "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz",
            "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA=="
        },
        "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==",
            "requires": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.0-next.1"
            }
        },
        "regexpp": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
            "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
        },
        "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==",
            "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.2",
            "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
            "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
        },
        "regjsparser": {
            "version": "0.6.4",
            "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
            "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
            "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="
                }
            }
        },
        "relateurl": {
            "version": "0.2.7",
            "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
            "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
        },
        "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="
        },
        "renderkid": {
            "version": "2.0.7",
            "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz",
            "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==",
            "requires": {
                "css-select": "^4.1.3",
                "dom-converter": "^0.2.0",
                "htmlparser2": "^6.1.0",
                "lodash": "^4.17.21",
                "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="
                },
                "css-select": {
                    "version": "4.1.3",
                    "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
                    "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==",
                    "requires": {
                        "boolbase": "^1.0.0",
                        "css-what": "^5.0.0",
                        "domhandler": "^4.2.0",
                        "domutils": "^2.6.0",
                        "nth-check": "^2.0.0"
                    }
                },
                "css-what": {
                    "version": "5.1.0",
                    "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
                    "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw=="
                },
                "dom-serializer": {
                    "version": "1.3.2",
                    "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
                    "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
                    "requires": {
                        "domelementtype": "^2.0.1",
                        "domhandler": "^4.2.0",
                        "entities": "^2.0.0"
                    }
                },
                "domelementtype": {
                    "version": "2.2.0",
                    "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
                    "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
                },
                "domutils": {
                    "version": "2.8.0",
                    "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
                    "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
                    "requires": {
                        "dom-serializer": "^1.0.1",
                        "domelementtype": "^2.2.0",
                        "domhandler": "^4.2.0"
                    }
                },
                "nth-check": {
                    "version": "2.0.1",
                    "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
                    "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
                    "requires": {
                        "boolbase": "^1.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=",
                    "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=="
        },
        "repeat-string": {
            "version": "1.6.1",
            "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
            "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
        },
        "request": {
            "version": "2.88.2",
            "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
            "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
            "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"
            }
        },
        "request-promise-core": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
            "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
            "requires": {
                "lodash": "^4.17.19"
            }
        },
        "request-promise-native": {
            "version": "1.0.9",
            "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
            "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
            "requires": {
                "request-promise-core": "1.1.4",
                "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="
        },
        "require-main-filename": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
        },
        "requires-port": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
            "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
        },
        "resolve": {
            "version": "1.15.0",
            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
            "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
            "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=",
            "requires": {
                "resolve-from": "^3.0.0"
            }
        },
        "resolve-from": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
            "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
        },
        "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="
        },
        "resolve-url-loader": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz",
            "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==",
            "requires": {
                "adjust-sourcemap-loader": "2.0.0",
                "camelcase": "5.3.1",
                "compose-function": "3.0.3",
                "convert-source-map": "1.7.0",
                "es6-iterator": "2.0.3",
                "loader-utils": "1.2.3",
                "postcss": "7.0.21",
                "rework": "1.0.1",
                "rework-visit": "1.0.0",
                "source-map": "0.6.1"
            },
            "dependencies": {
                "emojis-list": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
                    "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
                },
                "json5": {
                    "version": "1.0.1",
                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
                    "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
                    "requires": {
                        "minimist": "^1.2.0"
                    }
                },
                "loader-utils": {
                    "version": "1.2.3",
                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
                    "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
                    "requires": {
                        "big.js": "^5.2.2",
                        "emojis-list": "^2.0.0",
                        "json5": "^1.0.1"
                    }
                },
                "postcss": {
                    "version": "7.0.21",
                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz",
                    "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==",
                    "requires": {
                        "chalk": "^2.4.2",
                        "source-map": "^0.6.1",
                        "supports-color": "^6.1.0"
                    }
                },
                "supports-color": {
                    "version": "6.1.0",
                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
                    "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
                    "requires": {
                        "has-flag": "^3.0.0"
                    }
                }
            }
        },
        "restore-cursor": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
            "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
            "requires": {
                "onetime": "^5.1.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=="
        },
        "retry": {
            "version": "0.12.0",
            "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
            "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
        },
        "rework": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz",
            "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=",
            "requires": {
                "convert-source-map": "^0.3.3",
                "css": "^2.0.0"
            },
            "dependencies": {
                "convert-source-map": {
                    "version": "0.3.5",
                    "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz",
                    "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA="
                }
            }
        },
        "rework-visit": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz",
            "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo="
        },
        "rgb-regex": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
            "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE="
        },
        "rgba-regex": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
            "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM="
        },
        "rimraf": {
            "version": "2.6.3",
            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
            "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
            "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==",
            "requires": {
                "hash-base": "^3.0.0",
                "inherits": "^2.0.1"
            }
        },
        "rsvp": {
            "version": "4.8.5",
            "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
            "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA=="
        },
        "run-async": {
            "version": "2.4.1",
            "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
            "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
        },
        "run-queue": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
            "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
            "requires": {
                "aproba": "^1.1.1"
            }
        },
        "rxjs": {
            "version": "6.6.2",
            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
            "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
            "requires": {
                "tslib": "^1.9.0"
            }
        },
        "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=="
        },
        "safe-regex": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
            "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
            "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=="
        },
        "sane": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
            "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
            "requires": {
                "@cnakazawa/watch": "^1.0.3",
                "anymatch": "^2.0.0",
                "capture-exit": "^2.0.0",
                "exec-sh": "^0.3.2",
                "execa": "^1.0.0",
                "fb-watchman": "^2.0.0",
                "micromatch": "^3.1.4",
                "minimist": "^1.1.1",
                "walker": "~1.0.5"
            }
        },
        "sanitize.css": {
            "version": "10.0.0",
            "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz",
            "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg=="
        },
        "sass-loader": {
            "version": "8.0.2",
            "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
            "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
            "requires": {
                "clone-deep": "^4.0.1",
                "loader-utils": "^1.2.3",
                "neo-async": "^2.6.1",
                "schema-utils": "^2.6.1",
                "semver": "^6.3.0"
            },
            "dependencies": {
                "clone-deep": {
                    "version": "4.0.1",
                    "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
                    "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
                    "requires": {
                        "is-plain-object": "^2.0.4",
                        "kind-of": "^6.0.2",
                        "shallow-clone": "^3.0.0"
                    }
                },
                "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=="
                },
                "shallow-clone": {
                    "version": "3.0.1",
                    "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
                    "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
                    "requires": {
                        "kind-of": "^6.0.2"
                    }
                }
            }
        },
        "sax": {
            "version": "1.2.4",
            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
        },
        "saxes": {
            "version": "3.1.11",
            "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
            "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
            "requires": {
                "xmlchars": "^2.1.1"
            }
        },
        "scheduler": {
            "version": "0.19.1",
            "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
            "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
            "requires": {
                "loose-envify": "^1.1.0",
                "object-assign": "^4.1.1"
            }
        },
        "schema-utils": {
            "version": "2.7.0",
            "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
            "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
            "requires": {
                "@types/json-schema": "^7.0.4",
                "ajv": "^6.12.2",
                "ajv-keywords": "^3.4.1"
            }
        },
        "select-hose": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
            "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
        },
        "selfsigned": {
            "version": "1.10.11",
            "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz",
            "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==",
            "requires": {
                "node-forge": "^0.10.0"
            }
        },
        "semver": {
            "version": "6.3.0",
            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
            "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
        },
        "send": {
            "version": "0.17.1",
            "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
            "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
            "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"
            },
            "dependencies": {
                "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"
                    },
                    "dependencies": {
                        "ms": {
                            "version": "2.0.0",
                            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                        }
                    }
                },
                "mime": {
                    "version": "1.6.0",
                    "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
                    "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
                },
                "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=="
                }
            }
        },
        "serialize-javascript": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
            "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ=="
        },
        "serve-index": {
            "version": "1.9.1",
            "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
            "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
            "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"
            },
            "dependencies": {
                "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"
                    }
                },
                "http-errors": {
                    "version": "1.6.3",
                    "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
                    "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
                    "requires": {
                        "depd": "~1.1.2",
                        "inherits": "2.0.3",
                        "setprototypeof": "1.1.0",
                        "statuses": ">= 1.4.0 < 2"
                    }
                },
                "inherits": {
                    "version": "2.0.3",
                    "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
                    "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                },
                "setprototypeof": {
                    "version": "1.1.0",
                    "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
                    "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
                }
            }
        },
        "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==",
            "requires": {
                "encodeurl": "~1.0.2",
                "escape-html": "~1.0.3",
                "parseurl": "~1.3.3",
                "send": "0.17.1"
            }
        },
        "set-blocking": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
            "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
        },
        "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==",
            "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=",
                    "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="
        },
        "setprototypeof": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
            "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
        },
        "sha.js": {
            "version": "2.4.11",
            "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
            "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
            "requires": {
                "inherits": "^2.0.1",
                "safe-buffer": "^5.0.1"
            }
        },
        "shallow-clone": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
            "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=",
            "requires": {
                "is-extendable": "^0.1.1",
                "kind-of": "^2.0.1",
                "lazy-cache": "^0.2.3",
                "mixin-object": "^2.0.1"
            },
            "dependencies": {
                "kind-of": {
                    "version": "2.0.1",
                    "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
                    "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=",
                    "requires": {
                        "is-buffer": "^1.0.2"
                    }
                },
                "lazy-cache": {
                    "version": "0.2.7",
                    "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
                    "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U="
                }
            }
        },
        "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="
        },
        "shell-quote": {
            "version": "1.7.2",
            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
            "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
        },
        "shellwords": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
            "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="
        },
        "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==",
            "requires": {
                "es-abstract": "^1.17.0-next.1",
                "object-inspect": "^1.7.0"
            }
        },
        "signal-exit": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
            "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
        },
        "simple-swizzle": {
            "version": "0.2.2",
            "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
            "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
            "requires": {
                "is-arrayish": "^0.3.1"
            },
            "dependencies": {
                "is-arrayish": {
                    "version": "0.3.2",
                    "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
                    "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
                }
            }
        },
        "sisteransi": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
            "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
        },
        "slash": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
            "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
        },
        "slice-ansi": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
            "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
            "requires": {
                "ansi-styles": "^3.2.0",
                "astral-regex": "^1.0.0",
                "is-fullwidth-code-point": "^2.0.0"
            },
            "dependencies": {
                "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="
                }
            }
        },
        "snapdragon": {
            "version": "0.8.2",
            "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
            "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
            "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": {
                "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"
                    }
                },
                "define-property": {
                    "version": "0.2.5",
                    "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
                    "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
                    "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=",
                    "requires": {
                        "is-extendable": "^0.1.0"
                    }
                },
                "ms": {
                    "version": "2.0.0",
                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
                },
                "source-map": {
                    "version": "0.5.7",
                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
                    "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
                }
            }
        },
        "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==",
            "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=",
                    "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==",
                    "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==",
                    "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==",
                    "requires": {
                        "is-accessor-descriptor": "^1.0.0",
                        "is-data-descriptor": "^1.0.0",
                        "kind-of": "^6.0.2"
                    }
                },
                "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=="
                }
            }
        },
        "snapdragon-util": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
            "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
            "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==",
            "requires": {
                "faye-websocket": "^0.10.0",
                "uuid": "^3.0.1"
            }
        },
        "sockjs-client": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
            "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
            "requires": {
                "debug": "^3.2.5",
                "eventsource": "^1.0.7",
                "faye-websocket": "~0.11.1",
                "inherits": "^2.0.3",
                "json3": "^3.3.2",
                "url-parse": "^1.4.3"
            },
            "dependencies": {
                "debug": {
                    "version": "3.2.6",
                    "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
                    "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
                    "requires": {
                        "ms": "^2.1.1"
                    }
                },
                "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==",
                    "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=",
            "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=="
        },
        "source-map": {
            "version": "0.6.1",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
        },
        "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==",
            "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.5.19",
            "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
            "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
            "requires": {
                "buffer-from": "^1.0.0",
                "source-map": "^0.6.0"
            }
        },
        "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="
        },
        "spdx-correct": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
            "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
            "requires": {
                "spdx-expression-parse": "^3.0.0",
                "spdx-license-ids": "^3.0.0"
            }
        },
        "spdx-exceptions": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
            "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
        },
        "spdx-expression-parse": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
            "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=="
        },
        "spdy": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
            "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
            "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"
            }
        },
        "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==",
            "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"
            }
        },
        "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==",
            "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="
        },
        "sshpk": {
            "version": "1.16.1",
            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
            "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
            "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": "7.1.1",
            "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz",
            "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==",
            "requires": {
                "figgy-pudding": "^3.5.1",
                "minipass": "^3.1.1"
            }
        },
        "stable": {
            "version": "0.1.8",
            "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
            "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
        },
        "stack-utils": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
            "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA=="
        },
        "static-extend": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
            "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
            "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=",
                    "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="
        },
        "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==",
            "requires": {
                "inherits": "~2.0.1",
                "readable-stream": "^2.0.2"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "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==",
            "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==",
            "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"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.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=="
        },
        "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_decoder": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
            "requires": {
                "safe-buffer": "~5.2.0"
            },
            "dependencies": {
                "safe-buffer": {
                    "version": "5.2.1",
                    "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
                    "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
                }
            }
        },
        "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=",
            "requires": {
                "astral-regex": "^1.0.0",
                "strip-ansi": "^4.0.0"
            },
            "dependencies": {
                "ansi-regex": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
                    "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
                },
                "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"
                    }
                }
            }
        },
        "string-width": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
            "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
            "requires": {
                "emoji-regex": "^8.0.0",
                "is-fullwidth-code-point": "^3.0.0",
                "strip-ansi": "^6.0.0"
            },
            "dependencies": {
                "ansi-regex": {
                    "version": "5.0.1",
                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
                    "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
                },
                "strip-ansi": {
                    "version": "6.0.0",
                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
                    "requires": {
                        "ansi-regex": "^5.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==",
            "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.trimend": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
            "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
            "requires": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.5"
            }
        },
        "string.prototype.trimstart": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
            "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
            "requires": {
                "define-properties": "^1.1.3",
                "es-abstract": "^1.17.5"
            }
        },
        "stringify-object": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
            "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
            "requires": {
                "get-own-enumerable-property-symbols": "^3.0.0",
                "is-obj": "^1.0.1",
                "is-regexp": "^1.0.0"
            },
            "dependencies": {
                "is-obj": {
                    "version": "1.0.1",
                    "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
                    "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
                }
            }
        },
        "strip-ansi": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
            "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
            "requires": {
                "ansi-regex": "^4.1.0"
            }
        },
        "strip-bom": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
            "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
        },
        "strip-comments": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz",
            "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==",
            "requires": {
                "babel-extract-comments": "^1.0.0",
                "babel-plugin-transform-object-rest-spread": "^6.26.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": "3.0.0",
            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
            "requires": {
                "min-indent": "^1.0.0"
            }
        },
        "strip-json-comments": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
            "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
        },
        "style-loader": {
            "version": "0.23.1",
            "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
            "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
            "requires": {
                "loader-utils": "^1.1.0",
                "schema-utils": "^1.0.0"
            },
            "dependencies": {
                "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==",
                    "requires": {
                        "ajv": "^6.1.0",
                        "ajv-errors": "^1.0.0",
                        "ajv-keywords": "^3.1.0"
                    }
                }
            }
        },
        "stylehacks": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
            "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
            "requires": {
                "browserslist": "^4.0.0",
                "postcss": "^7.0.0",
                "postcss-selector-parser": "^3.0.0"
            },
            "dependencies": {
                "postcss-selector-parser": {
                    "version": "3.1.2",
                    "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
                    "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
                    "requires": {
                        "dot-prop": "^5.2.0",
                        "indexes-of": "^1.0.1",
                        "uniq": "^1.0.1"
                    }
                }
            }
        },
        "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"
            }
        },
        "svg-parser": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
            "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
        },
        "svgo": {
            "version": "1.3.2",
            "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
            "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
            "requires": {
                "chalk": "^2.4.1",
                "coa": "^2.0.2",
                "css-select": "^2.0.0",
                "css-select-base-adapter": "^0.1.1",
                "css-tree": "1.0.0-alpha.37",
                "csso": "^4.0.2",
                "js-yaml": "^3.13.1",
                "mkdirp": "~0.5.1",
                "object.values": "^1.1.0",
                "sax": "~1.2.4",
                "stable": "^0.1.8",
                "unquote": "~1.1.1",
                "util.promisify": "~1.0.0"
            }
        },
        "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=="
        },
        "table": {
            "version": "5.4.6",
            "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
            "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
            "requires": {
                "ajv": "^6.10.2",
                "lodash": "^4.17.14",
                "slice-ansi": "^2.1.0",
                "string-width": "^3.0.0"
            },
            "dependencies": {
                "emoji-regex": {
                    "version": "7.0.3",
                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
                    "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
                },
                "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="
                },
                "string-width": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
                    "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
                    "requires": {
                        "emoji-regex": "^7.0.1",
                        "is-fullwidth-code-point": "^2.0.0",
                        "strip-ansi": "^5.1.0"
                    }
                }
            }
        },
        "tapable": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
            "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
        },
        "terser": {
            "version": "4.8.0",
            "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
            "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
            "requires": {
                "commander": "^2.20.0",
                "source-map": "~0.6.1",
                "source-map-support": "~0.5.12"
            }
        },
        "terser-webpack-plugin": {
            "version": "2.3.5",
            "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz",
            "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==",
            "requires": {
                "cacache": "^13.0.1",
                "find-cache-dir": "^3.2.0",
                "jest-worker": "^25.1.0",
                "p-limit": "^2.2.2",
                "schema-utils": "^2.6.4",
                "serialize-javascript": "^2.1.2",
                "source-map": "^0.6.1",
                "terser": "^4.4.3",
                "webpack-sources": "^1.4.3"
            },
            "dependencies": {
                "find-cache-dir": {
                    "version": "3.3.1",
                    "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
                    "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
                    "requires": {
                        "commondir": "^1.0.1",
                        "make-dir": "^3.0.2",
                        "pkg-dir": "^4.1.0"
                    }
                },
                "find-up": {
                    "version": "4.1.0",
                    "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
                    "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
                    "requires": {
                        "locate-path": "^5.0.0",
                        "path-exists": "^4.0.0"
                    }
                },
                "has-flag": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
                },
                "jest-worker": {
                    "version": "25.5.0",
                    "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz",
                    "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==",
                    "requires": {
                        "merge-stream": "^2.0.0",
                        "supports-color": "^7.0.0"
                    }
                },
                "locate-path": {
                    "version": "5.0.0",
                    "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
                    "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
                    "requires": {
                        "p-locate": "^4.1.0"
                    }
                },
                "make-dir": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
                    "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
                    "requires": {
                        "semver": "^6.0.0"
                    }
                },
                "p-locate": {
                    "version": "4.1.0",
                    "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
                    "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
                    "requires": {
                        "p-limit": "^2.2.0"
                    }
                },
                "path-exists": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
                    "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
                },
                "pkg-dir": {
                    "version": "4.2.0",
                    "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
                    "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
                    "requires": {
                        "find-up": "^4.0.0"
                    }
                },
                "supports-color": {
                    "version": "7.1.0",
                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
                    "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
                    "requires": {
                        "has-flag": "^4.0.0"
                    }
                }
            }
        },
        "test-exclude": {
            "version": "5.2.3",
            "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
            "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
            "requires": {
                "glob": "^7.1.3",
                "minimatch": "^3.0.4",
                "read-pkg-up": "^4.0.0",
                "require-main-filename": "^2.0.0"
            }
        },
        "text-table": {
            "version": "0.2.0",
            "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
            "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
        },
        "throat": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
            "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo="
        },
        "through": {
            "version": "2.3.8",
            "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
            "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
        },
        "through2": {
            "version": "2.0.5",
            "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
            "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
            "requires": {
                "readable-stream": "~2.3.6",
                "xtend": "~4.0.1"
            },
            "dependencies": {
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "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==",
                    "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"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "thunky": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
            "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
        },
        "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==",
            "requires": {
                "setimmediate": "^1.0.4"
            }
        },
        "timsort": {
            "version": "0.3.0",
            "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
            "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
        },
        "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==",
            "requires": {
                "os-tmpdir": "~1.0.2"
            }
        },
        "tmpl": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
            "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
        },
        "to-arraybuffer": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
            "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
        },
        "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="
        },
        "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=",
            "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==",
            "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=",
            "requires": {
                "is-number": "^3.0.0",
                "repeat-string": "^1.6.1"
            }
        },
        "toidentifier": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
            "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
        },
        "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==",
            "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=",
            "requires": {
                "punycode": "^2.1.0"
            }
        },
        "ts-pnp": {
            "version": "1.1.6",
            "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz",
            "integrity": "sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ=="
        },
        "tslib": {
            "version": "1.13.0",
            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
            "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
        },
        "tsutils": {
            "version": "3.17.1",
            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
            "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
            "requires": {
                "tslib": "^1.8.1"
            }
        },
        "tty-browserify": {
            "version": "0.0.0",
            "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
            "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
        },
        "tunnel-agent": {
            "version": "0.6.0",
            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
            "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
            "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="
        },
        "type": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
            "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
        },
        "type-check": {
            "version": "0.3.2",
            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
            "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
            "requires": {
                "prelude-ls": "~1.1.2"
            }
        },
        "type-fest": {
            "version": "0.8.1",
            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
            "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
        },
        "type-is": {
            "version": "1.6.18",
            "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
            "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
            "requires": {
                "media-typer": "0.3.0",
                "mime-types": "~2.1.24"
            }
        },
        "typedarray": {
            "version": "0.0.6",
            "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
            "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
        },
        "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=="
        },
        "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==",
            "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=="
        },
        "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=="
        },
        "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==",
            "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="
        },
        "uniqs": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
            "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
        },
        "unique-filename": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
            "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
            "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==",
            "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="
        },
        "unquote": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
            "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
        },
        "unset-value": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
            "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
            "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=",
                    "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=",
                            "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="
                },
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                }
            }
        },
        "upath": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
            "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
        },
        "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==",
            "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="
        },
        "url": {
            "version": "0.11.0",
            "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
            "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
            "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="
                }
            }
        },
        "url-loader": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz",
            "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==",
            "requires": {
                "loader-utils": "^1.2.3",
                "mime": "^2.4.4",
                "schema-utils": "^2.5.0"
            }
        },
        "url-parse": {
            "version": "1.5.3",
            "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz",
            "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==",
            "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=="
        },
        "util": {
            "version": "0.10.3",
            "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
            "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
            "requires": {
                "inherits": "2.0.1"
            },
            "dependencies": {
                "inherits": {
                    "version": "2.0.1",
                    "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
                    "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
                }
            }
        },
        "util-deprecate": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
            "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
        },
        "util.promisify": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
            "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
            "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="
        },
        "utils-merge": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
            "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
        },
        "uuid": {
            "version": "3.4.0",
            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
            "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
        },
        "v8-compile-cache": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
            "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ=="
        },
        "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==",
            "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=="
        },
        "verror": {
            "version": "1.10.0",
            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
            "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
            "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=="
        },
        "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==",
            "requires": {
                "browser-process-hrtime": "^1.0.0"
            }
        },
        "w3c-xmlserializer": {
            "version": "1.1.2",
            "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
            "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
            "requires": {
                "domexception": "^1.0.1",
                "webidl-conversions": "^4.0.2",
                "xml-name-validator": "^3.0.0"
            }
        },
        "wait-for-expect": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz",
            "integrity": "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag=="
        },
        "walker": {
            "version": "1.0.7",
            "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
            "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
            "requires": {
                "makeerror": "1.0.x"
            }
        },
        "watchpack": {
            "version": "1.7.4",
            "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
            "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
            "requires": {
                "chokidar": "^3.4.1",
                "graceful-fs": "^4.1.2",
                "neo-async": "^2.5.0",
                "watchpack-chokidar2": "^2.0.0"
            }
        },
        "watchpack-chokidar2": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
            "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
            "optional": true,
            "requires": {
                "chokidar": "^2.1.8"
            },
            "dependencies": {
                "binary-extensions": {
                    "version": "1.13.1",
                    "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
                    "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
                    "optional": true
                },
                "chokidar": {
                    "version": "2.1.8",
                    "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
                    "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
                    "optional": 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"
                    }
                },
                "fsevents": {
                    "version": "1.2.13",
                    "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
                    "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
                    "optional": true,
                    "requires": {
                        "bindings": "^1.5.0",
                        "nan": "^2.12.1"
                    }
                },
                "glob-parent": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
                    "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
                    "optional": 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=",
                            "optional": true,
                            "requires": {
                                "is-extglob": "^2.1.0"
                            }
                        }
                    }
                },
                "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=",
                    "optional": true,
                    "requires": {
                        "binary-extensions": "^1.0.0"
                    }
                },
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
                    "optional": true
                },
                "normalize-path": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
                    "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
                    "optional": true
                },
                "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==",
                    "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"
                    }
                },
                "readdirp": {
                    "version": "2.2.1",
                    "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
                    "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
                    "optional": true,
                    "requires": {
                        "graceful-fs": "^4.1.11",
                        "micromatch": "^3.1.10",
                        "readable-stream": "^2.0.2"
                    }
                },
                "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==",
                    "optional": true,
                    "requires": {
                        "safe-buffer": "~5.1.0"
                    }
                }
            }
        },
        "wbuf": {
            "version": "1.7.3",
            "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
            "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
            "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=="
        },
        "webpack": {
            "version": "4.42.0",
            "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz",
            "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==",
            "requires": {
                "@webassemblyjs/ast": "1.8.5",
                "@webassemblyjs/helper-module-context": "1.8.5",
                "@webassemblyjs/wasm-edit": "1.8.5",
                "@webassemblyjs/wasm-parser": "1.8.5",
                "acorn": "^6.2.1",
                "ajv": "^6.10.2",
                "ajv-keywords": "^3.4.1",
                "chrome-trace-event": "^1.0.2",
                "enhanced-resolve": "^4.1.0",
                "eslint-scope": "^4.0.3",
                "json-parse-better-errors": "^1.0.2",
                "loader-runner": "^2.4.0",
                "loader-utils": "^1.2.3",
                "memory-fs": "^0.4.1",
                "micromatch": "^3.1.10",
                "mkdirp": "^0.5.1",
                "neo-async": "^2.6.1",
                "node-libs-browser": "^2.2.1",
                "schema-utils": "^1.0.0",
                "tapable": "^1.1.3",
                "terser-webpack-plugin": "^1.4.3",
                "watchpack": "^1.6.0",
                "webpack-sources": "^1.4.1"
            },
            "dependencies": {
                "acorn": {
                    "version": "6.4.1",
                    "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
                    "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA=="
                },
                "cacache": {
                    "version": "12.0.4",
                    "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
                    "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
                    "requires": {
                        "bluebird": "^3.5.5",
                        "chownr": "^1.1.1",
                        "figgy-pudding": "^3.5.1",
                        "glob": "^7.1.4",
                        "graceful-fs": "^4.1.15",
                        "infer-owner": "^1.0.3",
                        "lru-cache": "^5.1.1",
                        "mississippi": "^3.0.0",
                        "mkdirp": "^0.5.1",
                        "move-concurrently": "^1.0.1",
                        "promise-inflight": "^1.0.1",
                        "rimraf": "^2.6.3",
                        "ssri": "^6.0.1",
                        "unique-filename": "^1.1.1",
                        "y18n": "^4.0.0"
                    }
                },
                "eslint-scope": {
                    "version": "4.0.3",
                    "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
                    "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
                    "requires": {
                        "esrecurse": "^4.1.0",
                        "estraverse": "^4.1.1"
                    }
                },
                "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==",
                    "requires": {
                        "ajv": "^6.1.0",
                        "ajv-errors": "^1.0.0",
                        "ajv-keywords": "^3.1.0"
                    }
                },
                "serialize-javascript": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
                    "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
                    "requires": {
                        "randombytes": "^2.1.0"
                    }
                },
                "ssri": {
                    "version": "6.0.2",
                    "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
                    "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
                    "requires": {
                        "figgy-pudding": "^3.5.1"
                    }
                },
                "terser-webpack-plugin": {
                    "version": "1.4.4",
                    "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz",
                    "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==",
                    "requires": {
                        "cacache": "^12.0.2",
                        "find-cache-dir": "^2.1.0",
                        "is-wsl": "^1.1.0",
                        "schema-utils": "^1.0.0",
                        "serialize-javascript": "^3.1.0",
                        "source-map": "^0.6.1",
                        "terser": "^4.1.2",
                        "webpack-sources": "^1.4.0",
                        "worker-farm": "^1.7.0"
                    }
                }
            }
        },
        "webpack-dev-middleware": {
            "version": "3.7.2",
            "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
            "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
            "requires": {
                "memory-fs": "^0.4.1",
                "mime": "^2.4.4",
                "mkdirp": "^0.5.1",
                "range-parser": "^1.2.1",
                "webpack-log": "^2.0.0"
            }
        },
        "webpack-dev-server": {
            "version": "3.10.3",
            "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz",
            "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==",
            "requires": {
                "ansi-html": "0.0.7",
                "bonjour": "^3.5.0",
                "chokidar": "^2.1.8",
                "compression": "^1.7.4",
                "connect-history-api-fallback": "^1.6.0",
                "debug": "^4.1.1",
                "del": "^4.1.1",
                "express": "^4.17.1",
                "html-entities": "^1.2.1",
                "http-proxy-middleware": "0.19.1",
                "import-local": "^2.0.0",
                "internal-ip": "^4.3.0",
                "ip": "^1.1.5",
                "is-absolute-url": "^3.0.3",
                "killable": "^1.0.1",
                "loglevel": "^1.6.6",
                "opn": "^5.5.0",
                "p-retry": "^3.0.1",
                "portfinder": "^1.0.25",
                "schema-utils": "^1.0.0",
                "selfsigned": "^1.10.7",
                "semver": "^6.3.0",
                "serve-index": "^1.9.1",
                "sockjs": "0.3.19",
                "sockjs-client": "1.4.0",
                "spdy": "^4.0.1",
                "strip-ansi": "^3.0.1",
                "supports-color": "^6.1.0",
                "url": "^0.11.0",
                "webpack-dev-middleware": "^3.7.2",
                "webpack-log": "^2.0.0",
                "ws": "^6.2.1",
                "yargs": "12.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="
                },
                "binary-extensions": {
                    "version": "1.13.1",
                    "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
                    "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
                },
                "chokidar": {
                    "version": "2.1.8",
                    "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
                    "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
                    "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"
                    }
                },
                "cliui": {
                    "version": "4.1.0",
                    "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
                    "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
                    "requires": {
                        "string-width": "^2.1.1",
                        "strip-ansi": "^4.0.0",
                        "wrap-ansi": "^2.0.0"
                    },
                    "dependencies": {
                        "ansi-regex": {
                            "version": "3.0.0",
                            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
                            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
                        },
                        "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"
                            }
                        }
                    }
                },
                "fsevents": {
                    "version": "1.2.13",
                    "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
                    "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
                    "optional": true,
                    "requires": {
                        "bindings": "^1.5.0",
                        "nan": "^2.12.1"
                    }
                },
                "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=="
                },
                "glob-parent": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
                    "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
                    "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=",
                            "requires": {
                                "is-extglob": "^2.1.0"
                            }
                        }
                    }
                },
                "is-absolute-url": {
                    "version": "3.0.3",
                    "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
                    "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q=="
                },
                "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=",
                    "requires": {
                        "binary-extensions": "^1.0.0"
                    }
                },
                "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="
                },
                "isarray": {
                    "version": "1.0.0",
                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
                },
                "normalize-path": {
                    "version": "3.0.0",
                    "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
                    "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
                },
                "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==",
                    "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"
                    }
                },
                "readdirp": {
                    "version": "2.2.1",
                    "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
                    "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
                    "requires": {
                        "graceful-fs": "^4.1.11",
                        "micromatch": "^3.1.10",
                        "readable-stream": "^2.0.2"
                    }
                },
                "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="
                },
                "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==",
                    "requires": {
                        "ajv": "^6.1.0",
                        "ajv-errors": "^1.0.0",
                        "ajv-keywords": "^3.1.0"
                    }
                },
                "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==",
                    "requires": {
                        "safe-buffer": "~5.1.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"
                    },
                    "dependencies": {
                        "ansi-regex": {
                            "version": "3.0.0",
                            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
                            "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
                        },
                        "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-ansi": {
                    "version": "3.0.1",
                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
                    "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
                    "requires": {
                        "ansi-regex": "^2.0.0"
                    }
                },
                "supports-color": {
                    "version": "6.1.0",
                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
                    "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
                    "requires": {
                        "has-flag": "^3.0.0"
                    }
                },
                "wrap-ansi": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
                    "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
                    "requires": {
                        "string-width": "^1.0.1",
                        "strip-ansi": "^3.0.1"
                    },
                    "dependencies": {
                        "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=",
                            "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=",
                            "requires": {
                                "code-point-at": "^1.0.0",
                                "is-fullwidth-code-point": "^1.0.0",
                                "strip-ansi": "^3.0.0"
                            }
                        }
                    }
                },
                "ws": {
                    "version": "6.2.2",
                    "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
                    "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
                    "requires": {
                        "async-limiter": "~1.0.0"
                    }
                },
                "yargs": {
                    "version": "12.0.5",
                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
                    "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
                    "requires": {
                        "cliui": "^4.0.0",
                        "decamelize": "^1.2.0",
                        "find-up": "^3.0.0",
                        "get-caller-file": "^1.0.1",
                        "os-locale": "^3.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 || ^4.0.0",
                        "yargs-parser": "^11.1.1"
                    }
                },
                "yargs-parser": {
                    "version": "11.1.1",
                    "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
                    "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
                    "requires": {
                        "camelcase": "^5.0.0",
                        "decamelize": "^1.2.0"
                    }
                }
            }
        },
        "webpack-log": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
            "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
            "requires": {
                "ansi-colors": "^3.0.0",
                "uuid": "^3.3.2"
            }
        },
        "webpack-manifest-plugin": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz",
            "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==",
            "requires": {
                "fs-extra": "^7.0.0",
                "lodash": ">=3.5 <5",
                "object.entries": "^1.1.0",
                "tapable": "^1.0.0"
            },
            "dependencies": {
                "fs-extra": {
                    "version": "7.0.1",
                    "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
                    "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
                    "requires": {
                        "graceful-fs": "^4.1.2",
                        "jsonfile": "^4.0.0",
                        "universalify": "^0.1.0"
                    }
                }
            }
        },
        "webpack-sources": {
            "version": "1.4.3",
            "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
            "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
            "requires": {
                "source-list-map": "^2.0.0",
                "source-map": "~0.6.1"
            }
        },
        "websocket-driver": {
            "version": "0.7.4",
            "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
            "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
            "requires": {
                "http-parser-js": ">=0.5.1",
                "safe-buffer": ">=5.1.0",
                "websocket-extensions": ">=0.1.1"
            }
        },
        "websocket-extensions": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
            "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
        },
        "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==",
            "requires": {
                "iconv-lite": "0.4.24"
            }
        },
        "whatwg-fetch": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz",
            "integrity": "sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w=="
        },
        "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=="
        },
        "whatwg-url": {
            "version": "6.5.0",
            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
            "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
            "requires": {
                "lodash.sortby": "^4.7.0",
                "tr46": "^1.0.1",
                "webidl-conversions": "^4.0.2"
            }
        },
        "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="
        },
        "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=="
        },
        "workbox-background-sync": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz",
            "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-broadcast-update": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz",
            "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-build": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz",
            "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==",
            "requires": {
                "@babel/runtime": "^7.3.4",
                "@hapi/joi": "^15.0.0",
                "common-tags": "^1.8.0",
                "fs-extra": "^4.0.2",
                "glob": "^7.1.3",
                "lodash.template": "^4.4.0",
                "pretty-bytes": "^5.1.0",
                "stringify-object": "^3.3.0",
                "strip-comments": "^1.0.2",
                "workbox-background-sync": "^4.3.1",
                "workbox-broadcast-update": "^4.3.1",
                "workbox-cacheable-response": "^4.3.1",
                "workbox-core": "^4.3.1",
                "workbox-expiration": "^4.3.1",
                "workbox-google-analytics": "^4.3.1",
                "workbox-navigation-preload": "^4.3.1",
                "workbox-precaching": "^4.3.1",
                "workbox-range-requests": "^4.3.1",
                "workbox-routing": "^4.3.1",
                "workbox-strategies": "^4.3.1",
                "workbox-streams": "^4.3.1",
                "workbox-sw": "^4.3.1",
                "workbox-window": "^4.3.1"
            },
            "dependencies": {
                "fs-extra": {
                    "version": "4.0.3",
                    "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
                    "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
                    "requires": {
                        "graceful-fs": "^4.1.2",
                        "jsonfile": "^4.0.0",
                        "universalify": "^0.1.0"
                    }
                }
            }
        },
        "workbox-cacheable-response": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz",
            "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-core": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz",
            "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg=="
        },
        "workbox-expiration": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz",
            "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-google-analytics": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz",
            "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==",
            "requires": {
                "workbox-background-sync": "^4.3.1",
                "workbox-core": "^4.3.1",
                "workbox-routing": "^4.3.1",
                "workbox-strategies": "^4.3.1"
            }
        },
        "workbox-navigation-preload": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz",
            "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-precaching": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz",
            "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-range-requests": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz",
            "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-routing": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz",
            "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-strategies": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz",
            "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-streams": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz",
            "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "workbox-sw": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz",
            "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w=="
        },
        "workbox-webpack-plugin": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz",
            "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==",
            "requires": {
                "@babel/runtime": "^7.0.0",
                "json-stable-stringify": "^1.0.1",
                "workbox-build": "^4.3.1"
            }
        },
        "workbox-window": {
            "version": "4.3.1",
            "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz",
            "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==",
            "requires": {
                "workbox-core": "^4.3.1"
            }
        },
        "worker-farm": {
            "version": "1.7.0",
            "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
            "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
            "requires": {
                "errno": "~0.1.7"
            }
        },
        "worker-rpc": {
            "version": "0.1.1",
            "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz",
            "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==",
            "requires": {
                "microevent.ts": "~0.1.1"
            }
        },
        "wrap-ansi": {
            "version": "5.1.0",
            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
            "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
            "requires": {
                "ansi-styles": "^3.2.0",
                "string-width": "^3.0.0",
                "strip-ansi": "^5.0.0"
            },
            "dependencies": {
                "emoji-regex": {
                    "version": "7.0.3",
                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
                    "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
                },
                "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="
                },
                "string-width": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
                    "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
                    "requires": {
                        "emoji-regex": "^7.0.1",
                        "is-fullwidth-code-point": "^2.0.0",
                        "strip-ansi": "^5.1.0"
                    }
                }
            }
        },
        "wrappy": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
            "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
        },
        "write": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
            "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
            "requires": {
                "mkdirp": "^0.5.1"
            }
        },
        "write-file-atomic": {
            "version": "2.4.1",
            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
            "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
            "requires": {
                "graceful-fs": "^4.1.11",
                "imurmurhash": "^0.1.4",
                "signal-exit": "^3.0.2"
            }
        },
        "ws": {
            "version": "5.2.3",
            "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz",
            "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
            "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=="
        },
        "xmlchars": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
            "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
        },
        "xregexp": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz",
            "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==",
            "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=="
        },
        "y18n": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
            "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
        },
        "yallist": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
        },
        "yaml": {
            "version": "1.10.0",
            "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
            "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
        },
        "yargs": {
            "version": "13.3.2",
            "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
            "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
            "requires": {
                "cliui": "^5.0.0",
                "find-up": "^3.0.0",
                "get-caller-file": "^2.0.1",
                "require-directory": "^2.1.1",
                "require-main-filename": "^2.0.0",
                "set-blocking": "^2.0.0",
                "string-width": "^3.0.0",
                "which-module": "^2.0.0",
                "y18n": "^4.0.0",
                "yargs-parser": "^13.1.2"
            },
            "dependencies": {
                "emoji-regex": {
                    "version": "7.0.3",
                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
                    "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
                },
                "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="
                },
                "string-width": {
                    "version": "3.1.0",
                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
                    "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
                    "requires": {
                        "emoji-regex": "^7.0.1",
                        "is-fullwidth-code-point": "^2.0.0",
                        "strip-ansi": "^5.1.0"
                    }
                }
            }
        },
        "yargs-parser": {
            "version": "13.1.2",
            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
            "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
            "requires": {
                "camelcase": "^5.0.0",
                "decamelize": "^1.2.0"
            }
        }
    }
}

src/client/default.conf.template METASEP
upstream backend {
    #server paws-compose-server:5000;
    server server:5000;
}

server {
    listen       80;
    server_name  localhost;
    client_max_body_size 100M;

    # This needs to be first location block
    location  ^~ /api/internal {   # Blocks external access to /api/internal/*
        return 404;
        }



    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri /index.html; # forward all requests to the index.html for react
    }

  # $uri does not refer to Mr. Rotem but 'Uniform Resource Identifier'

    location /api {
        try_files $uri @backend;      
    }

    location @backend {
        proxy_pass http://backend;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 3600;
        proxy_connect_timeout 3600;
        proxy_send_timeout 3600;
        send_timeout 3600;
        # Following is necessary for Websocket support
        # proxy_http_version 1.1;
        # proxy_set_header Upgrade $http_upgrade;
        # proxy_set_header Connection "upgrade";
    }
}
src/client/README.md METASEP
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Proxy Setting 
Proxy setting uses http-proxy-middleware and can be found at `/setupProxy.js`

## Run with docker-compose
The app will be loaded when the docker-compose is ran.   
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.  
In order to view changes, rerun the docker or the whole docker-compose

## Run locally
Make sure proxy is set to the port you are running your backend.  
In the project directory, you can run:   

### `npm start`
This will run locally against the docker container backend which running on port 5000

### `npm run start:local`
This will run locally against your local backend which you should run on port 3333.

## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).  
To learn React, check out the [React documentation](https://reactjs.org/).  

src/client/Dockerfile METASEP
# pull official base image
FROM node:16-alpine as builder

# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install app dependencies
COPY package.json ./
COPY package-lock.json ./

RUN npm install --silent

COPY public ./public
COPY src ./src

RUN npx browserslist@latest --update-db
RUN npm run build

# add app
FROM nginx:latest AS host

# COPY nginx-client.conf /etc/nginx/conf.d/default.conf
COPY default.conf.template /etc/nginx/templates/

COPY --from=builder /app/build/ /usr/share/nginx/html
src/client/.gitignore METASEP
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
src/client/.dockerignore METASEP
node_modules
build
.dockerignore
Dockerfile

README.md METASEP
# [The Philadelphia Animal Welfare Society (PAWS)](phillypaws.org)

As the city's largest animal rescue partner and no-kill animal shelter, 
the [Philadelphia Animal Welfare Society (PAWS)](phillypaws.org) is working to make Philadelphia 
a place where every healthy and treatable pet is guaranteed a home. Since inception over 10 years ago, 
PAWS has rescued and placed 27,000+ animals in adoptive and foster homes, and has worked to prevent pet homelessness 
by providing 86,000+ low-cost spay/neuter services and affordable vet care to 227,000+ 
clinic patients. PAWS is funded 100% through donations, with 91 cents of every dollar collected going 
directly to the animals. Therefore, PAWS' rescue work (including 3 shelters and all rescue and 
animal care programs), administration and development efforts are coordinated by only about 
70 staff members complemented by over 1500 volunteers.

## [The Data Pipeline](https://codeforphilly.org/projects/paws_data_pipeline)

Through all of its operational and service activities, PAWS accumulates data regarding donations, 
adoptions, fosters, volunteers, merchandise sales, event attendees (to name a few), 
each in their own system and/or manual tally. This vital data that can 
drive insights remains siloed and is usually difficult to extract, manipulate, and analyze. 

This project provides PAWS with an easy-to-use and easy-to-support tool to extract 
constituent data from multiple source systems, standardize extracted data, match constituents across data sources,  
load relevant data into Salesforce, and run an automation in Salesforce to produce an RFM score. 
Through these processes, the PAWS data pipeline has laid the groundwork for facilitating an up-to-date 360-degree view of PAWS constituents, and 
flexible ongoing data analysis and insights discovery.

## Uses 

- The pipeline can inform the PAWS development team of new constiuents through volunteer or foster engagegement
- Instead of manually matching constituents from volunteering, donations and foster/adoptions, PAWS staff only need to upload the volunteer dataset into the pipeline, and the pipeline handles the matching
- Volunteer and Foster data are automatically loaded into the constituent's SalesForce profile
- An RFM score is calculated for each constituent using the most recent data 
- Data analyses can use the output of the PDP matching logic to join datasets from different sources; PAWS can benefit from such analyses in the following ways: 
    - PAWS operations can be better informed and use data-driven decisions to guide programs and maximize effectiveness;  
    - Supporters can be further engaged by suggesting additional opportunities for involvement based upon pattern analysis;  
    - Multi-dimensional supporters can be consistently (and accurately) acknowledged for all the ways they support PAWS (i.e. a volunteer who donates and also fosters kittens), not to mention opportunities to further tap the potential of these enthusiastic supporters.

## [Code of Conduct](https://codeforphilly.org/pages/code_of_conduct)

This is a Code for Philly project operating under their code of conduct. 

## Links

[Slack Channel](https://codeforphilly.org/chat?channel=paws_data_pipeline)  
[Wiki](https://github.com/CodeForPhilly/paws-data-pipeline/wiki)

GettingStarted.md METASEP
# Getting Started

#### All of our code is in containers
- Install Docker - `https://docs.docker.com/install`  
- Install Docker Compose - `https://docs.docker.com/compose/install/`      

## Running everything (server and client)
- navigate to src directory `cd .../PAWS-DATA-PIPELINE/src`
- docker compose `docker-compose up`
- access the client going to `http://localhost:3000`
## Running the client (front-end) locally
- navigate to src directory `cd .../PAWS-DATA-PIPELINE/src`
- docker compose `docker-compose run server`
- start the frontend with the proxy`npm run start:local`

## Running just server (back-end) locally
- navigate to src directory `cd .../PAWS-DATA-PIPELINE/src`
- set the PAWS_API_HOST=localhost or your ip in `docker-compose.yml`
- docker compose `docker-compose up` and stop the server
src/server/api/API_ingest/updated_data.py METASEP

from sqlalchemy.orm import  sessionmaker
from simple_salesforce import Salesforce
from config import engine

import structlog
logger = structlog.get_logger()


def get_updated_contact_data():
    Session = sessionmaker(engine)

    qry = """ -- Collect latest foster/volunteer dates
        with ev_dates as 
        (select 
            person_id, 
            max(case when event_type=1 then time else null end) adopt,
            max(case when event_type=2 then time else null end) foster_out,
           --  max(case when event_type=3 then time else null end) rto,
            max(case when event_type=5 then time else null end) foster_return
           
        from 
            sl_animal_events sla
            left join sl_event_types sle on sle.id = sla.event_type
            
        where sle.id in (1,2,5)
        group by person_id
        order by person_id
        )
  

    select json_agg (upd)  as "cd" from (
            select
            slsf.source_id as "contactId" ,  -- long salesforce string
            slp.id   as  "personId" ,           -- short PAWS-local shelterluv id
        
            case
                when 
                    (extract(epoch from now())::bigint - foster_out < 365*86400)  -- foster out in last year 
                    or (extract(epoch from now())::bigint - foster_return < 365*86400) -- foster return 
                then 'Active'
                else 'Inactive'
            end  as "updatedFosterStatus" ,
        
            (to_timestamp(foster_out ) at time zone  'America/New_York')::date   as "updatedFosterStartDate",
            (to_timestamp(foster_return ) at time zone 'America/New_York')::date  as "updatedFosterEndDate",

            min(vs.from_date) as "updatedFirstVolunteerDate",
            max(vs.from_date) as "updatedLastVolunteerDate",
            vc.source_id as   "volgisticsId"     

            
        from 
            ev_dates
            left join pdp_contacts slc on slc.source_id = person_id::text and slc.source_type = 'shelterluvpeople'
            left join pdp_contacts slsf on slsf.matching_id = slc.matching_id and slsf.source_type = 'salesforcecontacts'
            left join shelterluvpeople slp on slp.internal_id = person_id::text
            left join pdp_contacts vc on vc.matching_id = slc.matching_id and vc.source_type = 'volgistics'
            left join volgisticsshifts vs on vs.volg_id::text = vc.source_id 

    where 
        slsf.source_id is not null

        group by
            slsf.source_id,
            slp.id,
            vc.source_id,
            foster_out ,
            foster_return
        
    ) upd ;


    """

    with Session() as session:
        result = session.execute(qry)
        sfdata = result.fetchone()[0]
        logger.debug("Query for Salesforce update returned %d records", len(sfdata))
        return sfdata
src/server/api/API_ingest/sl_animal_events.py METASEP
import json
import os
import posixpath as path

import structlog

logger = structlog.get_logger()

import requests

from api.API_ingest import shelterluv_db

# There are a number of different record types. These are the ones we care about.
keep_record_types = [
    "Outcome.Adoption",
    "Outcome.Foster",
    "Outcome.ReturnToOwner",
    "Intake.AdoptionReturn",
    "Intake.FosterReturn"
]

# from config import engine
# from flask import current_app
# from sqlalchemy.sql import text

BASE_URL = "http://shelterluv.com/api/"
MAX_COUNT = 100  # Max records the API will return for one call

# Get the API key
try:
    from secrets_dict import SHELTERLUV_SECRET_TOKEN
except ImportError:
    # Not running locally
    from os import environ

    try:
        SHELTERLUV_SECRET_TOKEN = environ["SHELTERLUV_SECRET_TOKEN"]
    except KeyError:
        # Not in environment
        # You're SOL for now
        logger.error("Couldn't get SHELTERLUV_SECRET_TOKEN from file or environment")


TEST_MODE=os.getenv("TEST_MODE")  # if not present, has value None

headers = {"Accept": "application/json", "X-API-Key": SHELTERLUV_SECRET_TOKEN}

# Sample response from events request:

# {
#     "success": 1,
#     "events": [
#         {
#             "Type": "Outcome.Adoption",
#             "Subtype": "PAC",
#             "Time": "1656536900",
#             "User": "phlp_mxxxx",
#             "AssociatedRecords": [
#                 {
#                     "Type": "Animal",
#                     "Id": "5276xxxx"
#                 },
#                 {
#                     "Type": "Person",
#                     "Id": "5633xxxx"
#                 }
#             ]
#         },
#         {...}
#     ],
#     "has_more": true,
#     "total_count": 67467
# }


def get_event_count():
    """Test that server is operational and get total event count."""
    events = "v1/events&offset=0&limit=1"
    URL = path.join(BASE_URL, events)

    try:
        response = requests.request("GET", URL, headers=headers)
    except Exception as e:
        logger.error("get_event_count failed with ", e)
        return -2

    if response.status_code != 200:
        logger.error("get_event_count ", response.status_code, "code")
        return -3

    try:
        decoded = json.loads(response.text)
    except json.decoder.JSONDecodeError as e:
        logger.error("get_event_count JSON decode failed with", e)
        return -4

    if decoded["success"]:
        return decoded["total_count"]
    else:
        logger.error(decoded['error_message'])
        return -5  # AFAICT, this means URL was bad


def get_events_bulk():
    """Pull all event records from SL """

    # Interesting API design - event record 0 is the newest. But since we pull all records each time it doesn't
    # really matter which direction we go. Simplest to count up, and we can pull until 'has_more' goes false.
    # Good news, the API is robust and won't blow up if you request past the end.
    # At 100 per request, API returns about 5000 records/minute

    event_records = []

    raw_url = path.join(BASE_URL, "v1/events&offset={0}&limit={1}")
    offset = 0
    limit = MAX_COUNT
    more_records = True

    while more_records:

        url = raw_url.format(offset, limit)

        try:
            response = requests.request("GET", url, headers=headers)
        except Exception as e:
            logger.error("get_events failed with ", e)
            return -2

        if response.status_code != 200:
            logger.error("get_event_count ", response.status_code, "code")
            return -3

        try:
            decoded = json.loads(response.text)
        except json.decoder.JSONDecodeError as e:
            logger.error("get_event_count JSON decode failed with", e)
            return -4

        if decoded["success"]:
            for evrec in decoded["events"]:
                if evrec["Type"] in keep_record_types:
                    event_records.append(evrec)

            more_records = decoded["has_more"]  # if so, we'll make another pass
            offset += limit
            if offset % 1000 == 0:
                logger.debug("Reading offset %s", str(offset))
                if TEST_MODE and offset > 1000:
                    more_records=False  # Break out early 

        else:
            return -5  # AFAICT, this means URL was bad

    return event_records


def slae_test():
    total_count = get_event_count()
    logger.debug("Total events: %d", total_count)

    b = get_events_bulk()
    logger.debug("Stored records: %d", len(b))

    # f = filter_events(b)
    # print(f)

    count = shelterluv_db.insert_events(b)
    return count

def store_all_animals_and_events():
    total_count = get_event_count()
    logger.debug("Total events: %d", total_count)

    b = get_events_bulk()
    logger.debug("Stored records: %d", len(b))

    # f = filter_events(b)
    # print(f)

    count = shelterluv_db.insert_events(b)
    return count


# Query to get last adopt/foster event:

# """
#   select 
#      person_id as sl_person_id, max(to_timestamp(time)::date) as last_fosteradopt_event
#  from 
#      sl_animal_events
#  where event_type < 4  -- check this
#  group by 
#      person_id
#  order by 
#     person_id asc;
#    """
# Volgistics last shift 

# """
# select 
#     volg_id, max(from_date) as last_shift
# from
#     volgisticsshifts
# group by 
#     volg_id
# order by   
# volg_id    ;
#     """
src/server/api/API_ingest/shelterluv_people.py METASEP
import requests, os
from models import ShelterluvPeople
from config import engine
from sqlalchemy.orm import  sessionmaker
import structlog
logger = structlog.get_logger()

try:
    from secrets_dict import SHELTERLUV_SECRET_TOKEN
except ImportError:
    # Not running locally
    logger.debug("Couldn't get SHELTERLUV_SECRET_TOKEN from file, trying environment **********")
    from os import environ

    try:
        SHELTERLUV_SECRET_TOKEN = environ['SHELTERLUV_SECRET_TOKEN']
    except KeyError:
        # Not in environment
        # You're SOL for now
        logger.error("Couldn't get SHELTERLUV_SECRET_TOKEN from file or environment")



TEST_MODE=os.getenv("TEST_MODE")  # if not present, has value None
LIMIT = 100
#################################
# This script is used to fetch data from shelterluv API.
# Please be mindful of your usage.
# example: /people will fetch the data of all people. and send approximately 300 requests.
# https://help.shelterluv.com/hc/en-us/articles/115000580127-Shelterluv-API-Overview
#################################

######## Insights ###############
# Max result items is 100 - even though it's not specifically specified in the above reference
# /people has all the data. it seems that /person/:id isn't used
#################################

''' Iterate over all shelterlove people and store in json file in the raw data folder
We fetch 100 items in each request, since that is the limit based on our research '''
def store_shelterluv_people_all():
    offset = 0
    has_more = True
    Session = sessionmaker(engine)

    with Session() as session:
        logger.debug("Truncating table shelterluvpeople")

        session.execute("TRUNCATE TABLE shelterluvpeople")

        logger.debug("Start getting shelterluv contacts from people table")

        while has_more:
            r = requests.get("http://shelterluv.com/api/v1/people?limit={}&offset={}".format(LIMIT, offset),
                             headers={"x-api-key": SHELTERLUV_SECRET_TOKEN})
            response = r.json()
            for person in response["people"]:
                #todo: Does this need more "null checks"?
                session.add(ShelterluvPeople(firstname=person["Firstname"],
                                      lastname=person["Lastname"],
                                      id=person["ID"] if "ID" in person else None,
                                      internal_id=person["Internal-ID"],
                                      associated=person["Associated"],
                                      street=person["Street"],
                                      apartment=person["Apartment"],
                                      city=person["City"],
                                      state=person["State"],
                                      zip=person["Zip"],
                                      email=person["Email"],
                                      phone=person["Phone"],
                                      animal_ids=person["Animal_ids"]))
            offset += LIMIT
            has_more = response["has_more"] if not TEST_MODE else response["has_more"] and offset < 1000
            if offset % 1000 == 0:
                logger.debug("Reading offset %s", str(offset))
        session.commit()

    logger.debug("Finished getting shelterluv contacts from people table")
    return offset


src/server/api/API_ingest/shelterluv_db.py METASEP
from sqlalchemy import Table, MetaData
from sqlalchemy.orm import sessionmaker

from config import engine

import structlog
logger = structlog.get_logger()


def insert_animals(animal_list):
    """Insert animal records into shelterluv_animals table and return row count. """

    Session = sessionmaker(engine)
    session = Session()
    metadata = MetaData()
    sla = Table("shelterluv_animals", metadata, autoload=True, autoload_with=engine)

    # From Shelterluv: ['ID',       'Internal-ID', 'Name', 'Type', 'DOBUnixTime', 'CoverPhoto', 'LastUpdatedUnixTime']
    # In db:           ['local_id', 'id' (PK),     'name', 'type', 'dob',         'photo',      'update_stamp']

    ins_list = []  # Create a list of per-row dicts
    for rec in animal_list:
        ins_list.append(
            {
                "id": rec["Internal-ID"],
                "local_id": rec["ID"] if rec["ID"] else 0,  # Sometimes there's no local id
                "name": rec["Name"],
                "type": rec["Type"],
                "dob": rec["DOBUnixTime"],
                "update_stamp": rec["LastUpdatedUnixTime"],
                "photo": rec["CoverPhoto"],
            }
        )

    ret = session.execute(sla.insert(ins_list))

    session.commit()  # Commit all inserted rows
    session.close()

    return ret.rowcount


def truncate_animals():
    """Truncate the shelterluv_animals table"""

    Session = sessionmaker(engine)
    session = Session()

    truncate = "TRUNCATE table shelterluv_animals;"
    session.execute(truncate)

    session.commit()  # Commit all inserted rows
    session.close()

    return 0


def truncate_events():
    """Truncate the shelterluv_events table"""

    Session = sessionmaker(engine)
    with Session() as session:
        truncate = "TRUNCATE table sl_animal_events;"
        session.execute(truncate)
        session.commit()

    return 0

def insert_events(event_list):
    """Insert event records into sl_animal_events table and return row count. """

    # Always a clean insert
    truncate_events()

    Session = sessionmaker(engine)
    with Session() as session:
        metadata = MetaData()
        sla = Table("sl_animal_events", metadata, autoload=True, autoload_with=engine)

        # TODO: Pull from DB - inserted in db_setup/base_users.py/populate_sl_event_types()
        event_map = {
            "Outcome.Adoption": 1,
            "Outcome.Foster": 2,
            "Outcome.ReturnToOwner": 3,
            "Intake.AdoptionReturn": 4,
            "Intake.FosterReturn":5
        }

        # """ INSERT INTO "sl_event_types" ("id","event_name") VALUES
        # ( 1,'Outcome.Adoption' ),
        # ( 2,'Outcome.Foster' ),
        # ( 3,'Outcome.ReturnToOwner' ),
        # ( 4,'Intake.AdoptionReturn' ),
        # ( 5,'Intake.FosterReturn' ) """




        # Event record:    [ AssociatedRecords[Type = Person]["Id"]',
        #                    AssociatedRecords[Type = Animal]["Id"]',
        #                     "Type",
        #                     "Time"
        #                     ]
        #
        #  In db:           ['id',
        #                     'person_id',
        #                     'animal_id',
        #                     'event_type',
        #                     'time']

        ins_list = []  # Create a list of per-row dicts
        for rec in event_list:
            ins_list.append(
                {
                    "person_id": next(
                        filter(lambda x: x["Type"] == "Person", rec["AssociatedRecords"])
                    )["Id"],
                    "animal_id": next(
                        filter(lambda x: x["Type"] == "Animal", rec["AssociatedRecords"])
                    )["Id"],
                    "event_type": event_map[rec["Type"]],
                    "time": rec["Time"],
                }
            )

        # TODO: Wrap with try/catch
        ret = session.execute(sla.insert(ins_list))
        session.commit()
        logger.debug("finished inserting events")

    return ret.rowcount


src/server/api/API_ingest/shelterluv_animals.py METASEP
import os, time, json
import posixpath as path

import requests

from api.API_ingest import shelterluv_db
from server.api.API_ingest.shelterluv_db import insert_animals


# from config import engine
# from flask import current_app
# from sqlalchemy.sql import text

BASE_URL = 'http://shelterluv.com/api/'
MAX_COUNT = 100  # Max records the API will return for one call

try:
    from secrets_dict import SHELTERLUV_SECRET_TOKEN
except ImportError:
    # Not running locally
    from os import environ

    try:
        SHELTERLUV_SECRET_TOKEN = environ['SHELTERLUV_SECRET_TOKEN']
    except KeyError:
        # Not in environment
        # You're SOL for now
        print("Couldn't get SHELTERLUV_SECRET_TOKEN from file or environment")



headers = {
    "Accept": "application/json",
    "X-API-Key": SHELTERLUV_SECRET_TOKEN
}

logger = print

def get_animal_count():
    """Test that server is operational and get total animal count."""
    animals = 'v1/animals&offset=0&limit=1'
    URL = path.join(BASE_URL,animals)

    try:
        response = requests.request("GET",URL, headers=headers)
    except Exception as e:
        logger('get_animal_count failed with ', e)
        return -2

    if response.status_code != 200:
        logger("get_animal_count ", response.status_code, "code")
        return -3

    try:
        decoded = json.loads(response.text)
    except json.decoder.JSONDecodeError as e:
        logger("get_animal_count JSON decode failed with", e)
        return -4

    if decoded['success']:
        return decoded['total_count']
    else:
        return -5   # AFAICT, this means URL was bad


def get_updated_animal_count(last_update):
    """Test that server is operational and get total animal count."""
    animals = 'v1/animals&offset=0&limit=1&sort=updated_at&since=' + str(last_update)
    URL = path.join(BASE_URL,animals)

    try:
        response = requests.request("GET",URL, headers=headers)
    except Exception as e:
        logger('get_updated_animal_count failed with ', e)
        return -2

    if response.status_code != 200:
        logger("get_updated_animal_count ", response.status_code, "code")
        return -3

    try:
        decoded = json.loads(response.text)
    except json.decoder.JSONDecodeError as e:
        logger("get_updated_animal_count JSON decode failed with", e)
        return -4

    if decoded['success']:
        return decoded['total_count']
    else:
        return -5   # AFAICT, this means URL was bad




def filter_animals(raw_list):
    """Given a list of animal records as returned by SL, return a list of records with only the fields we care about."""

    good_keys = ['ID', 'Internal-ID', 'Name', 'Type', 'DOBUnixTime', 'CoverPhoto','LastUpdatedUnixTime']

    filtered = []

    for r in raw_list:
        f = {}
        for k in good_keys:
            try:
                f[k] = r[k]
            except:
                if k in ('DOBUnixTime','LastUpdatedUnixTime'):
                    f[k] = 0
                else:
                    f[k] = ''
        filtered.append(f)

    return filtered




def get_animals_bulk(total_count):
    """Pull all animal records from SL """

    # 'Great' API design - animal record 0 is the newest, so we need to start at the end, 
    # back up MAX_COUNT rows, make our request, then keep backing up. We need to keep checking
    # the total records to ensure one wasn't added in the middle of the process.
    # Good news, the API is robust and won't blow up if you request past the end.

    raw_url = path.join(BASE_URL, 'v1/animals&offset={0}&limit={1}')

    start_record = int(total_count) 
    offset = (start_record - MAX_COUNT)  if  (start_record - MAX_COUNT) > -1  else 0
    limit = MAX_COUNT

    while offset > -1 :

        logger("getting at offset", offset)
        url = raw_url.format(offset,limit)

        try:
            response = requests.request("GET",url, headers=headers)
        except Exception as e:
            logger('get_animals failed with ', e)
            return -2

        if response.status_code != 200:
            logger("get_animal_count ", response.status_code, "code")
            return -3

        try:
            decoded = json.loads(response.text)
        except json.decoder.JSONDecodeError as e:
            logger("get_animal_count JSON decode failed with", e)
            return -4

        if decoded['success']:
            insert_animals( filter_animals(decoded['animals']) )
            if offset == 0:
                break
            offset -= MAX_COUNT 
            if offset < 0 :
                limit = limit + offset
                offset = 0
        else:
            return -5   # AFAICT, this means URL was bad

    return 'zero'


def update_animals(last_update):
    """Get the animals inserted or updated since last check, insert/update db records. """

    updated_records = get_updated_animal_count(last_update)

    


















def sla_test():
    total_count = get_animal_count()
    print('Total animals:',total_count)

    b = get_animals_bulk(total_count)
    print(len(b))

    # f = filter_animals(b)
    # print(f)

    # count = shelterluv_db.insert_animals(f)
    return len(b)

# if __name__ == '__main__' :    

#     total_count = get_animal_count()
#     print('Total animals:',total_count)

#     b = get_animals_bulk(9)
#     print(len(b))

#     f = filter_animals(b)
#     print(f)

#     count = shelterluv_db.insert_animals(f)
src/server/api/API_ingest/salesforce_contacts.py METASEP
import os

import structlog
from simple_salesforce import Salesforce
from sqlalchemy.orm import sessionmaker

from config import engine
from models import SalesForceContacts

logger = structlog.get_logger()

TEST_MODE = os.getenv("TEST_MODE")  # if not present, has value None

def store_contacts_all():
    Session = sessionmaker(engine)
    with Session() as session:

        logger.debug("truncating table salesforcecontacts")
        session.execute("TRUNCATE TABLE salesforcecontacts")

        logger.debug("retrieving the latest salesforce contacts data")

        if os.path.exists('server/bin/connected-app-secrets.pem'):
            pem_file = 'server/bin/connected-app-secrets.pem'
        elif os.path.exists('bin/connected-app-secrets.pem'):
            pem_file = 'bin/connected-app-secrets.pem'
        else:
            logger.error("Missing salesforce jwt private key pem file, skipping data pull")
            return

        sf = Salesforce(username=os.getenv('SALESFORCE_USERNAME'), consumer_key=os.getenv('SALESFORCE_CONSUMER_KEY'),
                        privatekey_file=pem_file)
        results = sf.query("SELECT Contact_ID_18__c, FirstName, LastName, Contact.Account.Name, MailingCountry, MailingStreet, MailingCity, MailingState, MailingPostalCode, Phone, MobilePhone, Email FROM Contact")
        logger.debug("%d total Salesforce contact records", results['totalSize'])
        if TEST_MODE:
            logger.debug("running in test mode so only downloading first page of Salesforce contacts")

        total_records = 0
        done = False
        while not done:
            total_records += len(results['records'])
            logger.debug("Query returned %d Salesforce contact records, total %d", len(results['records']), total_records)
            for row in results['records']:
                account_name = row['Account']['Name'] if row['Account'] is not None else None
                contact = SalesForceContacts(contact_id=row['Contact_ID_18__c'],
                                             first_name=row['FirstName'],
                                             last_name=row['LastName'],
                                             account_name=account_name,
                                             mailing_country=row['MailingCountry'],
                                             mailing_street=row['MailingStreet'],
                                             mailing_city=row['MailingCity'],
                                             mailing_state_province=row['MailingState'],
                                             mailing_zip_postal_code=row['MailingPostalCode'],
                                             phone=row['Phone'],
                                             mobile=row['MobilePhone'],
                                             email=row['Email'])
                session.add(contact)
            # if in test mode only return first page of results
            done = results['done'] if not TEST_MODE else True
            if not done:
                results = sf.query_more(results['nextRecordsUrl'], True)
        logger.debug("Committing downloaded contact records")
        session.commit()
    logger.debug("finished downloading latest salesforce contacts data")

src/server/api/API_ingest/ingest_sources_from_api.py METASEP
from api.API_ingest import shelterluv_people, salesforce_contacts, sl_animal_events
import structlog
logger = structlog.get_logger()

def start():
    logger.debug("Start Fetching raw data from different API sources")

    logger.debug("   Fetching Salesforce contacts")
    salesforce_contacts.store_contacts_all()
    logger.debug("   Finished fetching Salesforce contacts")

    logger.debug("   Fetching Shelterluv people")
    slp_count = shelterluv_people.store_shelterluv_people_all()
    logger.debug("   Finished fetching Shelterluv people - %d records" , slp_count)

    logger.debug("   Fetching Shelterluv events")
    sle_count = sl_animal_events.store_all_animals_and_events()
    logger.debug("   Finished fetching Shelterluv events - %d records" , sle_count)

    logger.debug("Finished fetching raw data from different API sources")


src/server/api/API_ingest/dropbox_handler.py METASEP
import dropbox
import structlog
logger = structlog.get_logger()

try:
    from secrets_dict import DROPBOX_APP
except ImportError:
    # Not running locally
    logger.debug("Couldn't get DROPBOX_APP from file, trying environment **********")
    from os import environ

    try:
        DROPBOX_APP = environ['DROPBOX_APP']
    except KeyError:
        # Not in environment
        # You're SOL for now
        logger.error("Couldn't get DROPBOX_APP from file or environment")


class TransferData:
    def __init__(self, access_token):
        self.access_token = access_token

    def upload_file(self, file_from, file_to):
        dbx = dropbox.Dropbox(self.access_token)

        with open(file_from, 'rb') as f:
            dbx.files_upload(f.read(), file_to)


def upload_file_to_dropbox(file_path, upload_path):
    access_token = DROPBOX_APP
    transfer_data = TransferData(access_token)

    file_from = file_path
    file_to = upload_path  # The full path to upload the file to, including the file name

    transfer_data.upload_file(file_from, file_to)
src/server/api/API_ingest/__init__.py METASEP

src/server/alembic/versions/fd187937528b_create_pdp_contacts_table.py METASEP
"""create pdp_contacts table

Revision ID: fd187937528b
Revises: 57b547e9b464
Create Date: 2021-08-10 20:16:54.169168

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import JSONB
import datetime

# revision identifiers, used by Alembic.
revision = 'fd187937528b'
down_revision = '57b547e9b464'
branch_labels = None
depends_on = None


def upgrade():
    
    op.create_table('pdp_contacts',
        sa.Column('_id', sa.Integer, primary_key=True, autoincrement=True),
        sa.Column('matching_id', sa.Integer, primary_key=True),
        sa.Column('source_type', sa.String, nullable=False),
        sa.Column('source_id', sa.String, nullable=False),
        sa.Column('is_organization', sa.Boolean),
        sa.Column('first_name', sa.String),
        sa.Column('last_name', sa.String),
        sa.Column('email', sa.String),
        sa.Column('mobile', sa.String),
        sa.Column('street_and_number', sa.String),
        sa.Column('apartment', sa.String),
        sa.Column('city', sa.String),
        sa.Column('state', sa.String),
        sa.Column('zip', sa.String),
        sa.Column('json', JSONB),
        sa.Column('created_date', sa.DateTime, default=datetime.datetime.utcnow),
        sa.Column('archived_date', sa.DateTime, default=None)
    )

def downgrade():
    
    op.drop_table("pdp_contacts")
    op.drop_table("pdp_contact_types")

src/server/alembic/versions/fc7325372396_merge_heads.py METASEP
"""Merges heads '8f4, '28b

Revision ID: fc7325372396
Revises: a3ba63dee8f4, fd187937528b
Create Date: 2022-01-17 22:05:05.824901

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'fc7325372396'
down_revision = ('a3ba63dee8f4', 'fd187937528b')
branch_labels = None
depends_on = None


def upgrade():
    pass


def downgrade():
    pass

src/server/alembic/versions/f3d30db17bed_change_pdp_users_password_to_bytea.py METASEP
"""Change pdp_users.password to bytea

Revision ID: f3d30db17bed
Revises: 41da831646e4
Create Date: 2020-12-16 21:26:08.548724

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "f3d30db17bed"
down_revision = "41da831646e4"
branch_labels = None
depends_on = None


def upgrade():
    op.drop_column("pdp_users", "password")
    op.add_column("pdp_users", sa.Column("password", sa.LargeBinary, nullable=False))


def downgrade():
    op.drop_column("pdp_users", "password")
    op.add_column("pdp_users", "password", sa.String(50), nullable=False),

src/server/alembic/versions/e3ef522bd3d9_explicit_create_sfd.py METASEP
"""Explicit creation for salesforcedonations

Revision ID: e3ef522bd3d9
Revises: bfb1262d3195
Create Date: 2021-06-18 21:55:56.651101

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'e3ef522bd3d9'
down_revision = 'bfb1262d3195'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table (
        "salesforcedonations",
        sa.Column("_id", sa.Integer, primary_key=True),
        sa.Column("opp_id", sa.String(), nullable=False),
        sa.Column("recurring_donor", sa.Boolean,  nullable=False),
        sa.Column("primary_contact", sa.String(), nullable=True),
        sa.Column("contact_id", sa.String(), nullable=False),
        sa.Column("amount",  sa.DECIMAL, nullable=False),
        sa.Column("close_date",  sa.Date, nullable=False),
        sa.Column("donation_type",  sa.String(), nullable=True),        
        sa.Column("primary_campaign_source", sa.String(),nullable=True)
    )

    op.execute("""CREATE  INDEX sfd_contact_id_idx 
                    ON public.salesforcedonations USING btree (contact_id);"""
                    )

    op.create_unique_constraint( "uq_donation", "salesforcedonations",  ["opp_id", "contact_id", "close_date", "amount"] ) 


def downgrade():
    op.drop_table("salesforcedonations")
src/server/alembic/versions/d0841384d5d7_explicitly_create_vshifts.py METASEP
"""Explicitly create vshifts

Revision ID: d0841384d5d7
Revises: e3ef522bd3d9
Create Date: 2021-07-05 22:05:52.743905

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'd0841384d5d7'
down_revision = 'e3ef522bd3d9'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table (
        "volgisticsshifts",
        sa.Column("_id", sa.Integer, primary_key=True),
        sa.Column("volg_id", sa.Integer, nullable=False),
        sa.Column("assignment", sa.String(), nullable=True),
        sa.Column("site", sa.String(), nullable=True),      
        sa.Column("from_date",  sa.Date, nullable=False),
        sa.Column("hours",  sa.DECIMAL, nullable=False)
    )

    op.execute("""CREATE  INDEX vs_volg_id_idx 
                    ON public.volgisticsshifts USING btree (volg_id);"""
                    )

    op.create_unique_constraint( "uq_shift", "volgisticsshifts",  ["volg_id", "assignment", "from_date", "hours"] ) 


def downgrade():
    op.drop_table("volgisticsshifts")

src/server/alembic/versions/bfb1262d3195_create_execution_status_table.py METASEP
"""create execution status table

Revision ID: bfb1262d3195
Revises: 05e0693f8cbb
Create Date: 2021-05-28 16:12:40.561829

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.sql.sqltypes import Integer
from sqlalchemy.sql import func

# revision identifiers, used by Alembic.
revision = 'bfb1262d3195'
down_revision = '05e0693f8cbb'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table (
        "execution_status",
        sa.Column("_id", sa.Integer, primary_key=True),
        sa.Column("job_id", sa.Integer,  nullable=False),
        sa.Column("stage", sa.String(32),   nullable=False),
        sa.Column("status", sa.String(32),   nullable=False),
        sa.Column("details", sa.String(128),  nullable=False),
        sa.Column("update_stamp", sa.DateTime,  nullable=False, server_default=func.now())
    )

    op.execute("""CREATE FUNCTION last_upd_trig() RETURNS trigger
                LANGUAGE plpgsql AS
                $$BEGIN
                NEW.update_stamp := current_timestamp;
                RETURN NEW;
                END;$$;""")

    op.execute("""CREATE TRIGGER last_upd_trigger
                BEFORE INSERT OR UPDATE ON execution_status
                FOR EACH ROW
                EXECUTE PROCEDURE last_upd_trig();"""
                )   # Postgres-specific, obviously 

    op.create_unique_constraint("uq_job_id",  "execution_status", ["job_id"])

def downgrade():
    op.drop_table("execution_status")
    op.execute("DROP FUNCTION last_upd_trig()")
src/server/alembic/versions/a3ba63dee8f4_rmv_details_size_limit.py METASEP
"""Remove execution_status.details field size limit

Revision ID: a3ba63dee8f4
Revises: 40be910424f0
Create Date: 2021-09-18 18:14:48.044985

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'a3ba63dee8f4'
down_revision = '40be910424f0'
branch_labels = None
depends_on = None


def upgrade():
    op.alter_column('execution_status',"details", type_=sa.String(None) )



def downgrade():
    op.alter_column('execution_status',"details", type_=sa.String(128) )


src/server/alembic/versions/9687db7928ee_shelterluv_animals.py METASEP
"""Create SL_animals table

Revision ID: 9687db7928ee
Revises:  45a668fa6325
Create Date: 2021-12-24 21:15:33.399197

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '9687db7928ee'
down_revision = '45a668fa6325'
branch_labels = None
depends_on = None


def upgrade():
        op.create_table (
        "shelterluv_animals",
        sa.Column("id", sa.BigInteger, primary_key=True),
        sa.Column("local_id", sa.BigInteger, nullable=False),
        sa.Column("name", sa.Text, nullable=False),
        sa.Column("type",  sa.Text, nullable=False),
        sa.Column("dob", sa.BigInteger, nullable=False),
        sa.Column("update_stamp", sa.BigInteger, nullable=False),
        sa.Column("photo", sa.Text, nullable=False)
    )


def downgrade():
    op.drop_table("shelterluv_animals")

src/server/alembic/versions/90f471ac445c_create_sl_events.py METASEP
"""Shelterluv animal events table

Revision ID: 90f471ac445c
Revises: 9687db7928ee
Create Date: 2022-09-04 17:21:51.511030

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '90f471ac445c'
down_revision = '9687db7928ee'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table (
    "sl_event_types",
    sa.Column("id", sa.Integer, autoincrement=True, primary_key=True),
    sa.Column("event_name", sa.Text, nullable=False),
    )
    
    op.create_table (
    "sl_animal_events",
    sa.Column("id", sa.Integer, autoincrement=True, primary_key=True),
    sa.Column("person_id", sa.Integer, nullable=False),
    sa.Column("animal_id", sa.Integer, nullable=False),
    sa.Column("event_type", sa.Integer, sa.ForeignKey('sl_event_types.id')),
    sa.Column("time", sa.BigInteger, nullable=False)
    )
    
    op.create_index('sla_idx', 'sl_animal_events', ['person_id'])



def downgrade():
    op.drop_table("sl_animal_events")
    op.drop_table("sl_event_types")
src/server/alembic/versions/783cabf889d9_inital_schema_setup.py METASEP
"""inital schema setup

Revision ID: 783cabf889d9
Revises: 
Create Date: 2020-12-16 01:47:43.686881

"""
from sqlalchemy.sql.expression import null
from alembic import op
import sqlalchemy as sa



# revision identifiers, used by Alembic.
revision = '783cabf889d9'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
    op.create_table(
        'pdp_user_roles',
        sa.Column('_id', sa.Integer, primary_key=True),
        sa.Column('role', sa.String(50), nullable=False)
    )

    op.create_table(
        'pdp_users',
        sa.Column('_id', sa.Integer, primary_key=True),
        sa.Column('username', sa.String(50), nullable=False),
        sa.Column('role', sa.String(50), nullable=False),
        sa.Column('password', sa.String(50), nullable=False),
        sa.Column('active', sa.String(50), nullable=False),
        sa.Column('created', sa.DateTime,nullable=False, server_default='now()')
    )

def downgrade():
    pass
src/server/alembic/versions/72d50d531bd5_fix_pdp_users_timestamp.py METASEP
"""Fix pdp_users timestamp

Revision ID: 72d50d531bd5
Revises: 783cabf889d9
Create Date: 2020-12-16 15:22:54.734670

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.sql import func

# revision identifiers, used by Alembic.
revision = "72d50d531bd5"
down_revision = "783cabf889d9"
branch_labels = None
depends_on = None


def upgrade():
    op.drop_column("pdp_users", "created")
    op.add_column(
        "pdp_users",
        sa.Column("created", sa.DateTime, nullable=False, server_default=func.now()),
    )


def downgrade():
    sa.Column("created", sa.DateTime, nullable=False, server_default="now()")

src/server/alembic/versions/7138d52f92d6_add_uniqueness_constraints.py METASEP
"""add uniqueness constraints

Revision ID: 7138d52f92d6
Revises: f3d30db17bed
Create Date: 2020-12-17 17:31:29.154789

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "7138d52f92d6"
down_revision = "f3d30db17bed"
branch_labels = None
depends_on = None


def upgrade():
    op.create_unique_constraint("uq_username", "pdp_users", ["username"])
    op.create_unique_constraint("uq_role", "pdp_user_roles", ["role"])


def downgrade():
    pass

src/server/alembic/versions/6b8cf99be000_add_user_journal_table.py METASEP
"""Add user journal table

Revision ID: 6b8cf99be000
Revises: 36c4ecbfd11a
Create Date: 2020-12-21 15:08:07.784568

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.sql import func


# revision identifiers, used by Alembic.
revision = "6b8cf99be000"
down_revision = "36c4ecbfd11a"
branch_labels = None
depends_on = None


def upgrade():
    op.create_table(
        "pdp_user_journal",
        sa.Column("_id", sa.Integer, primary_key=True),
        sa.Column("stamp", sa.DateTime, nullable=False, server_default=func.now()),
        sa.Column("username", sa.String(50), nullable=False),
        sa.Column("event_type", sa.String(50)),
        sa.Column("detail", sa.String(120)),
    )


def downgrade():
    op.drop_table('pdp_user_journal')

src/server/alembic/versions/57b547e9b464_create_rfm_edges_table.py METASEP
"""Create RFM edges table

Revision ID: 57b547e9b464
Revises: 494e064d69a3
Create Date: 2021-07-20 21:39:00.438116

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '57b547e9b464'
down_revision = '494e064d69a3'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table (
        "rfm_edges",
        sa.Column("component", sa.String(), primary_key=True),
        sa.Column("edge_string", sa.String(), nullable=False)
    )


def downgrade():
    op.drop_table("rfm_edges")

src/server/alembic/versions/494e064d69a3_tables_for_rfm_data.py METASEP
"""Tables for RFM data

Revision ID: 494e064d69a3
Revises: d0841384d5d7
Create Date: 2021-07-20 19:45:29.418756

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '494e064d69a3'
down_revision = 'd0841384d5d7'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table (
        "rfm_scores",
        sa.Column("matching_id", sa.Integer, primary_key=True),
        sa.Column("rfm_score", sa.String(3), nullable=False)
    )

    op.create_table (
        "rfm_mapping",
        sa.Column("rfm_value", sa.String(3), primary_key=True),
        sa.Column("rfm_label", sa.String(), nullable=True),
        sa.Column("rfm_color", sa.String(), nullable=True, default='0xe0e0e0')
    )


def downgrade():
    op.drop_table("rfm_scores")
    op.drop_table("rfm_mapping")

src/server/alembic/versions/45a668fa6325_postgres_matching.py METASEP
"""postgres matching

Revision ID: 45a668fa6325
Revises: fc7325372396
Create Date: 2022-02-10 16:19:13.283250

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision = '45a668fa6325'
down_revision = 'fc7325372396'
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('manual_matches',
    sa.Column('source_type_1', sa.String(), nullable=False),
    sa.Column('source_id_1', sa.String(), nullable=False),
    sa.Column('source_type_2', sa.String(), nullable=False),
    sa.Column('source_id_2', sa.String(), nullable=False),
    sa.PrimaryKeyConstraint('source_type_1', 'source_id_1', 'source_type_2', 'source_id_2')
    )
    op.create_table('salesforcecontacts',
    sa.Column('_id', sa.Integer(), nullable=False),
    sa.Column('contact_id', sa.String(), nullable=True),
    sa.Column('first_name', sa.String(), nullable=True),
    sa.Column('last_name', sa.String(), nullable=True),
    sa.Column('account_name', sa.String(), nullable=True),
    sa.Column('mailing_country', sa.String(), nullable=True),
    sa.Column('mailing_street', sa.String(), nullable=True),
    sa.Column('mailing_city', sa.String(), nullable=True),
    sa.Column('mailing_state_province', sa.String(), nullable=True),
    sa.Column('mailing_zip_postal_code', sa.String(), nullable=True),
    sa.Column('phone', sa.String(), nullable=True),
    sa.Column('mobile', sa.String(), nullable=True),
    sa.Column('email', sa.String(), nullable=True),
    sa.Column('json', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
    sa.Column('created_date', sa.DateTime(), nullable=True),
    sa.PrimaryKeyConstraint('_id')
    )
    op.create_table('shelterluvpeople',
    sa.Column('_id', sa.Integer(), nullable=False),
    sa.Column('firstname', sa.String(), nullable=True),
    sa.Column('lastname', sa.String(), nullable=True),
    sa.Column('id', sa.String(), nullable=True),
    sa.Column('internal_id', sa.String(), nullable=True),
    sa.Column('associated', sa.String(), nullable=True),
    sa.Column('street', sa.String(), nullable=True),
    sa.Column('apartment', sa.String(), nullable=True),
    sa.Column('city', sa.String(), nullable=True),
    sa.Column('state', sa.String(), nullable=True),
    sa.Column('zip', sa.String(), nullable=True),
    sa.Column('email', sa.String(), nullable=True),
    sa.Column('phone', sa.String(), nullable=True),
    sa.Column('animal_ids', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
    sa.Column('json', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
    sa.Column('created_date', sa.DateTime(), nullable=True),
    sa.PrimaryKeyConstraint('_id')
    )
    op.create_table('volgistics',
    sa.Column('_id', sa.Integer(), nullable=False),
    sa.Column('number', sa.String(), nullable=True),
    sa.Column('last_name', sa.String(), nullable=True),
    sa.Column('first_name', sa.String(), nullable=True),
    sa.Column('middle_name', sa.String(), nullable=True),
    sa.Column('complete_address', sa.String(), nullable=True),
    sa.Column('street_1', sa.String(), nullable=True),
    sa.Column('street_2', sa.String(), nullable=True),
    sa.Column('street_3', sa.String(), nullable=True),
    sa.Column('city', sa.String(), nullable=True),
    sa.Column('state', sa.String(), nullable=True),
    sa.Column('zip', sa.String(), nullable=True),
    sa.Column('all_phone_numbers', sa.String(), nullable=True),
    sa.Column('home', sa.String(), nullable=True),
    sa.Column('work', sa.String(), nullable=True),
    sa.Column('cell', sa.String(), nullable=True),
    sa.Column('email', sa.String(), nullable=True),
    sa.Column('json', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
    sa.Column('created_date', sa.DateTime(), nullable=True),
    sa.PrimaryKeyConstraint('_id')
    )
    op.create_index('idx_pdp_contacts_source_type_and_id', 'pdp_contacts', ['source_type', 'source_id'], unique=False)
    op.create_index(op.f('ix_pdp_contacts_mobile'), 'pdp_contacts', ['mobile'], unique=False)
    op.create_index(op.f('idx_pdp_contacts_lower_first_name'), 'pdp_contacts', [sa.text('lower(first_name)')], unique=False)
    op.create_index(op.f('idx_pdp_contacts_lower_last_name'), 'pdp_contacts', [sa.text('lower(last_name)')], unique=False)
    op.create_index(op.f('idx_pdp_contacts_lower_email'), 'pdp_contacts', [sa.text('lower(email)')], unique=False)
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index(op.f('ix_pdp_contacts_lower_email'), table_name='pdp_contacts')
    op.drop_index(op.f('ix_pdp_contacts_lower_last_name'), table_name='pdp_contacts')
    op.drop_index(op.f('ix_pdp_contacts_lower_first_name'), table_name='pdp_contacts')
    op.drop_index(op.f('ix_pdp_contacts_mobile'), table_name='pdp_contacts')
    op.drop_index('idx_pdp_contacts_source_type_and_id', table_name='pdp_contacts')
    op.drop_table('volgistics')
    op.drop_table('shelterluvpeople')
    op.drop_table('salesforcecontacts')
    op.drop_table('manual_matches')
    # ### end Alembic commands ###

src/server/alembic/versions/41da831646e4_pdp_users_role_fk_from_roles.py METASEP
"""pdp_users.role FK from roles

Revision ID: 41da831646e4
Revises: 72d50d531bd5
Create Date: 2020-12-16 15:53:28.514053

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "41da831646e4"
down_revision = "72d50d531bd5"
branch_labels = None
depends_on = None


def upgrade():
    op.drop_column("pdp_users", "role")
    op.add_column(
        "pdp_users", sa.Column("role", sa.Integer, sa.ForeignKey("pdp_user_roles._id"))
    )


def downgrade():
    pass

src/server/alembic/versions/40be910424f0_update_rfm_mapping_remove_rfm_edges.py METASEP
"""Update rfm_mapping, remove rfm_edges

Revision ID: 40be910424f0
Revises: 57b547e9b464
Create Date: 2021-08-08 17:26:40.622536

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '40be910424f0'
down_revision = '57b547e9b464'
branch_labels = None
depends_on = None


def upgrade():
    op.drop_table("rfm_edges")    # Unneeded, unused
    op.add_column('rfm_mapping',
        sa.Column('rfm_text_color', sa.String())
        )


def downgrade():
    op.create_table (
        "rfm_edges",
        sa.Column("component", sa.String(), primary_key=True),
        sa.Column("edge_string", sa.String(), nullable=False)
    )

src/server/alembic/versions/36c4ecbfd11a_add_pdp_users_full_name.py METASEP
"""Add pdp_users full_name

Revision ID: 36c4ecbfd11a
Revises: 7138d52f92d6
Create Date: 2020-12-18 15:28:17.367718

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "36c4ecbfd11a"
down_revision = "7138d52f92d6"
branch_labels = None
depends_on = None


def upgrade():
    op.add_column("pdp_users", sa.Column("full_name", sa.String))


def downgrade():
    op.drop_column("pdp_users", "full_name")

src/server/alembic/versions/05e0693f8cbb_key_value_table.py METASEP
"""key/value table

Revision ID: 05e0693f8cbb
Revises: 6b8cf99be000
Create Date: 2021-03-18 11:35:43.512082

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '05e0693f8cbb'
down_revision = '6b8cf99be000'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table(
        'kv_unique',
        sa.Column('_id', sa.Integer, primary_key=True),
        sa.Column('keycol', sa.String(50), nullable=False, unique=True),
        sa.Column('valcol', sa.String(65536), nullable=True),
    )
    
    # op.create_index('kvk_ix', 'kv_unique', ['key'], unique=True)


def downgrade():
    op.drop_table('kv_unique')

src/server/rfm_funcs/rfm_instructions.md METASEP
# RFM code run instructions

In order to obtain rfm scores a few dependencies will be required. 

1. The most up to date bin edges must be stored within the postgres database.
2. If bin edges must be updated use the following---via "src/server/api/admin_api.py"
    write_rfm_edges(rfm_dict : dict)

Once all above situations are satisfied create_scores can be run. 
create_scores.py is the main function which will output a list of tuples for matching_id and corresponding score.
This function requires a single input, query_date
    query_date should be pulled from the most recent data ingestion----once per week.

create_scores.py runs in 4 distinct steps
1. calculate recency since last donation over the total lifespan of data collection
2. calculate frequency over the past year from query date.
3. calculate monetary donations from the individual's max donation over the course of data lifespan.
4. concatenate recency, frequency, and monetary values into a single integer and pair these with individual matching ids to update via 'insert_rfm_scores'


src/server/db_setup/README.md METASEP
User Management API
----------


*** Create user record 
    
Requires admin role  

Form POST Parameters  
----------
username : str  
full_name : str  
password : str  
role : str, one of `user`, `editor`, `admin`  

Returns    
----------
User created: 201 + username  
Invalid role: 422 + "Bad role"  
Duplicate user: 409 +  DB error  


*** Get users


Returns
----------
One header row of field names, one row per user  
"['username', 'full_name', 'active', 'role'],  
['admin', None, 'Y', 'admin'],  
['editor', None, 'Y', 'editor'],  
['steve11', 'Steve the User', 'Y', 'admin'],  
['user', None, 'Y', 'user'],"
src/server/bin/startServer.sh METASEP
#!/bin/bash

# we may want to switch this to a script which logs output, etc?
echo "------------STARTING `date` ------------------"
set FLASK_APP=server/app.py
export FLASK_APP
source bin/export_secrets.sh
# This abomination ensures that the PG server has finished its restart cycle
echo "SLEEPING.. WAITING FOR DB"; sleep 5; echo "WAKING"; alembic upgrade head; alembic current; echo "DB SETUP";
#; python -m flask run --host=0.0.0.0 --no-reload

# --no-reload prevents Flask restart, which usually happens in middle of create_base_users()
#TODO: SECURITY - ensure we are not running in debug mode in production
uwsgi --http-socket :5000 --plugin python38 --module wsgi:app --chdir /app --pythonpath . --processes 2 --threads 4 --master

src/server/bin/export_secrets.sh METASEP
set -o allexport
source bin/secrets_dict.py
set +o allexport

src/server/alembic/script.py.mako METASEP
"""${message}

Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}

"""
from alembic import op
import sqlalchemy as sa
${imports if imports else ""}

# revision identifiers, used by Alembic.
revision = ${repr(up_revision)}
down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}


def upgrade():
    ${upgrades if upgrades else "pass"}


def downgrade():
    ${downgrades if downgrades else "pass"}

src/server/alembic/populate_rfm_mapping.sql METASEP
-- Run this script in your SQL query tool
-- Run truncate command if this table is already populated

-- TRUNCATE TABLE rfm_mapping; 
-- BEGIN;
-- Fields are                 (rfm_score, label, (background) color, text color)
insert into rfm_mapping values('111', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('112', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('113', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('114', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('115', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('121', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('122', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('123', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('124', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('125', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('131', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('132', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('133', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('134', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('135', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('141', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('142', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('143', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('144', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('145', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('151', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('152', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('153', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('154', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('155', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('211', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('212', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('213', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('214', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('215', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('221', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('222', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('223', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('224', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('225', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('231', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('232', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('233', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('234', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('235', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('241', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('242', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('243', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('244', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('245', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('251', 'Low impact, disengaged','#eed0aa', '#000000');
insert into rfm_mapping values('252', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('253', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('254', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('255', 'High impact, disengaged','#cf3030', '#ffffff');
insert into rfm_mapping values('311', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('312', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('313', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('314', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('315', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('321', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('322', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('323', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('324', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('325', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('331', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('332', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('333', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('334', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('335', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('341', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('342', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('343', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('344', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('345', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('351', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('352', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('353', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('354', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('355', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('411', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('412', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('413', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('414', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('415', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('421', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('422', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('423', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('424', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('425', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('431', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('432', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('433', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('434', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('435', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('441', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('442', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('443', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('444', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('445', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('451', 'Low impact, slipping','#f77d4e', '#000000');
insert into rfm_mapping values('452', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('453', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('454', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('455', 'High impact, slipping','#990000', '#ffffff');
insert into rfm_mapping values('511', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('512', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('513', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('514', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('515', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('521', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('522', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('523', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('524', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('525', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('531', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('532', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('533', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('534', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('535', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('541', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('542', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('543', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('544', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('545', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('551', 'Low impact, engaged','#47b8a7', '#000000');
insert into rfm_mapping values('552', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('553', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('554', 'High impact, engaged','#034858', '#ffffff');
insert into rfm_mapping values('555', 'High impact, engaged','#034858', '#ffffff');
COMMIT;

src/server/alembic/insert_rfm_edges.sql METASEP
INSERT INTO "public"."kv_unique"(   "keycol",  "valcol") VALUES 
(    'rfm_edges',
    '{
        "r":{"5": 0, "4": 262, "3": 1097, "2": 1910, "1": 2851}, 
        "f": {"1": 0, "2": 1, "3": 2, "4": 3, "5": 4}, 
        "m": {"1": 0.0, "2": 50.0, "3": 75.0, "4": 100.0, "5": 210.0}
        }'
 );

src/server/alembic/README METASEP
Generic single-database configuration.
src/run_cluster.sh METASEP
#  Creates and runs PDP on a kind-based clauster
#  If running on Windows, run on Bash (e.g., Git Bash) or change file ext from .sh to .cmd
#     .cmd works the same but you'll see echo lines twice

echo " "; echo ">>>>>>>>>>>>>>>>> Creating cluster. Now's a good time to go get coffee >>>>>>>>>>>>>>>>>"
kind create cluster

# Assumes kustomization.yaml lives in server/secets
echo " "; echo ">>>>>>>>>>>>>>>>> Create and add secrets to k8s environment >>>>>>>>>>>>>>>>>"
kubectl apply -k server/secrets 

echo " "; echo ">>>>>>>>>>>>>>>>>                 Build images             >>>>>>>>>>>>>>>>>"
docker-compose build

# So pods, specifically 'wait_for', have read access to API
echo " "; echo ">>>>>>>>>>>>>>>>>     Give pods access to k8s API         >>>>>>>>>>>>>>>>>"
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods,services,deployments
kubectl create rolebinding default-pod-reader --role=pod-reader --serviceaccount=default:default --namespace=default

echo " "; echo ">>>>>>>>>>>>>>>>>     Tag and push client container image   >>>>>>>>>>>>>>>>>"
docker tag src_client localhost:5000/src-client:latest 
kind load docker-image localhost:5000/src-client:latest

echo " "; echo ">>>>>>>>>>>>>>>>> Tag and push server container image      >>>>>>>>>>>>>>>>>"
docker tag src_server localhost:5000/src-server:latest 
kind load docker-image localhost:5000/src-server:latest

echo " "; echo ">>>>>>>>>>>>>>>>> Apply k8s deployment files to launch containers  >>>>>>>>>>>>>>>>>"
kubectl apply -f k8s_conf

echo " "; echo ">>>>>>>>>>>>>>>>> Wait 20s in hopes that client service/container is live  >>>>>>>>>>>>>>>>>"
sleep 20

echo " "; echo ">>>>>>>>>>>>>>>>> Forwarding port 80 from cluster to localhost     >>>>>>>>>>>>>>>>>"
echo "'>>>>>>>>>>>>>>>>> Forwarding...' means it's working and will forward until ^C "
echo ">>>>>>>>>>>>>>>>>  To restart port-forwarding, 'kubectl port-forward service/client 80:80     '"
kubectl port-forward service/client 80:80        
echo " "; echo ">>>>>>>>>>>>>>>>> ^- Failed? Try running 'kubectl port-forward service/client 80:80' >>>>>>>>>>>>>>>>>"
src/package-lock.json METASEP
{
  "requires": true,
  "lockfileVersion": 1,
  "dependencies": {
    "buffer-equal-constant-time": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
      "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
    },
    "ecdsa-sig-formatter": {
      "version": "1.0.11",
      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
      "requires": {
        "safe-buffer": "^5.0.1"
      }
    },
    "jsonwebtoken": {
      "version": "8.5.1",
      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
      "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
      "requires": {
        "jws": "^3.2.2",
        "lodash.includes": "^4.3.0",
        "lodash.isboolean": "^3.0.3",
        "lodash.isinteger": "^4.0.4",
        "lodash.isnumber": "^3.0.3",
        "lodash.isplainobject": "^4.0.6",
        "lodash.isstring": "^4.0.1",
        "lodash.once": "^4.0.0",
        "ms": "^2.1.1",
        "semver": "^5.6.0"
      }
    },
    "jwa": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
      "requires": {
        "buffer-equal-constant-time": "1.0.1",
        "ecdsa-sig-formatter": "1.0.11",
        "safe-buffer": "^5.0.1"
      }
    },
    "jws": {
      "version": "3.2.2",
      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
      "requires": {
        "jwa": "^1.4.1",
        "safe-buffer": "^5.0.1"
      }
    },
    "lodash.includes": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
    },
    "lodash.isboolean": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
      "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
    },
    "lodash.isinteger": {
      "version": "4.0.4",
      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
      "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
    },
    "lodash.isnumber": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
      "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
    },
    "lodash.isplainobject": {
      "version": "4.0.6",
      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
    },
    "lodash.isstring": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
    },
    "lodash.once": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
    },
    "ms": {
      "version": "2.1.3",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
    },
    "safe-buffer": {
      "version": "5.2.1",
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
    },
    "semver": {
      "version": "5.7.1",
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
    }
  }
}

src/docker-compose.yml METASEP
version: '3.7'

services:
  db:
    container_name: paws-compose-db
    ports:
      - "5432:5432"
    image: postgres:13.2-alpine
    volumes:
      - postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: paws
      POSTGRES_PASSWORD: thispasswordisverysecure

  server:
    container_name: paws-compose-server
    build: ./server
    ports:
      - "5000:5000"
    depends_on:
      - db
    volumes:
      - src_archive:/app/static/raw_data

    environment:
      - FLASK_ENV=development

  client:
    build: ./client
    container_name: paws-compose-client
    ports:
      - "80:80"
    depends_on:
      - server
    environment:
      - CHOKIDAR_USEPOLLING=true
      - PAWS_API_HOST=server    # paws-compose-server
    stdin_open: true

  scheduler:
    build: ./scheduler
    container_name: paws-scheduler
    ports:
      - "6000:6000"
    depends_on:
      - server
    profiles: ["production-only"]



#using named volumes fixs a windows docker bug relating to container permissions
#https://stackoverflow.com/questions/49148754/docker-container-shuts-down-giving-data-directory-has-wrong-ownership-error-wh
volumes:
  postgres:
  src_archive:
  server_logs:

src/deploy_from_tar_docker-compose.sh METASEP
docker-compose down -v
docker-compose build
docker-compose up
src/README.md METASEP
Run the PAWS data pipeline locally
---------------------------------------
#### Run local - when debugging
- Install dependencies: `pip install -r requirements.txt`
- Run docker compose (as explained below) in order to have the postgres docker running.
- Set environment variable: `export IS_LOCAL=True`
- If your docker IP is not localhost or you want to run postgres with a different user name etc  
  - Set environment variable: `export LOCAL_DB_IP=postgresql://postgres:thispasswordisverysecure@[your_docker_ip]/postgres`
- Working directory should be: `...paws-data-pipeline/src`
- Set environment variable: `export FLASK_PORT=3333` we need it to be a different port then the one in the docker-compose
- Run python3 app.py
- Download the file `secrets.py` from the teams dropbox and place it under `src/server`.
#### Run docker - before pushing your code
- Install docker - `https://docs.docker.com/install`  

_Docker Compose instructions_  
- Install Docker Compose - `https://docs.docker.com/compose/install/`      
- Most package managers have it as `docker-compose` and it's largely just a shell script.    
- `docker-compose up -d` to bring up the application.
- Scheduler docker will not start. To run the scheduler, use profile flag `production-only` as explained in the Production Environment section.

#### Finally - Run The UI on http://localhost:80

---------------------------------------
Production Environment
---------------------------------------
- `docker-compose` should use the profile flag `production-only`. i.e: `docker-compose --profile production-only up
` and `docker-compose --profile production-only build`

TBD   

--------------------------
Troubleshooting
---------------------------------------
See the [Troubleshooting page](https://github.com/CodeForPhilly/paws-data-pipeline/wiki/Troubleshooting) at the GitHub wiki. 
src/server/rfm_funcs/test_rfm.py METASEP
# This function is meant to test the RFM create_scores.py function. 

'''
Things needed
1. Create mock data
    a. Mock data must be realistic
    b. mock data must have 5^3 possibilities for RFM score, i.e., 1 RFM score each. 
    c. Therefore we need 125 unique rows.
    d. Recency needs to have at least 5 different dates
    e. Frequency needs to have at least 5 different IDs
    f. Monetary needs to have at least 5 different amounts
    g. Each subject ID will get an RFM score. 
2. create_scores.py will accept this mock data and then generate a new RFM score
3. final step of this function will perform a jaccard similarity analysis to determine if the vectors
match where the result should be exatly 1.0

'''


src/server/rfm_funcs/rfm_functions.py METASEP
# rfm_funcs

### A number of RFM functions which are called by the main create_scores function.

# def date_difference(my_date, query_date):
#     '''
#     This function takes in a single date from the donations dataframe (per row) and compares the difference between that date and the date in which matching occurs.
#     I.e. pipeline matching should provide a query_date so that this can work.
#     '''
#     from datetime import datetime, date

#     d1 = datetime.strptime(str(my_date), "%Y-%m-%d")
#     d2 = datetime.strptime(str(query_date), "%Y-%m-%d")
#     diff = (d2 - d1)
#     return diff





def rfm_concat(days_score, frequency_score, amount_score):
    '''
    This function takes in three pandas.series columns and returns a concatenated version of each score for a total rfm score.
    Assumes that arg1 are Recency, arg2 are Frequency and arg3 are Monetary values
    arg1: pandas.series
    arg2: pandas.series
    arg3: pandas.series


    '''
    def concat(a, b, c):
        return int(f"{a}{b}{c}")

    rfm_score = list()
    for ii, jj, kk in zip(days_score, frequency_score, amount_score):
        rfm_score.append(concat(ii,jj,kk))



    return rfm_score



def merge_series(list1, list2):
    '''
    This function takes in two tuples and merges them into a list of tuples.
    '''
    merged_list = tuple(zip(list(list1), list(list2)))
    return merged_list



def create_bins_dict(recency_edges, frequency_edges, monetary_edges):
    '''
    Create_bins_dict-- creates dictionaries for each edge and label pairing
    This function takes in user defined bin edges and respective labels per each bin edge. User should
    input a list of edges and labels in corresponding order. A set of edges and bins for each score should be entered.

    e.g.
    recency_edges = np.array([0, 1., 2.,4., 10.])
    '''

    recency_dict = {}
    recency_labels = list(5,4,3,2,1)
    for ii,jj in zip(recency_labels, recency_edges):
        recency_dict["{0}".format(ii)] = jj

    frequency_dict = {}
    frequency_labels= list(1,2,3,4,5)
    for tt,kk in zip(frequency_labels, frequency_edges):
        frequency_dict["{0}".format(tt)] = kk


    monetary_dict = {}
    monetary_labels = list(1,2,3,4,5)
    for ww,hh in zip(monetary_labels, monetary_edges):
        monetary_dict["{0}".format(ww)] = hh


    return recency_dict, frequency_dict, monetary_dict

src/server/rfm_funcs/create_scores.py METASEP
from config import engine
from flask import current_app
import traceback

import pandas as pd
import numpy as np
from datetime import datetime, date
from collections import Counter
import dateutil


import structlog
logger = structlog.get_logger()

def date_difference(my_date, max_date):
    '''
    This function takes in a single date from the donations dataframe (per row) and compares the difference between that date and the date in which matching occurs.
    I.e. pipeline matching should provide a query_date so that this can work.
    '''

    d1 = datetime.strptime(str(my_date), "%Y-%m-%d")
    d2 = datetime.strptime(str(max_date), "%Y-%m-%d")
    diff = (d2 - d1)
    return diff


def create_scores():
    '''
    (used to) require query date as input-- must be string in the following format "%Y-%m-%d"
    returns a list of matching_ids and scores as tuples
    will also insert rfm scores into rfm_scores table----see src/server/api/admin_api.py
    '''
    
    # We calculate query_date below in frequncy

    with engine.connect() as connection:
        logger.debug("running create_scores()")
        # read in data from database via pull_donations_for_rfm() func (reads in as a list of tuples)
        df = pd.read_sql(
            """
            select pc.matching_id, s.amount, s.close_date 
            from salesforcedonations s 
            inner join pdp_contacts pc on pc.source_id = s.contact_id and pc.source_type = 'salesforcecontacts'
            where pc.archived_date is null order by matching_id
            """
            , connection)
        df = pd.DataFrame(df, columns=['matching_id', 'amount', 'close_date'])

        from api.admin_api import read_rfm_edges,  insert_rfm_scores  # Avoid circular import issues

        rfm_dict = read_rfm_edges()

        if len(rfm_dict) == 3:    #  r,f,m

            try:

                recency_labels = [5,4,3,2,1]
                recency_bins =   list(rfm_dict['r'].values())    #imported from table

                frequency_labels = [1,2,3,4,5]
                frequency_bins  =  list(rfm_dict['f'].values())    #imported from table

                monetary_labels = [1,2,3,4,5]
                monetary_bins =   list(rfm_dict['m'].values())      #imported from table


                ########################## recency #########################################

                donations_past_year = df
                donations_past_year['close_date'] =pd.to_datetime(donations_past_year['close_date']).dt.date

                # calculate date difference between input date and individual row close date

                days = []
                max_close_date = donations_past_year['close_date'].max()
                for ii in donations_past_year['close_date']:
                    days.append(date_difference(ii, max_close_date))
                donations_past_year['days_since'] = days

                grouped_past_year = donations_past_year.groupby('matching_id').agg({'days_since': ['min']}).reset_index()
                logger.debug(grouped_past_year.head())
            
                grouped_past_year[('days_since', 'min')]= grouped_past_year[('days_since', 'min')].dt.days

                max_maybe = grouped_past_year[('days_since', 'min')].max()

                real_max = max(max_maybe,  max(recency_bins)+1 )

                recency_bins.append(real_max)


                grouped_past_year['recency_score'] = pd.cut(grouped_past_year[('days_since','min')], bins= recency_bins, labels=recency_labels, include_lowest = True)
                grouped_past_year.rename(columns={('recency_score', ''): 'recency_score'})

                ################################## frequency ###############################

                query_date = df['close_date'].max()

                df['close_date'] = pd.DatetimeIndex(df['close_date'])

                df_grouped = df.groupby(['matching_id', pd.Grouper(key = 'close_date', freq = 'Q')]).count().max(level=0)

                df_freq =  df.loc[df['close_date'] >    pd.Timestamp(query_date) - pd.Timedelta( "365 days")  ]         #pd.DatetimeIndex(df['close_date'] - pd.Timedelta( "30 days")    )

                df_grouped = df_freq.groupby(['matching_id']).count()

                df_grouped = df_grouped.reset_index()

                frequency_bins.append(np.inf)

                df_frequency = df_grouped[['matching_id' , 'amount']] # amount is a placeholder as the groupby step just gives a frequency count, the value doesn't correspond to donation monetary amount.

                df_frequency = df_frequency.rename(columns = {'amount':'frequency'}) #renaming amount to frequency

                df_frequency['frequency_score'] = pd.cut(df_frequency['frequency'],
                                                bins = frequency_bins, labels=frequency_labels, include_lowest=False)
                
                ################################## amount ##################################

                #   Need to score people with R, M but not F as a 1

                monetary_bins.append(np.inf)

                df_amount = df.groupby(df['matching_id'], as_index=False).amount.max()

                df_amount['amount_score'] = pd.cut(df_amount['amount'], bins= monetary_bins, include_lowest=True, labels = monetary_labels)

                # raise ValueError   #  Just to test exception handling

                # Concatenate rfm scores
                    # merge monetary df and frequency df
                df_semi = df_amount.merge(df_frequency, left_on='matching_id', right_on= 'matching_id', how='left')
                logger.debug(grouped_past_year.head())
                logger.debug(df_semi.head())
                
                df_semi['frequency_score'] = df_semi['frequency_score'].fillna(1)

                df_final = df_semi.merge(grouped_past_year, left_on='matching_id', right_on= 'matching_id', how='left')        # merge monetary/frequency dfs to recency df

                # import function: rfm_concat, which will catenate integers as a string and then convert back to a single integer
                from rfm_funcs.rfm_functions import rfm_concat
                rfm_score = rfm_concat(df_final[('recency_score'), ''], df_final['frequency_score'], df_final['amount_score'])

                # Append rfm score to final df
                df_final['rfm_score'] = rfm_score

                from rfm_funcs.rfm_functions import merge_series
                score_tuples = merge_series((df_final['matching_id']), df_final['rfm_score'])

            except Exception as e:
                logger.error(e)
                trace_back_string = traceback.format_exc()
                logger.error(trace_back_string)
                return 0

            try:
                insert_rfm_scores(score_tuples)
            except Exception as e:
                logger.error(e)
                trace_back_string = traceback.format_exc()
                logger.error(trace_back_string)
                return 0

            return len(score_tuples)   # Not sure there's anything to do with them at this point

        else:   # Didn't get len == 3
            logger.error("rfm_edges missing from DB or malformed. Could not perform rfm scoring")
            return 0

src/server/rfm_funcs/create_bins.py METASEP
def create_bins(data, query_date):
    '''This script will take table data and bin edges for RFM scores for all PAWS donations

    query_date = date data was queried
    '''

    import pandas as pd
    import numpy as np
    import jenkspy
    from datetime import datetime, date
    import os



    ####
    # read in data from database as list of tuples
    df = pull_donations_for_rfm()
    df = pd.DataFrame(df, columns=['matching_id', 'amount', 'close_date'])

    donations_df['Close_Date'] =pd.to_datetime(df['Close_Date']).dt.date

    ##################################################################################
    # Calculate recency bins
    from recency_bins import recency_bins
    recency_bins, quantile_scores= recency_bins(donations_df, query_date)

    ###################################################################################
    # Calculate frequency bins
    from frequency_bins import frequency_bins

    jenks_frequency_bins, human_frequency_bins = frequency_bins(donations_df)


        def checkIfDuplicates(listOfElems):
        ''' Check if given list contains any duplicates '''
        for elem in listOfElems:
            if listOfElems.count(elem) > 1:
                return True
        return False

        duplicats_bool = checkIfDuplicates(jenks_frequency_bins)
        if duplicates_bool  == True:
            final_frequency_bins = human_frequency_bins

    ###################################################################################
    # Calculate Amount bins
    from amount_bins import amount_bins

    amount_jenks_bins, human_amount_bins = amount_bins(donations_df)



    ###################################################################################
    # Write bins to dict
    bins_dict = {}

src/server/rfm_funcs/__init__.py METASEP

src/server/pipeline/log_db.py METASEP
from datetime import datetime
import json
from sqlalchemy.sql import text
from flask import  current_app

from sqlalchemy.dialects.postgresql import insert
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, exc, select

from config import engine
import structlog
logger = structlog.get_logger()

metadata = MetaData()

ex_stat = Table("execution_status", metadata, autoload=True, autoload_with=engine)

# Alembic version bfb1262d3195

# CREATE TABLE public.execution_status (
# 	"_id" serial NOT NULL,
# 	job_id int4 NOT NULL,
# 	stage varchar(32) NOT NULL,
# 	status varchar(32) NOT NULL,
# 	details varchar(128) NOT NULL,
# 	update_stamp timestamp NOT NULL DEFAULT now(),
# 	CONSTRAINT execution_status_pkey null
# );



def log_exec_status(job_id: str, exec_stage: str, exec_status: str, job_details: str):
    """Log execution status (job_id, status, job_details) to DB """

    with engine.connect() as connection:
        ins_stmt = insert(ex_stat).values(               # Postgres-specific insert() supporting ON CONFLICT 
            job_id =  job_id,
            stage = exec_stage, 
            status = exec_status,
            details = json.dumps(job_details)
            )

        # If key already present in DB, do update instead 
        upsert = ins_stmt.on_conflict_do_update(
                constraint='uq_job_id',
                set_=dict( stage = exec_stage, status = exec_status,  details = json.dumps(job_details))
                )

        try:
            connection.execute(upsert)
        except Exception as e:
            logger.error("Insert/Update failed,  Execution status")
            logger.error(e)



src/server/pipeline/flow_script.py METASEP
import time
import traceback

from api import admin_api
from config import engine
from flask import current_app
from models import (
    ManualMatches,
    PdpContacts,
    SalesForceContacts,
    ShelterluvPeople,
    Volgistics,
)
from networkx import Graph, connected_components
from sqlalchemy import (
    Column,
    Integer,
    MetaData,
    Table,
    and_,
    delete,
    func,
    insert,
    or_,
    select,
    text,
    update,
)

from pipeline import log_db
import structlog
logger = structlog.get_logger()

def start_flow():
    start = time.time()
    job_id = admin_api.start_job()
    job_outcome = None
    trace_back_string = None

    if not job_id:
        logger.info("Failed to get job_id")
        return "busy"

    try:
        log_db.log_exec_status(job_id, "start_flow", "executing", "")

        with engine.begin() as conn:
            # Here's how we match:
            # 1. Clear pdp_contacts (the old matches).
            # 2. Go through each raw data source table (e.g. salesforcecontacts,
            #    volgistics) and copy the latest data for each contact into
            #    pdp_contacts.
            # 3. Execute a join of pdp_contacts to itself using names, emails,
            #    phone numbers, etc. to get a list of pairs of pdp_contacts ids
            #    that "match."
            # 4. Join manual_matches to pdp_contacts to get the pdp_contacts ids
            #    of our manual matches.
            #
            # Steps 3 and 4 both produce lists of pairs of ids. Next we need to
            # associate an id with each group of matches. Note that if A matches
            # B and B matches C, then A and C should get the same match id. We
            # can thus think of "matches" as edges in a graph of id vertices,
            # and match groups as connected components in that graph. So:
            #
            # 5. Load all the matches into a Graph() and compute its connected
            #    components.
            # 6. Update each row in pdp_contacts to give it a match id
            #    corresponding to its connected componenet.

            logger.debug("Clearing pdp_contacts to prepare for match")
            reset_pdp_contacts_with_unmatched(conn)

            logger.debug("Computing automatic matches")
            automatic_matches = get_automatic_matches(conn)
            logger.debug("Computing manual matches")
            manual_matches = get_manual_matches(conn)

            match_graph = Graph()
            logger.debug("Adding automatic matches to graph")
            match_graph.add_edges_from(automatic_matches)
            logger.debug("Adding manual matches to graph")
            match_graph.add_edges_from(manual_matches)
            logger.debug("Processing graph")
            match_groups = connected_components(match_graph)

            logger.debug("Updating pdp_contacts with match ids")
            update_matching_ids(match_groups, conn)

            logger.debug("Finished flow script run")
            job_outcome = "completed"
            log_db.log_exec_status(job_id, "flow", "complete", "")

    except Exception as e:
        logger.error(e)
        trace_back_string = traceback.format_exc()
        logger.error(trace_back_string)

    finally:
        if job_outcome != "completed":

            log_db.log_exec_status(job_id, "flow", "error", trace_back_string)
            logger.error(
                "Uncaught error status, setting job status to 'error' "
            )
            job_outcome = "error"
            return "error"

    logger.info(
        "Pipeline execution took %s seconds ", format(time.time() - start)
    )
    return job_outcome


def reset_pdp_contacts_with_unmatched(conn):
    conn.execute(delete(PdpContacts))
    conn.execute(SalesForceContacts.insert_into_pdp_contacts())
    conn.execute(Volgistics.insert_into_pdp_contacts())
    conn.execute(ShelterluvPeople.insert_into_pdp_contacts())


def name_to_array(n):
    delims = text("'( and | & |, | )'")
    return func.regexp_split_to_array(
        func.lower(func.translate(n, text("'\"'"), text("''"))), delims
    )


def compare_names(n1, n2):
    return name_to_array(n1).bool_op("&&")(name_to_array(n2))


def get_automatic_matches(conn):
    pc1 = PdpContacts.__table__.alias()
    pc2 = PdpContacts.__table__.alias()
    match_stmt = select(pc1.c._id, pc2.c._id).join(
        pc2,
        and_(
            or_(
                and_(
                    compare_names(pc1.c.first_name, pc2.c.first_name),
                    compare_names(pc1.c.last_name, pc2.c.last_name),
                ),
                and_(
                    compare_names(pc1.c.first_name, pc2.c.last_name),
                    compare_names(pc1.c.last_name, pc2.c.first_name),
                ),
            ),
            or_(
                func.lower(pc1.c.email) == func.lower(pc2.c.email),
                pc1.c.mobile == pc2.c.mobile,
            ),
            # This ensures we don't get e.g. every row matching itself
            pc1.c._id < pc2.c._id,
        ),
    )
    return conn.execute(match_stmt)


def get_manual_matches(conn):
    pc1 = PdpContacts.__table__.alias()
    pc2 = PdpContacts.__table__.alias()
    stmt = (
        select(pc1.c._id, pc2.c._id)
        .select_from(ManualMatches)
        .join(
            pc1,
            (ManualMatches.source_type_1 == pc1.c.source_type)
            & (ManualMatches.source_id_1 == pc1.c.source_id),
        )
        .join(
            pc2,
            (ManualMatches.source_type_2 == pc2.c.source_type)
            & (ManualMatches.source_id_2 == pc2.c.source_id),
        )
    )
    return conn.execute(stmt)


def update_matching_ids(match_groups, conn):
    # match_groups doesn't include singletons, but we should still each
    # unmatched record gets a sane matching_id (that is, its own id)
    matching_ids_by_id = {id: id for (id,) in conn.execute(select(PdpContacts._id))}
    for match_group in match_groups:
        matching_id = min(match_group)
        for id in match_group:
            matching_ids_by_id[id] = matching_id

    # Load all the new id/matching-id pairs into a temp table so that we can do
    # a fast UPDATE FROM to set all the matching ids in pdp_contacts
    temp_table = Table(
        "_tmp_matching_id_update",
        MetaData(),  # this is a temp table, we don't want to affect our knowledge of "real" tables
        Column("_id", Integer, primary_key=True),
        Column("matching_id", Integer),
        prefixes=["TEMPORARY"],
        postgresql_on_commit="DROP",
    )
    temp_table.create(conn)
    conn.execute(
        insert(temp_table),
        [
            {"_id": _id, "matching_id": matching_id}
            for (_id, matching_id) in matching_ids_by_id.items()
        ],
    )
    conn.execute(
        update(PdpContacts)
        .where(PdpContacts._id == temp_table.c._id)
        .values(matching_id=temp_table.c.matching_id)
    )

src/server/pipeline/__init__.py METASEP

src/server/db_setup/base_users.py METASEP
from config import engine
from api import user_api
import sqlalchemy as sa
import os

import structlog
logger = structlog.get_logger()


try:   
    from secrets_dict import BASEUSER_PW, BASEEDITOR_PW, BASEADMIN_PW
except ImportError:   
    # Not running locally
    logger.debug("Couldn't get BASE user PWs from file, trying environment **********")
    from os import environ

    try:
        BASEUSER_PW = environ['BASEUSER_PW']
        BASEEDITOR_PW = environ['BASEEDITOR_PW']
        BASEADMIN_PW = environ['BASEADMIN_PW']

    except KeyError:
        # Nor in environment
        # You're SOL for now
        logger.error("Couldn't get secrets from file or environment")





from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey

metadata = sa.MetaData()


def create_base_roles():
    with engine.connect() as connection:
        result = connection.execute("select role from pdp_user_roles")
        role_count = len(result.fetchall())
        if role_count == 0:
            connection.execute("INSERT into pdp_user_roles  values (1, 'user') ")
            connection.execute("INSERT into pdp_user_roles  values (2, 'editor') ")
            connection.execute("INSERT into pdp_user_roles  values (9, 'admin') ")

        else:
            logger.debug("%d roles already present in DB, not creating", role_count)


def create_base_users():  # TODO: Just call create_user for each
    """ Creates three users (user, editor, admin) for testing
        Password for each is user name with 'pw' appended """
    with engine.connect() as connection:

        result = connection.execute("select user from pdp_users")
        user_count = len(result.fetchall())
        if user_count == 0:

            logger.debug("Creating base users")

            pu = sa.Table("pdp_users", metadata, autoload=True, autoload_with=engine)

            # user
            pw_hash = user_api.hash_password(BASEUSER_PW)
            ins_stmt = pu.insert().values(
                username="base_user", full_name="Base User", password=pw_hash, active="Y", role=1,
            )
            connection.execute(ins_stmt)

            # INactive user
            # Reuse pw hash
            ins_stmt = pu.insert().values(
                username="base_user_inact", full_name="Inactive User", password=pw_hash, active="N", role=1,
            )
            connection.execute(ins_stmt)

            # editor
            pw_hash = user_api.hash_password(BASEEDITOR_PW)
            ins_stmt = pu.insert().values(
                username="base_editor", full_name="Base Editor", password=pw_hash, active="Y", role=2,
            )
            connection.execute(ins_stmt)

            # admin
            pw_hash = user_api.hash_password(BASEADMIN_PW)
            ins_stmt = pu.insert().values(
                username="base_admin", full_name="Base Admin", password=pw_hash, active="Y", role=9,
            )
            connection.execute(ins_stmt)

        else:
            logger.debug("%d users already present in DB, not creating", user_count)


def populate_rfm_mapping_table(overwrite=False):
    """Populate the rfm_mapping table if empty or overwrite is True."""

    with engine.connect() as connection:

        def table_empty():
            result = connection.execute("select count(*) from rfm_mapping;")
            row_count = result.fetchone()[0]
            return row_count == 0


        if overwrite or table_empty():
            logger.debug("Populating rfm_mapping table")

            if not table_empty():
                logger.debug("'overwrite=True', truncating rfm_mapping table")
                connection.execute("TRUNCATE TABLE rfm_mapping;")


            if os.path.exists('server'):    # running locally
                file_path = os.path.normpath('server/alembic/populate_rfm_mapping.sql')

            elif os.path.exists('alembic'):  # running on Docker
                file_path = os.path.normpath('alembic/populate_rfm_mapping.sql')

            else:                 #
                logger.error("ERROR: Can't find a path to populate script!!!!!! CWD is %s", os.getcwd())
                return



            logger.debug("Loading sql script at " + file_path)

            f = open(file_path)
            populate_query = f.read()
            f.close()

            result = connection.execute(populate_query)

            if table_empty():
                logger.error("ERROR:        rfm_mapping table WAS NOT POPULATED")

        else:
            logger.debug("rfm_mapping table already populated; overwrite not True so not changing.")

    return


def populate_sl_event_types():
    """If not present, insert values for shelterluv animal event types."""
    with engine.connect() as connection:
        result = connection.execute("select id from sl_event_types")
        type_count = len(result.fetchall())
        if type_count == 0:
            print("Inserting SL event types")
            connection.execute("""INSERT into sl_event_types values 
                                (1, 'Outcome.Adoption'),
                                (2, 'Outcome.Foster'),
                                (3, 'Outcome.ReturnToOwner'),
                                (4, 'Intake.AdoptionReturn'),
                                (5, 'Intake.FosterReturn'); """)                                     
        else:
            logger.debug("%d event types already present in DB, not creating", type_count)

src/server/db_setup/__init__.py METASEP

src/server/api/user_api.py METASEP
from hashlib import pbkdf2_hmac
from os import urandom, environ
import pytest, codecs, random
from datetime import datetime

from api.api import user_api
from sqlalchemy.sql import text
from config import engine
from flask import request, redirect, jsonify, current_app, abort, json

from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, exc, select

from api import jwt_ops

import structlog
logger = structlog.get_logger()


metadata = MetaData()

# Salt for hashing storing passwords
SALT_LENGTH = 32


# Keep a journal of user activity
def log_user_action(user, event_class, detail):
    """ Write log entry to db """

    puj = Table("pdp_user_journal", metadata, autoload=True, autoload_with=engine)

    with engine.connect() as connection:
        ins_stmt = puj.insert().values(username=user, event_type=event_class, detail=detail)

        try:
            connection.execute(ins_stmt)
        except Exception as e:
            logger.error(e)

def password_is_strong(password):
    """ Check plain-text password against strength rules."""

    def has_digit(test_string):
        """Test if any character is a digit."""
        for c in test_string:
            if c.isdigit():
                return True
        return False

    def has_alpha(test_string):
        """Test if any character is  alphabetic."""
        for c in test_string:
            if c.isalpha():
                return True
        return False

    if (len(password) > 11   
        # and has_alpha(password) 
        # and has_digit(password)
         ):
        return True
    
    else:
        return False


def hash_password(password):
    """ Generate salt+hash for storing in db"""
    salt = urandom(SALT_LENGTH)
    hash = pbkdf2_hmac("sha512", bytes(password, "utf8"), salt, 500000)
    hash_for_db = salt + hash
    return hash_for_db


def check_password(password, salty_hash):
    """Check presented cleartext password against DB-type salt+hash, return True if they match"""
    salt = salty_hash[0:SALT_LENGTH]
    hash = salty_hash[SALT_LENGTH:]
    # Use salt from db to hash what user gave us
    pw_bytes = bytes(password, "utf8")
    hash_of_presented = pbkdf2_hmac("sha512", pw_bytes, salt, 500000)
    return hash.hex() == hash_of_presented.hex()


###     No authorization required              ############################


@user_api.route("/api/user/test", methods=["GET"])
def user_test():
    """ Liveness test, does not require JWT """
    logger.debug("/api/user/test")
    return jsonify(("OK from User Test  @ " + str(datetime.now())))


@user_api.route("/api/user/test_log", methods=["GET"])
def user_test_log_error():
    """Does not require JWT  - see various log levels"""

    logger.debug("debug: /api/user/test_log_error")        
    logger.info("info: /api/user/test_log_error")    
    logger.warn("warn: /api/user/test_log_error")
    logger.error("error: /api/user/test_log_error")
    logger.critical("critical: /api/user/test_log_error")
    return jsonify(("Generated log entries as various levals  @ " + str(datetime.now())))




@user_api.route("/api/user/test_fail", methods=["GET"])
def user_test_fail():
    """ Liveness test, always fails with 401"""
    return jsonify("Here's your failure"), 401


@user_api.route("/api/user/timeout/<int:new_timeout>", methods=["GET"])
def user_override_timeout(new_timeout):
    """ Override JWT expiration setting for testing.
        Allows a value up to JWT_MAX_TIMEOUT (from app.py).
        This will affect, of course, only future tokens.
    """  
    if (new_timeout > current_app.config["JWT_MAX_TIMEOUT"] ) : 
        new_timeout = current_app.config["JWT_MAX_TIMEOUT"]
    current_app.config["JWT_ACCESS_TOKEN_EXPIRES"] = new_timeout
    return jsonify("Timeout set to " + str(new_timeout) + " seconds"), 200


@user_api.route("/api/user/login", methods=["POST"])
def user_login():
    """ Validate user in db, return JWT if legit and active.
        Expects json-encoded form data {"username" :, "password": }
    """

    def dummy_check():
        """Perform a fake password hash check to take as much time as a real one."""
        pw_bytes = bytes('password', "utf8")
        check_password('password', pw_bytes)

    try:
        post_dict = json.loads(request.data)
        username = post_dict["username"]
        presentedpw = post_dict["password"]
    except:
        dummy_check()    # Take the same time as with well-formed requests 
        return jsonify("Bad credentials"), 401

    if not (isinstance(username, str) and isinstance(presentedpw, str) ):
        dummy_check()  # Take the same time as with well-formed requests 
        return jsonify("Bad credentials"), 401   # Don't give us ints, arrays, etc.


    with engine.connect() as connection:

        pwhash = None
        s = text(
            """select password, pdp_user_roles.role, active 
                from pdp_users 
                left join pdp_user_roles on pdp_users.role = pdp_user_roles._id 
                where username=:u """
        )
        s = s.bindparams(u=username)
        result = connection.execute(s)

        if result.rowcount:  # Did we get a match on username?
            pwhash, role, is_active = result.fetchone()
        else:
            log_user_action(username, "Failure", "Invalid username")
            dummy_check()
            return jsonify("Bad credentials"), 401

        if is_active.lower() == "y" and check_password(presentedpw, pwhash):
            # Yes, user is active and password matches
            token = jwt_ops.create_token(username, role)
            log_user_action(username, "Success", "Logged in")
            return token

        else:
            log_user_action(username, "Failure", "Bad password or inactive")
            # No dummy_check needed as we ran a real one to get here
            return jsonify("Bad credentials"), 401


###    Unexpired JWT required               ############################


@user_api.route("/api/user/test_auth", methods=["GET"])
@jwt_ops.jwt_required()
def user_test_auth():
    """ Liveness test, requires JWT """
    sysname = '?'    # Ensure we are talking to the expected host
    try:
        sysname = environ['computername'] 
    except:
        pass
    
    try:
        sysname =  environ['HOSTNAME']
    except:
        pass


    return jsonify(("OK from User Test - Auth [" + sysname + "] @" + str(datetime.now())))


# Logout is not strictly needed; client can just delete JWT, but good for logging
@user_api.route("/api/user/logout", methods=["POST"])
@jwt_ops.jwt_required()
def user_logout():
    
    user_name = ''

    old_jwt = jwt_ops.validate_decode_jwt()   

    # If token bad, should be handled & error message sent by jwt_required() and we won't get here
    if old_jwt:
        user_name = old_jwt['sub']
    
    # Log the request
    log_user_action(user_name, "Success", "Logged out")
    return jsonify("Logged out")


# Generate a new access token 

@user_api.route("/api/user/refresh", methods=["GET"])
@jwt_ops.jwt_required()
def user_refresh():
    """ If user still active, send back an access_token with a new expiration stamp """
    old_jwt = jwt_ops.validate_decode_jwt()   

    # If token bad, should be handled & error message sent by jwt_required() and we won't get here
    if old_jwt:
        user_name = old_jwt['sub']
        with engine.connect() as connection:

            s = text( """select active from pdp_users where username=:u """ )
            s = s.bindparams(u=user_name)
            result = connection.execute(s)

            if result.rowcount:  # Did we get a match on username?
                is_active = result.fetchone()
            else:
                log_user_action(user_name, "Failure", "Valid JWT presented for refesh attempt on unknown username")
                return jsonify("Bad credentials"), 401

            if is_active[0].lower() == 'y':    # In the user DB and still Active?
                token = jwt_ops.create_token(user_name,old_jwt['role'])
                log_user_action(user_name, "Success", "Refreshed token")
                return token

    else:
        return jsonify("Bad credentials"), 401



###    Unexpired *Admin* JWT  required      ############################


@user_api.route("/api/admin/user/create", methods=["POST"])
@jwt_ops.admin_required
def user_create():
    """Create user record 
    
    Requires admin role  

    Form POST JSON Parameters  
    ----------
    username : str  
    full_name : str  
    password : str  
    role : str, one of `user`, `editor`, `admin`  

    Returns    
    ----------
    User created: 201 + username  
    Invalid role: 422 + "Bad role"  
    Duplicate user: 409 +  DB error  

    """

    try:
        post_dict = json.loads(request.data)
        new_user = post_dict["username"]
        fullname = post_dict["full_name"]
        userpw = post_dict["password"]
        user_role = post_dict["role"]
    except:
        return jsonify("Missing one or more parameters"), 400


    requesting_user = jwt_ops.validate_decode_jwt()['sub'] 

    pw_hash = hash_password(userpw)

    pu = Table("pdp_users", metadata, autoload=True, autoload_with=engine)
    pr = Table("pdp_user_roles", metadata, autoload=True, autoload_with=engine)

    with engine.connect() as connection:

        # Build dict of roles
        role_dict = {}
        r = select((pr.c.role, pr.c._id))
        rr = connection.execute(r)
        fa = rr.fetchall()
        for row in fa:
            role_dict[row[0]] = row[1]  # TODO: possible to do directly in sa?

        try:
            role_val = role_dict[user_role]
        except KeyError as e:
            logger.error("Role not found %s", e)
            log_user_action(
                requesting_user,
                "Failure",
                "Bad role (" + user_role + ") in user_create for " + new_user,
            )
            return jsonify("Bad role"), 422

        ins_stmt = pu.insert().values(
            # _id=default,
            username=new_user,
            password=pw_hash,
            full_name=fullname,
            active="Y",
            role=role_val,
        )

        try:
            connection.execute(ins_stmt)
        except exc.IntegrityError as e:  # Uniqueness violation
            return jsonify(e.orig.pgerror), 409

    # if created, 201
    log_user_action(
        requesting_user, "Success", "Created user " + new_user + " with role: " + user_role,
    )
    return jsonify(new_user), 201


@user_api.route("/api/admin/user/get_user_count", methods=["GET"])
@jwt_ops.admin_required
def get_user_count():
    """Return number of records in pdp_users table """
    with engine.connect() as connection:
        s = text("select count(user) from pdp_users;")
        result = connection.execute(s)
        user_count = result.fetchone()
        return jsonify(user_count[0])


@user_api.route("/api/admin/user/check_name", methods=["POST"])
@jwt_ops.admin_required
def check_username():
    """Return 1 if username exists already, else 0."""

    try:
        post_dict = json.loads(request.data)
        test_username = post_dict["username"]
    except:
        return jsonify("Missing username"), 400

    with engine.connect() as connection:

        s = text( """select count(username)  from pdp_users where username=:u """ )
        s = s.bindparams(u=test_username)
        result = connection.execute(s)

        if result.rowcount:  # As we're doing a count() we *should* get a result
            user_exists = result.fetchone()[0]
        else:
            log_user_action(test_username, "Failure", "Error when checking username")
            return jsonify("Error checking username"), 500

        return jsonify(user_exists)

@user_api.route("/api/admin/user/update", methods=["POST"])
@jwt_ops.admin_required  
def user_update():
    """Update existing user record 
    """
  
   
    try:
        post_dict = json.loads(request.data)
        username = post_dict["username"]
    except:
        return jsonify("Must specify username"), 400

    update_dict = {}

    # Need to be a bit defensive here & select what we want instead of taking what we're given
    for key in ["full_name", "active", "role", "password"]: 
        try:
            val = post_dict[key]
            update_dict[key] = val
        except:
            pass

    
    if not update_dict:
        logger.debug("Update called with nothing to update")
        return jsonify("No changed items specified")  # If nothing to do, declare victory

    if "password" in update_dict.keys():

        if password_is_strong(update_dict['password']):
            update_dict['password'] = hash_password(update_dict['password'])
        else:
            return jsonify("Password too weak") 


    #  We have a variable number of columns to update.
    #  We could generate a text query on the fly, but this seems the perfect place to use the ORM  
    #  and let it handle the update for us. 

    from sqlalchemy import update
    from sqlalchemy.orm import Session, sessionmaker

    Session = sessionmaker(engine)

    session =  Session()   
   # #TODO: Figure out why context manager doesn't work or do try/finally

    pr = Table("pdp_user_roles", metadata, autoload=True, autoload_with=engine)

    if ("role" in update_dict.keys()):  # We are changing the role

        # Build dict of roles {name: id}
        role_dict = {}
        r = select((pr.c.role, pr.c._id))
        rr = session.execute(r)
        fa = rr.fetchall()
        for row in fa:
            role_dict[row[0]] = row[1] 

        logger.debug("Found %d roles", len(role_dict))
        # Replace the role name with the corresponding id for update
        try:
            # We could verify that the role is actually different - doesn't seem worth the effort
            update_dict["role"] = role_dict[update_dict["role"]]
        except KeyError:
            logger.error("Attempted to change user '%s' to invalid role '%s'", username, update_dict["role"])
            session.close()
            return jsonify("Invalid role specified"), 400

    PU = Table("pdp_users", metadata, autoload=True, autoload_with=engine)

    stmt = update(PU).where(PU.columns.username == username).values(update_dict).\
        execution_options(synchronize_session="fetch")

    result = session.execute(stmt)

    session.commit()
    session.close()

    return jsonify("Updated")


@user_api.route("/api/admin/user/get_users", methods=["GET"])
@jwt_ops.admin_required
def user_get_list():
    """Return list of users"""

    with engine.connect() as connection:

        s = text(
            """ select username, full_name, active, pr.role
            from pdp_users as pu 
            left join pdp_user_roles as pr on pu.role = pr._id
            order by username """
        )
        result = connection.execute(s)

        query_result_json = [dict(row) for row in result]

    return jsonify(query_result_json), 200

@user_api.route("/api/admin/user/get_info/<string:username>", methods=["GET"])
@jwt_ops.admin_required  
def user_get_info(username):
    """Return info on a specified user"""

    with engine.connect() as connection:

        s = text(
            """ select username, full_name, active, pr.role
            from pdp_users as pu 
            left join pdp_user_roles as pr on pu.role = pr._id
            where username=:u
            """
        )
        s = s.bindparams(u=username)
        result = connection.execute(s)
        
        if result.rowcount:  
            user_row = result.fetchone()
        else:
            log_user_action(username, "Failure", "Error when getting user info")
            return jsonify("Username not found"), 400

    return jsonify( dict(zip(result.keys(), user_row)) ), 200
src/server/api/jwt_ops.py METASEP
from functools import wraps
from flask import Flask, jsonify, request, current_app
from flask_jwt_extended import (
    JWTManager,
    jwt_required,
    create_access_token,
    get_jwt_identity,
    verify_jwt_in_request,
    get_jwt
   
)

from app import app, jwt

# Wraps funcs to require admin role to execute
def admin_required(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        verify_jwt_in_request()
        claims = get_jwt()
        if claims["role"] != "admin":  
            return jsonify(msg="Admins only!"), 403
        else:
            return fn(*args, **kwargs)

    return wrapper

def create_token(username, accesslevel):
    """ Create a JWT *access* token for the specified user ('sub:') and role ('role:'). 
    """
    # Identity can be any data that is json serializable, we just use username
    addl_claims = {'role': accesslevel}
    new_token = create_access_token(identity=username, additional_claims=addl_claims)
    return jsonify(access_token=new_token)


def validate_decode_jwt():
    """ If valid, return jwt fields as a dictionary, else None """
    jwtdict = None
    try:
        jwtdict =  verify_jwt_in_request()[1]
    except:
        pass   # Wasn't valid - either expired or failed validation 

    return jwtdict

src/server/api/internal_api.py METASEP
from datetime import datetime

import structlog
from flask import jsonify

from api.API_ingest import ingest_sources_from_api, salesforce_contacts
from api.api import internal_api
from rfm_funcs.create_scores import create_scores
from api.API_ingest import updated_data

logger = structlog.get_logger()

###   Internal API endpoints can only be accessed from inside the cluster;
###   they are blocked by location rule in NGINX config


# Verify that this can only be accessed from within cluster
@internal_api.route("/api/internal/test", methods=["GET"])
def user_test():
    """ Liveness test, does not require JWT """
    return jsonify(("OK from INTERNAL Test  @ " + str(datetime.now())))


@internal_api.route("/api/internal/test/test", methods=["GET"])
def user_test2():
    """ Liveness test, does not require JWT """
    return jsonify(("OK from INTERNAL test/test  @ " + str(datetime.now())))


@internal_api.route("/api/internal/ingestRawData", methods=["GET"])
def ingest_raw_data():
    try:
        ingest_sources_from_api.start()
    except Exception as e:
        logger.error(e)

    return jsonify({'outcome': 'OK'}), 200


@internal_api.route("/api/internal/create_scores", methods=["GET"])
def hit_create_scores():
    logger.info("Hitting create_scores() ")
    tuple_count = create_scores()
    logger.info("create_scores()  processed %s scores",  str(tuple_count) )
    return jsonify(200)


@internal_api.route("/api/internal/get_updated_data", methods=["GET"])
def get_contact_data():
    logger.debug("Calling  get_updated_contact_data()")
    contact_json =  updated_data.get_updated_contact_data()
    logger.debug("Returning %d contact records",  len(contact_json) )
    return jsonify(contact_json), 200

src/server/api/file_uploader.py METASEP
import pandas as pd
from config import engine
from donations_importer import validate_import_sfd
from flask import current_app
from models import ManualMatches, SalesForceContacts, ShelterluvPeople, Volgistics
from shifts_importer import validate_import_vs
from werkzeug.utils import secure_filename

import structlog
logger = structlog.get_logger()

SUCCESS_MSG = "Uploaded Successfully!"


def validate_and_arrange_upload(file):
    logger.info("Start uploading file: %s  ", file.filename)
    filename = secure_filename(file.filename)
    file_extension = filename.rpartition(".")[2]
    with engine.begin() as conn:
        determine_upload_type(file, file_extension, conn)


def determine_upload_type(file, file_extension, conn):
    # Yes, this method of discovering what kind of file we have by looking at
    # the extension and columns is silly. We'd like to get more of our data from
    # automatically pulling from vendor APIs directly, in which case we'd know
    # what kind of data we had.
    if file_extension == "csv":
        logger.debug("File extension is CSV")
        df = pd.read_csv(file, dtype="string")

        if {"salesforcecontacts", "volgistics", "shelterluvpeople"}.issubset(df.columns):
            logger.debug("File appears to be salesforcecontacts, volgistics, or shelterluvpeople (manual)")
            ManualMatches.insert_from_df(df, conn)
            return
        elif {"Animal_ids", "Internal-ID"}.issubset(df.columns):
            logger.debug("File appears to be shelterluvpeople")
            ShelterluvPeople.insert_from_df(df, conn)
            return

    if file_extension == "xlsx":
        excel_file = pd.ExcelFile(file)
        if {"Master", "Service"}.issubset(excel_file.sheet_names):
            logger.debug("File appears to be Volgistics")
            # Volgistics
            validate_import_vs(file, conn)
            Volgistics.insert_from_file(excel_file, conn)
            return

        df = pd.read_excel(excel_file)
        if "Contact ID 18" in df.columns:
            # Salesforce something-or-other
            if "Amount" in df.columns:
                # Salesforce donations
                logger.debug("File appears to be Salesforce donations")
                validate_import_sfd(file, conn)
                return
            else:
                # Salesforce contacts
                logger.debug("File appears to be Salesforce contacts")
                SalesForceContacts.insert_from_file_df(df, conn)
                return

    logger.error("Don't know how to process file: %s",  file.filename)
src/server/api/fake_data.py METASEP
""" Fake data that can be returned when an API token is missing for local
    development, or for running pytest

    Shelterluv Data contains:
        Matched: Animal & Event End point
"""

shelterluv_data = {
    'animals': {
        "animal_details": {
            '12345': {
                "Age": 24,
                "DOBUnixTime": 1568480456,
                "Name": "Lola aka Fake Cat",
                "Type": "Cat",
                "Photos":
                ["https://images.unsplash.com/photo-1456926631375-92c8ce872def?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8OHx8YW5pbWFsfGVufDB8fDB8fA%3D%3D&w=1000&q=80"],
                "Status": "Healthy In Home",
            },
        },
        "person_details": {
            "shelterluv_short_id": 2,
        },
    },
    'events': {
        '12345':[
            {
            'AssociatedRecords': [
                {'Id': 12345, 'Type': 'Animal' },
                {'Id': 12345, 'Type': 'Person'},
            ],
            'Subtype': 'Foster Home',
            'Time': '1602694822',
            'Type': 'Outcome.Adoption',
            'User': 'Fake User',
            },
        ]
    },
}


def sl_mock_data(end_point: str)-> dict:
    """ Shelterluv mock data.
        Takes the end_point as a str of `animals` or `events` and  returns
        a dict representing a test data for that end_point.
    """

    return shelterluv_data.get(end_point)

src/server/api/common_api.py METASEP
from api.api import common_api
from config import engine
from flask import jsonify , current_app
from sqlalchemy.sql import text
import requests
import time
from datetime import datetime

import structlog
logger = structlog.get_logger()


from api.fake_data import sl_mock_data

try:
    from secrets_dict import SHELTERLUV_SECRET_TOKEN
except ImportError:
    # Not running locally
    logger.debug("Couldn't get SHELTERLUV_SECRET_TOKEN from file, trying environment **********")
    from os import getenv

    SHELTERLUV_SECRET_TOKEN = getenv('SHELTERLUV_SECRET_TOKEN')
    if not SHELTERLUV_SECRET_TOKEN:
        logger.warn("Couldn't get secrets from file or environment - defaulting to Fake Data")

from api import jwt_ops

@common_api.route('/api/timeout_test/<duration>', methods=['GET'])
def get_timeout(duration):
    start = datetime.now().strftime("%H:%M:%S");
    time.sleep(int(duration))

    stop = datetime.now().strftime("%H:%M:%S");
    results = jsonify({'result': 'success', 'duration': duration, 'start': start, 'stop': stop})

    return results

@common_api.route('/api/contacts/<search_text>', methods=['GET'])
@jwt_ops.jwt_required()
def get_contacts(search_text):
    with engine.connect() as connection:
        search_text = search_text.lower()

        names = search_text.split(" ")
        if len(names) == 2:
            query = text("""select pdp_contacts.*, rfm_scores.rfm_score, rfm_label, rfm_color, rfm_text_color
                            from pdp_contacts 
                            left join rfm_scores on rfm_scores.matching_id = pdp_contacts.matching_id
                            left join rfm_mapping on rfm_mapping.rfm_value = rfm_scores.rfm_score
                            where archived_date is null AND ( (lower(first_name) like lower(:name1) and lower(last_name) like lower(:name2)) 
                                OR (lower(first_name) like lower(:name2) and lower(last_name) like lower(:name1)) )
                            order by lower(last_name), lower(first_name)""")
            query_result = connection.execute(query, name1='{}%'.format(names[0]), name2='{}%'.format(names[1]))
        elif len(names) == 1:
            query = text("""select pdp_contacts.*, rfm_scores.rfm_score, rfm_label, rfm_color, rfm_text_color
                            from pdp_contacts 
                            left join rfm_scores on rfm_scores.matching_id = pdp_contacts.matching_id
                            left join rfm_mapping on rfm_mapping.rfm_value = rfm_scores.rfm_score
                            where archived_date is null AND ( lower(first_name) like lower(:search_text) 
                                OR lower(last_name) like lower(:search_text) )
                            order by lower(last_name), lower(first_name)""")
            query_result = connection.execute(query, search_text='{}%'.format(search_text))

        query_result_json = [dict(row) for row in query_result]

        results = jsonify({'result': query_result_json})

        return results


@common_api.route('/api/rfm/<label>/<limit>', methods=['GET'])
@common_api.route('/api/rfm/<label>', methods=['GET'])
@jwt_ops.jwt_required()
def get_rfm(label, limit=None):
    with engine.connect() as connection:
        query_string = """select pdp_contacts.*, rfm_scores.rfm_score, rfm_label, rfm_color, rfm_text_color
                                    from pdp_contacts 
                                    left join rfm_scores on rfm_scores.matching_id = pdp_contacts.matching_id
                                    left join rfm_mapping on rfm_mapping.rfm_value = rfm_scores.rfm_score
                                    where archived_date is null AND rfm_label like :label
                                    and source_type = 'salesforcecontacts'
                                    order by lower(last_name), lower(first_name)"""

        if limit:
            query = text(query_string + " limit :limit")
            query_result = connection.execute(query, label='{}%'.format(label), limit=limit)

        else:
            query = text(query_string)
            query_result = connection.execute(query, label='{}%'.format(label))

        query_result_json = [dict(row) for row in query_result]

        results = jsonify({'result': query_result_json})

        return results


@common_api.route('/api/rfm/labels', methods=['GET'])
@jwt_ops.jwt_required()
def get_rfm_labels():
    with engine.connect() as connection:
        query = text("""select rfm_label, rfm_text_color, rfm_color, count(rfm_value) from rfm_scores left join rfm_mapping on rfm_mapping.rfm_value = rfm_scores.rfm_score 
group by rfm_label, rfm_text_color, rfm_color;""")

        query_result = connection.execute(query)

        query_result_json = [dict(row) for row in query_result]

        results = jsonify({'result': query_result_json})

        return results


@common_api.route('/api/360/<matching_id>', methods=['GET'])
@jwt_ops.jwt_required()
def get_360(matching_id):
    result = {}

    with engine.connect() as connection:
        query = text("""select pdp_contacts.*, rfm_scores.rfm_score, rfm_label, rfm_color, rfm_text_color
                        from pdp_contacts 
                        left join rfm_scores on rfm_scores.matching_id = pdp_contacts.matching_id
                        left join rfm_mapping on rfm_mapping.rfm_value = rfm_scores.rfm_score
                        where pdp_contacts.matching_id = :matching_id and archived_date is null""")
        query_result = connection.execute(query, matching_id=matching_id)

        result["contact_details"] = [dict(row) for row in query_result]

        for row in result["contact_details"]:
            if row["source_type"] == "salesforcecontacts":
                donations_query = text("""select cast (close_date as text), cast (amount as float), donation_type,  primary_campaign_source 
                                        from salesforcedonations
                                        where contact_id = :salesforcecontacts_id""")
                salesforce_contacts_query_result = connection.execute(donations_query,
                                                                      salesforcecontacts_id=row["source_id"])
                salesforce_donations_results = [dict(row) for row in salesforce_contacts_query_result]
                if len(salesforce_donations_results):
                    if not 'donations' in result:
                        result['donations'] = salesforce_donations_results
                    else:
                        result['donations'].append(salesforce_donations_results)

            if row["source_type"] == "volgistics":

                # Shifts data
                shifts_query = text("""select volg_id, assignment, site, from_date, cast(hours as float) 
                                        from volgisticsshifts where volg_id = :volgistics_id
                                        order by from_date desc
                                        limit 5""")
                volgistics_shifts_query_result = connection.execute(shifts_query, volgistics_id=row["source_id"])
                volgisticsshifts_results = []

                for r in volgistics_shifts_query_result:
                    shifts = dict(r)
                    volgisticsshifts_results.append(shifts)

                result['shifts'] = volgisticsshifts_results

                # Volunteer activity
                query_text =  """
                with activity as 
                    (select from_date, hours from volgisticsshifts where volg_id = :volgistics_id),
                alltime as 
                    (select min(from_date) as start_date, sum(hours) as life_hours from activity),
                ytd as 
                    (select sum(hours) as ytd_hours from activity where extract(year from from_date) = extract(year from current_date))
                
                select cast(start_date as text), cast(life_hours as float), cast(ytd_hours as float) from alltime, ytd;
                """
                hours_query = text(query_text)
                hours_query_result = connection.execute(hours_query, volgistics_id=row["source_id"])
                result['activity'] = [dict(row) for row in hours_query_result]

            if row["source_type"] == "shelterluvpeople":
                shelterluv_id = row["source_id"]
                result["shelterluv_id"] = shelterluv_id

    return jsonify({'result': result})

@common_api.route('/api/person/<matching_id>/animals', methods=['GET'])
@jwt_ops.jwt_required()
def get_animals(matching_id):
    result = {
        "person_details": {},
        "animal_details": {}
    }

    if not SHELTERLUV_SECRET_TOKEN:
        return jsonify(sl_mock_data('animals'))

    with engine.connect() as connection:
        query = text("select * from pdp_contacts where matching_id = :matching_id and source_type = 'shelterluvpeople' and archived_date is null")
        query_result = connection.execute(query, matching_id=matching_id)
        rows = [dict(row) for row in query_result]
        if len(rows) > 0:
            for row in rows:               
                shelterluv_id = row["source_id"]
                person_url = f"http://shelterluv.com/api/v1/people/{shelterluv_id}"
                person_details = requests.get(person_url, headers={"x-api-key": SHELTERLUV_SECRET_TOKEN}).json()
                if "ID" in person_details:
                    result["person_details"]["shelterluv_short_id"] = person_details["ID"]
                    animal_ids = person_details["Animal_ids"]
                    for animal_id in animal_ids:
                        animal_url = f"http://shelterluv.com/api/v1/animals/{animal_id}"
                        animal_details = requests.get(animal_url, headers={"x-api-key": SHELTERLUV_SECRET_TOKEN}).json()
                        result["animal_details"][animal_id] = animal_details

    return result


@common_api.route('/api/person/<matching_id>/animal/<animal_id>/events', methods=['GET'])
@jwt_ops.jwt_required()
def get_person_animal_events(matching_id, animal_id):
    result = {}
    events = []

    if not SHELTERLUV_SECRET_TOKEN:
        return jsonify(sl_mock_data('events'))

    with engine.connect() as connection:
        query = text("select * from pdp_contacts where matching_id = :matching_id and source_type = 'shelterluvpeople' and archived_date is null")
        query_result = connection.execute(query, matching_id=matching_id)
        rows = [dict(row) for row in query_result]
        if len(rows) > 0:
            row = rows[0]
            shelterluv_id = row["source_id"]
            animal_url = f"http://shelterluv.com/api/v1/animals/{animal_id}/events"
            event_details = requests.get(animal_url, headers={"x-api-key": SHELTERLUV_SECRET_TOKEN}).json()
            for event in event_details["events"]:
                for record in event["AssociatedRecords"]:
                    if record["Type"] == "Person" and record["Id"] == shelterluv_id:
                        events.append(event)
            result[animal_id] = events

    return result

@common_api.route('/api/person/<matching_id>/support', methods=['GET'])
@jwt_ops.jwt_required()
def get_support_oview(matching_id):
    """Return these values for the specified match_id:
        largest gift, date for first donation, total giving, number of gifts,
        amount of first gift, is recurring donor 
        
        If consuming this, check number_of_gifts first. If 0, there's no more data
        available, so don't try to read any other fields - they may not exist.
        """

    # One complication: a single match_id can map to multiple SF ids, so these queries need to 
    # run on a list of of contact_ids.

    # First: get the list of salsforce contact_ids associated with the matching_id  
    qcids = text("select source_id FROM pdp_contacts where matching_id = :matching_id and source_type = 'salesforcecontacts';")

    oview_fields = {}

    with engine.connect() as connection:
        query_result = connection.execute(qcids, matching_id=matching_id)
        rows = [dict(row) for row in query_result]

        id_list = []

        if len(rows) > 0:
            for row in rows:
                if row['source_id'].isalnum():
                    id_list.append(row['source_id'])
                else:
                    logger.warn("salesforcecontacts source_id %s has non-alphanumeric characters; will not be used",  str(row['source_id']))

            if len(id_list) == 0: # No ids to query
                oview_fields['number_of_gifts'] = 0    # Marker for no support data
                return jsonify(oview_fields)


            sov1 = text("""SELECT 
                            max(amount) as largest_gift, 
                            min(close_date) as first_donation_date,
                            sum(amount) as total_giving,
                            count(amount) as number_of_gifts
                        FROM
                            salesforcedonations as sfd
                        WHERE
                            contact_id  IN  :id_list  ; """)

            sov1 = sov1.bindparams(id_list=tuple(id_list))
            sov1_result = connection.execute(sov1)

            # query = query.bindparams(values=tuple(values

            # rows = [dict(row) for row in sov1_result]
            row = dict(sov1_result.fetchone())

            if row['largest_gift'] :
                oview_fields['largest_gift'] = float(row['largest_gift'])
            else:
                oview_fields['largest_gift'] = 0.0


            # oview_fields['largest_gift'] = float(rows[0]['largest_gift'])

            if row['first_donation_date']:
                oview_fields['first_donation_date'] = str(row['first_donation_date'])
            else:
                oview_fields['first_donation_date'] = ''

            if row['total_giving']:
                oview_fields['total_giving'] = float(row['total_giving'])
            else:
                oview_fields['total_giving'] = 0.0

            oview_fields['number_of_gifts'] = row['number_of_gifts']


            # These could be could combined them into a single complex query

            sov2 = text("""SELECT 
                                amount as first_gift_amount 
                            FROM
                                salesforcedonations as sfd
                            WHERE
                                contact_id IN :id_list  
                            ORDER BY  close_date asc 
                            limit 1 ; """)

            sov2 = sov2.bindparams(id_list=tuple(id_list))
            sov2_result = connection.execute(sov2)

            if sov2_result.rowcount:
                fga = sov2_result.fetchone()[0]

                if fga:
                    oview_fields['first_gift_amount'] = float(fga)
                else:
                    oview_fields['first_gift_amount'] = 0.0
            else:
                oview_fields['first_gift_amount'] = 0.0

            sov3 = text("""SELECT 
                                recurring_donor as is_recurring
                            FROM
                                salesforcedonations as sfd
                            WHERE
                                contact_id  IN :id_list 
                            ORDER BY close_date DESC 
                            LIMIT  1;  """ )

            sov3 = sov3.bindparams(id_list=tuple(id_list))
            sov3_result = connection.execute(sov3)

            if sov3_result.rowcount:
                oview_fields['is_recurring'] = sov3_result.fetchone()[0]
            else:
                oview_fields['is_recurring'] = False


            rfm = text("""SELECT
                            rfm_score, rfm_color, rfm_label, rfm_text_color
                        FROM 
                            rfm_scores
                            left join rfm_mapping on rfm_mapping.rfm_value = rfm_score
                        WHERE
                            matching_id = :match_id; """)

            rfm = rfm.bindparams(match_id = matching_id)
            rfm_result = connection.execute(rfm)

            if rfm_result.rowcount:
                row = rfm_result.fetchone()
                oview_fields['rfm_score'] = row[0]
                oview_fields['rfm_color'] = row[1]
                oview_fields['rfm_label'] = row[2]                
                oview_fields['rfm_text_color'] = row[3]                

            else:
                oview_fields['rfm_score'] = ''
                oview_fields['rfm_color'] = ''
                oview_fields['rfm_label'] = ''      
                oview_fields['rfm_text_color'] = ''


            return jsonify(oview_fields)


        else:   # len(rows) == 0
            logger.warn('No SF contact IDs found for matching_id %', str(matching_id))
            oview_fields['number_of_gifts'] = 0  # Marker for no data
            return jsonify(oview_fields)


@common_api.route('/api/last_analysis', methods=['GET'])
@jwt_ops.jwt_required()
def get_last_analysis():
    """ Return the UTC string (e.g., '2021-12-11T02:29:14.830371') representing 
        when the last analysis run succesfully completed. 
        Returns an empty string if no results.
    """

    last_run = ''

    last_stamp = """
                    select update_stamp 
                    from  execution_status
                    where stage = 'flow' and status = 'complete'
                    order by update_stamp desc
                    limit 1;
                """

    with engine.connect() as connection:
        result = connection.execute(last_stamp)
        if result.rowcount:
            row = result.fetchone()
            last_run_dt = row[0]  # We get as a datetime object
            last_run = last_run_dt.isoformat()

    return last_run

src/server/api/api.py METASEP
from flask import Blueprint
from flask_cors import CORS

admin_api = Blueprint("admin_api", __name__)
common_api = Blueprint("common_api", __name__)
user_api = Blueprint("user_api", __name__)
internal_api = Blueprint("internal_api", __name__)


# TODO: SECURITY - CORS is wide open for development, needs to be limited for production
CORS(user_api)
CORS(common_api)
CORS(admin_api)

src/server/api/admin_api.py METASEP
from api.api import admin_api
import os
import time
from datetime import datetime
import json
from sqlalchemy.sql import text

from sqlalchemy.dialects.postgresql import insert
from sqlalchemy import Table, MetaData
from pipeline import flow_script
from config import engine
from flask import request, redirect, jsonify
from api.file_uploader import validate_and_arrange_upload
from sqlalchemy.orm import sessionmaker

from api import jwt_ops
from config import RAW_DATA_PATH

import structlog
logger = structlog.get_logger()


ALLOWED_EXTENSIONS = {"csv", "xlsx"}


def __allowed_file(filename):
    return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS


# file upload tutorial
@admin_api.route("/api/file", methods=["POST"])
@jwt_ops.admin_required
def upload_csv():
    for file in request.files.getlist("file"):
        if __allowed_file(file.filename):
            try:
                validate_and_arrange_upload(file)
            except Exception as e:
                logger.exception(e)
            finally:
                file.close()

    return redirect(request.origin)


@admin_api.route("/api/listCurrentFiles", methods=["GET"])
@jwt_ops.admin_required
def list_current_files():
    result = None

    logger.info("Start returning file list")
    file_list_result = os.listdir(RAW_DATA_PATH)

    if len(file_list_result) > 0:
        result = file_list_result

    return jsonify(result)


@admin_api.route("/api/execute", methods=["POST"])
@jwt_ops.admin_required
def execute():
    logger.info("Execute flow")
    job_outcome = flow_script.start_flow() # 'busy', 'completed', or 'nothing to do'
    logger.info("Job outcome: %s", str(job_outcome))


    # --------   Skip update if 'busy' or 'nothing to do' as nothing changed ? ------
    current_time = datetime.now().ctime()
    statistics = get_statistics()

    last_execution_details = {"executionTime": current_time, "stats": statistics}
    last_ex_json = (json.dumps(last_execution_details))
    
    metadata = MetaData()
    kvt = Table("kv_unique", metadata, autoload=True, autoload_with=engine)

    # Write Last Execution stats to DB
    # See Alembic Revision ID: 05e0693f8cbb for table definition
    with engine.connect() as connection:
        ins_stmt = insert(kvt).values(               # Postgres-specific insert() supporting ON CONFLICT
            keycol = 'last_execution_time',
            valcol = last_ex_json,
            )
        # If key already present in DB, do update instead
        upsert = ins_stmt.on_conflict_do_update(
                constraint='kv_unique_keycol_key',
                set_=dict(valcol=last_ex_json)
                )

        try:
            connection.execute(upsert)
        except Exception as e:
            logger.error("Insert/Update failed on Last Execution stats")
            logger.error(e)
    # -------------------------------------------------------------------------------
    
    if job_outcome == 'busy':
        return jsonify({'outcome' : 'Already analyzing'}), 503   

    elif job_outcome == 'nothing to do':
        return jsonify({'outcome' : 'No uploaded files to process'}), 200

    elif job_outcome == 'completed' :
        return jsonify({'outcome' : 'Analysis completed'}), 200

    elif job_outcome == 'error' :
        return jsonify({'outcome' : 'Analysis not completed due to error'}), 500
    
    else:
        return jsonify({'outcome' : 'Unknown status: ' + str(job_outcome)}), 200


def get_statistics():
    with engine.connect() as connection:
        query_matches = text("SELECT count(*) FROM (SELECT distinct matching_id from pdp_contacts) as a;")
        query_total_count = text("SELECT count(*) FROM pdp_contacts;")
        matches_count_query_result = connection.execute(query_matches)
        total_count_query_result = connection.execute(query_total_count)

        # Need to iterate over the results proxy
        results = {
            "Distinct Matching Groups Count": [dict(row) for row in matches_count_query_result][0]["count"],
            "Total Contacts Count": [dict(row) for row in total_count_query_result][0]["count"]
        }

        return results


@admin_api.route("/api/statistics", methods=["GET"])
@jwt_ops.admin_required
def list_statistics():
    """ Pull Last Execution stats from DB. """
    logger.info("list_statistics() request")
    last_execution_details = '{}'  # Empty but valid JSON

    engine.dispose() # we don't want other process's conn pool


    with engine.connect() as conn:
    
        try:    # See Alembic Revision ID: 05e0693f8cbb for table definition
        
            s = text("select valcol from kv_unique where keycol = 'last_execution_time';")
            result = conn.execute(s)
            if result.rowcount > 0:
                last_execution_details = result.fetchone()[0]

        except Exception as e:
            logger.error("Failure reading Last Execution stats from DB - OK on first run")
        # Will happen on first run, shouldn't after 

    return last_execution_details


@admin_api.route("/api/get_execution_status", methods=["GET"])
@jwt_ops.admin_required
def get_exec_status():
    """ Get the execution status record from the DB for a running job, if present"""


    engine.dispose() # we don't want other process's conn pool

    with engine.connect() as connection:
        q = text("""SELECT job_id, stage, status, details, update_stamp 
                    FROM execution_status 
                    WHERE status = 'executing' """)
        result = connection.execute(q)

        if result.rowcount > 0:
           running_job = result.fetchone()
           return jsonify(dict(zip(result.keys(), running_job)))
        else:
            return jsonify('')

@admin_api.route("/api/job_in_progress", methods=["GET"])
@jwt_ops.admin_required
def is_job_in_progresss():
    """Return True if there's a running execute, False if not. """

    engine.dispose() # we don't want other process's conn pool

    with engine.connect() as connection:
        q = text("""SELECT job_id from execution_status WHERE status = 'executing' """)
        result = connection.execute(q)

        if result.rowcount > 0:
            return jsonify(True)
        else:
            return jsonify(False)


def start_job():
    """If no running jobs, create a job_id and execution status entry.
    This ensures only only one job runs at a time.
    If there's a running job, return None.  """


    engine.dispose() # we don't want other process's conn pool

    job_id = str(int(time.time()))
    q = text("""SELECT job_id from execution_status
                    WHERE status = 'executing' """)

    i = text("""INSERT INTO execution_status (job_id, stage, status, details) 
                values(:j, :stg, :stat, :det) """)
    i = i.bindparams(j = job_id, 
                     stg ='initiating',
                     stat ='executing',
                     det = ''   )

    running_job = None

    with engine.begin() as connection:   # BEGIN TRANSACTION
        q_result = connection.execute(q)
        if q_result.rowcount == 0:
            # No running jobs
            ins_result = connection.execute(i)
        else:
            running_job = q_result.fetchone()[0]
    # COMMIT TRANSACTION
    #TODO: what would an exception look like here? 


    if running_job :
        # There was a running job already
        logger.warn("Request to start job, but job_id %s already executing", str(running_job))
        return None
    else:
        logger.info("Assigned job_id  %s" ,  str(job_id ) )
        return job_id



def insert_rfm_scores(score_list):
    """Take a list of (matching_id, score) and insert into the
        rfm_scores table.
    """
            # This takes about 4.5 sec to insert 80,000 rows 

    Session = sessionmaker(engine) 
    session =  Session()   
    metadata = MetaData()
    rfms = Table("rfm_scores", metadata, autoload=True, autoload_with=engine)


    truncate = "TRUNCATE table rfm_scores;"
    result = session.execute(truncate)

    ins_list = []   # Create a list of per-row dicts
    for pair in score_list:
        ins_list.append( {'matching_id' : pair[0], 'rfm_score' : pair[1]} )


    ret = session.execute(rfms.insert(ins_list))

    session.commit()   # Commit all inserted rows
    session.close()

    return ret.rowcount


# This is super-hacky - temporary
@admin_api.route("/api/import_rfm", methods=["GET"])
def  import_rfm_csv():
    """ This imports the CSV files and calls the insert function"""
    import csv

    score_list = []

    #  Put your local file location \/

    with open('C:\\Projects\\paws-stuff\\score_tuples.csv', 'r') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        hdr = next(reader)
        logger.debug('Skipping header: %s', hdr)
        for row in reader:
            score_list.append(row)

    rc = insert_rfm_scores(score_list)

    return str(rc) + " rows inserted"


def write_rfm_edges(rfm_dict : dict) :
    """Write the rfm edge dictionary to the DB"""

    if len(rfm_dict) == 3 :  #  R, F, *and* M!
        rfm_s = json.dumps(rfm_dict)  # Convert dict to string

        metadata = MetaData()
        kvt = Table("kv_unique", metadata, autoload=True, autoload_with=engine)

        # See Alembic Revision ID: 05e0693f8cbb for table definition
        with engine.connect() as connection:
            ins_stmt = insert(kvt).values(               # Postgres-specific insert() supporting ON CONFLICT
                keycol = 'rfm_edges',
                valcol = rfm_s,
                )
            # If key already present in DB, do update instead
            upsert = ins_stmt.on_conflict_do_update(
                    constraint='kv_unique_keycol_key',
                    set_=dict(valcol=rfm_s)
                    )

            try:
                connection.execute(upsert)
            except Exception as e:
                logger.error("Insert/Update failed on rfm edge ")
                logger.error(e)
                return None

        return 0

    else :   # Malformed dict
        logger.error("Received rfm_edge dictionary with %s  entries - expected 3",  str(len(rfm_dict)))
        return None


def read_rfm_edges() :
    """Read the rfm_edge record from the DB and return the dict."""

    q = text("""SELECT valcol from kv_unique WHERE keycol = 'rfm_edges';""")

    with engine.begin() as connection:   # BEGIN TRANSACTION
        q_result = connection.execute(q)
        if q_result.rowcount == 0:
            logger.error("No rfm_edge entry found in DB")
            return None
        else:
            edge_string = q_result.fetchone()[0]
            try:
                edge_dict = json.loads(edge_string)   # Convert stored string to dict
            except json.decoder.JSONDecodeError:
                logger.error("rfm_edge entry found in DB was malformed")
                return None
                
            return edge_dict


#@admin_api.route("/api/admin/test_pd", methods=["GET"])  # enable to trigger externally
def pull_donations_for_rfm():
    """Pull donations records for RFM scoring.
       Returns a list of (matching_id:int , amount:float, close_date:string (yyyy-mm-dd))  tuples"""

    q = text("""select matching_id, amount, close_date
            FROM pdp_contacts
            JOIN salesforcedonations as sfd on pdp_contacts.source_id = sfd.contact_id
            where pdp_contacts.source_type = 'salesforcecontacts'
            ORDER BY matching_id; """)

    sfd_list = []

    with engine.connect() as connection:
        result = connection.execute(q)

        for row in result:
            sfd_list.append( (row[0], float(row[1]), str(row[2])) )

    #   return jsonify(sfd_list)  # enable if using endpoint, but it returns a lot of data
        return sfd_list


#@admin_api.route("/api/admin/test_pd", methods=["GET"])  # enable to trigger externally
def generate_dummy_rfm_scores():
    """For each matching_id, generate a random RFM score."""

    from random import choice
    from functools import partial 
    rc = partial( choice, range(1,6) )


    q = text("""select distinct matching_id from pdp_contacts
            ORDER BY matching_id; """)

    dummy_scores = []


    with engine.connect() as connection:
        result = connection.execute(q)

        for row in result:
            dummy_scores.append( ( row[0], str(rc()) +  str(rc()) + str(rc()) ) )  

    #   return jsonify(sfd_list)  # enable if using endpoint, but it returns a lot of data

    logger.debug("Inserting dummy scores...")
    count = insert_rfm_scores(dummy_scores)
    logger.debug("Finished inserting")


    return count


# ########### Test API endpoints
# TODO: Remove for production

# trigger rfm scoring process
@admin_api.route("/api/admin/test_endpoint_gdrs", methods=["GET"])
def hit_gdrs():
    num_scores = generate_dummy_rfm_scores()
    return jsonify({"scores added" : num_scores})


# trigger pull of SL animals
@admin_api.route("/api/admin/test_sla", methods=["GET"])
def trigger_sla_pull():

    import api.API_ingest.shelterluv_animals

    num_rows = api.API_ingest.shelterluv_animals.sla_test()
    return jsonify({"rows added" : num_rows})

# trigger pull of SL people
@admin_api.route("/api/admin/test_slp", methods=["GET"])
def trigger_slp_pull():

    import api.API_ingest.shelterluv_api_handler

    num_rows = api.API_ingest.shelterluv_api_handler.store_shelterluv_people_all()
    return jsonify({"rows added" : num_rows})

# trigger pull of SL animal events
@admin_api.route("/api/admin/test_slae", methods=["GET"])
def trigger_slae_pull():

    import api.API_ingest.sl_animal_events

    num_rows = api.API_ingest.sl_animal_events.slae_test()
    return jsonify({"rows added" : num_rows})





# def pdfr():
#     dlist = pull_donations_for_rfm()
#     print("Returned " + str(len(dlist)) + " rows")
#     return jsonify( {'rows':len(dlist), 'row[0]': dlist[0]} )  # returns length and a sammple row


# def validate_rfm_edges():
#     d = read_rfm_edges()         # read out of DB
#     print("d is: \n" + str(d) )
#     write_rfm_edges(d)          # Write it back
#     d = read_rfm_edges()        # read it again     
#     print("round-trip d is : \n " + str(d) )
#     return "OK"

src/server/api/__init__.py METASEP

src/server/alembic/generate_rfm_mapping.py METASEP
import itertools
import structlog
logger = structlog.get_logger()

def get_all_combinations(chars):
    yield from itertools.product(*([chars] * 3))


def convertTuple(tup):
    str = ''
    for item in tup:
        str = str + item
    return str


def start():
    mapping_rows = []

    mapping_rows.append(
        '''-- Run this script in your SQL query tool
-- Run truncate command if this table is already populated
-- TRUNCATE TABLE rfm_mapping; 
-- BEGIN;
-- Fields are                 (rfm_score, label, (background) color, text color)
        '''
    )

    combinations = []
    for x in get_all_combinations('12345'):
        combinations.append(convertTuple(x))

    for rfm_score in combinations:
        label = ''
        background_color = ''
        color_text = ''
        r_m_average = (int(rfm_score[1]) + (int(rfm_score[2]))) / 2
        r = int(rfm_score[0])

        if r == 5 and (3 < r_m_average <= 5):
            label = 'High impact, engaged'
            background_color = '#034858'
            color_text = '#ffffff'
        elif r == 5 and (1 <= r_m_average <= 3):
            label = 'Low impact, engaged'
            background_color = '#47b8a7'
            color_text = '#000000'
        elif (3 <= r <= 4) and (3 < r_m_average <= 5):
            label = 'High impact, slipping'
            background_color = '#990000'
            color_text = '#ffffff'
        elif (3 <= r <= 4) and (1 <= r_m_average <= 3):
            label = 'Low impact, slipping'
            background_color = '#f77d4e'
            color_text = '#000000'
        elif (1 <= r <= 2) and (3 < r_m_average <= 5):
            label = 'High impact, disengaged'
            background_color = '#cf3030'
            color_text = '#ffffff'
        elif (1 <= r <= 2) and (1 <= r_m_average <= 3):
            label = 'Low impact, disengaged'
            background_color = '#eed0aa'
            color_text = '#000000'

        mapping_rows.append(
            "insert into rfm_mapping values('{}', '{}','{}', '{}');".format(rfm_score, label, background_color,
                                                                            color_text))

    mapping_rows.append('-- COMMIT;')

    with open('populate_rfm_mapping.sql', 'w') as f:
        for item in mapping_rows:
            f.write("%s\n" % item)


    logger.debug('Completed generate_rfm_mapping')


start()

src/server/alembic/env.py METASEP
from logging.config import fileConfig

from sqlalchemy import engine_from_config
from sqlalchemy import pool

from os import environ

from alembic import context

# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config

# Interpret the config file for Python logging.
# This line sets up loggers basically.
fileConfig(config.config_file_name)

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
target_metadata = None

# other values from the config, defined by the needs of env.py,
# can be acquired:
# my_important_option = config.get_main_option("my_important_option")
# ... etc.


PG_URL1 = 'postgresql://postgres:'
PG_URL2 = environ['POSTGRES_PASSWORD']
PG_URL3 = '@paws-compose-db/paws'

PG_URL = PG_URL1 + PG_URL2 + PG_URL3


def run_migrations_offline():
    """Run migrations in 'offline' mode.

    This configures the context with just a URL
    and not an Engine, though an Engine is acceptable
    here as well.  By skipping the Engine creation
    we don't even need a DBAPI to be available.

    Calls to context.execute() here emit the given string to the
    script output.

    """
    # url = config.get_main_option("sqlalchemy.url")
    url = PG_URL
    context.configure(
        url=url,
        target_metadata=target_metadata,
        literal_binds=True,
        dialect_opts={"paramstyle": "named"},
    )

    with context.begin_transaction():
        context.run_migrations()


def run_migrations_online():
    """Run migrations in 'online' mode.

    In this scenario we need to create an Engine
    and associate a connection with the context.

    """
    connectable = engine_from_config(
        config.get_section(config.config_ini_section),
        prefix="sqlalchemy.",
        poolclass=pool.NullPool,
        url=PG_URL,
    )

    with connectable.connect() as connection:
        context.configure(
            connection=connection, target_metadata=target_metadata
        )

        with context.begin_transaction():
            context.run_migrations()


if context.is_offline_mode():
    run_migrations_offline()
else:
    run_migrations_online()

src/server/rfm-edges.txt METASEP
-- Run delete if rfm_edges already present.
-- DELETE FROM kv_unique WHERE keycol = 'rfm_edges';

INSERT INTO "public"."kv_unique"(
    "keycol",
    "valcol"
) VALUES (
    'rfm_edges',
    '{  "r":{"5": 0, "4": 90, "3": 181, "2": 273, "1": 364},
        "f": {"1": 0, "2": 1, "3": 3, "4": 11, "5": 17},
        "m": {"1": 0, "2": 49.99, "3": 74.99, "4": 99.99, "5": 209.99}}'
 );

src/server/requirements.txt METASEP
numpy==1.22.0
Flask==1.1.2
pandas==1.3.2

sqlalchemy==1.4.15 
psycopg2-binary==2.9.1
xlrd==1.2.0  # currently used for xlsx, but we should consider adjusting code to openpyxl for xlsx
openpyxl
requests
pytest
flask-jwt-extended==4.0.2
alembic
flask-cors
dropbox
jellyfish
networkx
jinja2<3.1.0
itsdangerous==2.0.1 # TODO: upgrade flask so we don't have to do this
simple-salesforce
werkzeug==2.0.3
structlog
src/server/alembic.ini METASEP
# A generic, single database configuration.

[alembic]
# path to migration scripts
script_location = alembic

# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s

# timezone to use when rendering the date
# within the migration file as well as the filename.
# string value is passed to dateutil.tz.gettz()
# leave blank for localtime
# timezone =

# max length of characters to apply to the
# "slug" field
# truncate_slug_length = 40

# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false

# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false

# version location specification; this defaults
# to alembic/versions.  When using multiple version
# directories, initial revisions must be specified with --version-path
# version_locations = %(here)s/bar %(here)s/bat alembic/versions

# the output encoding used when revision files
# are written from script.py.mako
# output_encoding = utf-8

# Container
sqlalchemy.url = postgresql://postgres:PASSWORD@paws-compose-db/paws

# Local
# sqlalchemy.url = postgresql://postgres:thispasswordisverysecure@localhost/paws


[post_write_hooks]
# post_write_hooks defines scripts or Python functions that are run
# on newly generated revision scripts.  See the documentation for further
# detail and examples

# format using "black" - use the console_scripts runner, against the "black" entrypoint
# hooks=black
# black.type=console_scripts
# black.entrypoint=black
# black.options=-l 79

# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = WARN
handlers = console
qualname =

[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine

[logger_alembic]
level = INFO
handlers =
qualname = alembic

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S

src/server/Dockerfile METASEP
FROM python:3.8

RUN apt-get update && apt-get install -y vim

WORKDIR /app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apt-get update

RUN apt-get install -y python3-dev uwsgi uwsgi-src libcap-dev uwsgi-plugin-python3
RUN pip install --upgrade pip

COPY requirements.txt /

RUN pip install --no-cache-dir -r /requirements.txt

RUN export PYTHON=python3.8
RUN uwsgi --build-plugin "/usr/src/uwsgi/plugins/python python38"
RUN mv python38_plugin.so /usr/lib/uwsgi/plugins/python38_plugin.so
RUN chmod 666 /usr/lib/uwsgi/plugins/python38_plugin.so

COPY . .

RUN mkdir -p /app/static \
    /app/static/raw_data \
    /app/static/logs \
    /app/static/zipped

RUN [ ! -f /app/static/logs/last_execution.json ] && printf {} > /app/static/logs/last_execution.json

RUN chmod -R 777 /app/static

RUN chmod +x  bin/startServer.sh
# RUN ufw allow 5000
WORKDIR /app

RUN useradd -m pawsapp
RUN mkdir -p  /app/.pytest_cache/v/cache
RUN chown -R pawsapp:pawsapp /app/.pytest_cache/v/cache
USER pawsapp

CMD bin/startServer.sh
#>> start.log 2>&1
src/server/.dockerignore METASEP
Dockerfile

src/server/wsgi.py METASEP
from app import app

if __name__ == "__main__":
    app.run()
src/server/test_api.py METASEP
import pytest, socket, requests, os
import structlog
logger = structlog.get_logger()

try:
    from secrets_dict import BASEUSER_PW, BASEADMIN_PW
except ImportError:
    BASEUSER_PW = os.environ['BASEUSER_PW']
    BASEADMIN_PW = os.environ['BASEADMIN_PW']


jwt_token = ''

#
# Run 'pytest' from the command line  (-v gives helpful details)
#
# Running pytest can result in six different exit codes:
#   0 - All tests were collected and passed successfully
#   1 - Tests were collected and run but some of the tests failed
#   2 - Test execution was interrupted by the user
#   3 - Internal error happened while executing tests
#   4 - pytest command line usage error
#   5 - No tests were collected
#
# These codes are represented by the pytest.ExitCode enum


if os.getenv("IS_LOCAL") == "True":
    SERVER_URL = "http://localhost:3333"
    IS_LOCAL = True
else:
    SERVER_URL = "http://server:5000"
    IS_LOCAL = False


try:
    from secrets_dict import SHELTERLUV_SECRET_TOKEN
except ImportError:
    SHELTERLUV_SECRET_TOKEN = os.getenv("SHELTERLUV_SECRET_TOKEN")
finally:
    SL_Token = True if SHELTERLUV_SECRET_TOKEN else False


###  DNS lookup tests  ##############################

def test_bad_dns():
    """Verify DNS not resolving bad host names."""
    with pytest.raises(socket.gaierror):
        socket.getaddrinfo("bad_server_name_that_should_not_resolve", "5000")


@pytest.mark.skipif(IS_LOCAL, reason="Not run when IS_LOCAL")
def test_db_dns():
    """Verify we get IP for DB server."""

    # getaddrinfo works for IPv4 and v6
    try:
        gai = socket.getaddrinfo("db", "5000")
    except:
        pytest.fail('getaddrinfo() failed for db', pytrace=False)

    assert len(gai) > 0


@pytest.mark.skipif(IS_LOCAL, reason="Not run when IS_LOCAL")
def test_server_dns():
    """Verify we get IP for API server."""
    try:
        gai = socket.getaddrinfo("server", "5000")
    except socket.gaierror:
        pytest.fail('getaddrinfo() failed for server', pytrace=False)

    assert len(gai) > 0


@pytest.mark.skipif(IS_LOCAL, reason="Not run when IS_LOCAL")
def test_client_dns():
    """Verify we get IP for client."""
    try:
        gai = socket.getaddrinfo("client", "5000")
    except socket.gaierror:
        pytest.fail('getaddrinfo() failed for client', pytrace=False)

    assert len(gai) > 0

# Simple API tests  ################################################
def test_usertest():
    """Verify liveness test works"""
    response = requests.get(SERVER_URL + "/api/user/test")
    assert response.status_code == 200

########   Dependent tests   #################################

#      Store info across tests
class State:
    def __init__(self):
        self.state = {}

@pytest.fixture(scope='session')
def state() -> State:
    state = State()
    state.state['from_fixture'] = 0
    return state


def test_userlogin(state: State):
    """Verify base_user can log in/get JWT."""
    data = {"username":"base_user", "password" : BASEUSER_PW}

    response = requests.post(SERVER_URL + "/api/user/login", json=data)
    assert response.status_code == 200

    try:
        jwt_token = response.json()['access_token']
    except:
        pytest.fail('Did not get access token',  pytrace=False)

    assert len(jwt_token) > 16

    # Store the token for later use
    state.state['base_user'] = jwt_token


def test_useraccess(state: State):
    """Verify logged-in base_user can use JWT to access test_auth"""
    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_user']

    assert len(b_string) > 24

    auth_hdr = {'Authorization' : b_string}
    response = requests.get(SERVER_URL + "/api/user/test_auth", headers=auth_hdr)
    assert response.status_code == 200


def test_user_bad_pw():
    """Verify base_user with bad pw fails"""
    data = {"username":"base_user", "password" : 'some_bad_password'}

    response = requests.post(SERVER_URL + "/api/user/login", json=data)
    assert response.status_code == 401


def test_inact_userblocked(state: State):
    """Verify base_user_inact can't login because marked inactive."""
    # Same pw as base_user
    data = {"username":"base_user_inact", "password" : BASEUSER_PW}
    response = requests.post(SERVER_URL + "/api/user/login", json=data)
    assert response.status_code == 401

###   Admin-level tests ######################################

def test_adminlogin(state: State):
    """Verify base_admin can log in/get JWT."""
    data = {"username":"base_admin", "password" : BASEADMIN_PW}

    response = requests.post(SERVER_URL + "/api/user/login", json=data)
    assert response.status_code == 200

    try:
        jwt_token = response.json()['access_token']
    except:
        pytest.fail('Did not get access token',  pytrace=False)

    assert len(jwt_token) > 16

    # Store the token for later use
    state.state['base_admin'] = jwt_token


def test_admingetusers(state: State):
    """Verify logged-in base_admin can use JWT to get user list """
    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_admin']

    assert len(b_string) > 24

    auth_hdr = {'Authorization' : b_string}
    response = requests.get(SERVER_URL + "/api/admin/user/get_users", headers=auth_hdr)
    assert response.status_code == 200

    userlist = response.json()
    assert len(userlist) > 1

def test_check_usernames(state: State):
    """Verify logged-in base_admin can test usernames, gets correct result - existing user """
    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_admin']

    assert len(b_string) > 24

    auth_hdr = {'Authorization' : b_string}

    data = {"username":"base_admin"}
    response = requests.post(SERVER_URL + "/api/admin/user/check_name", headers=auth_hdr, json=data)
    assert response.status_code == 200

    is_user = response.json()
    assert is_user == 1

def test_check_badusernames(state: State):
    """Verify logged-in base_admin can test usernames, gets correct result - nonexistant user  """
    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_admin']
    assert len(b_string) > 24
    auth_hdr = {'Authorization' : b_string}

    data = {"username":"got_no_username_like_this"}
    response = requests.post(SERVER_URL + "/api/admin/user/check_name", headers=auth_hdr, json=data)
    assert response.status_code == 200

    is_user = response.json()
    assert is_user == 0


def test_admin_currentFiles(state: State):
    """Verify admin user can get Current Files list"""

    b_string = 'Bearer ' + state.state['base_admin']
    assert len(b_string) > 24
    auth_hdr = {'Authorization' : b_string}

    response = requests.get(SERVER_URL + "/api/listCurrentFiles",  headers=auth_hdr)
    assert response.status_code == 200


def test_admin_statistics(state: State):
    """360 view Statistics"""

    b_string = 'Bearer ' + state.state['base_admin']
    assert len(b_string) > 24
    auth_hdr = {'Authorization' : b_string}

    response = requests.get(SERVER_URL + "/api/statistics", headers=auth_hdr)
    assert response.status_code == 200


def test_usergetusers(state: State):
    """Verify logged-in base_user *cannot* use JWT to get user list """
    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_user']

    assert len(b_string) > 24

    auth_hdr = {'Authorization' : b_string}
    response = requests.get(SERVER_URL + "/api/admin/user/get_users", headers=auth_hdr)
    assert response.status_code == 403


def test_currentFiles(state: State):
    """360 view Current Files list"""

    b_string = 'Bearer ' + state.state['base_admin']
    assert len(b_string) > 24
    auth_hdr = {'Authorization' : b_string}

    response = requests.get(SERVER_URL + "/api/listCurrentFiles", headers=auth_hdr)
    assert response.status_code == 200


def test_statistics(state: State):
    """360 view Statistics"""

    b_string = 'Bearer ' + state.state['base_admin']
    assert len(b_string) > 24
    auth_hdr = {'Authorization' : b_string}
    
    response = requests.get(SERVER_URL + "/api/statistics", headers=auth_hdr)
    assert response.status_code == 200


###   Shelterluv API tests ######################################

@pytest.mark.skipif(SL_Token, reason="Not run when SL_Token Present")
def test_user_get_person_animal_events(state: State):
    """ Test that the api returns mock data if the Shelterluv Token
        is missing from secrets
    """

    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_user']

    assert len(b_string) > 24

    auth_hdr = {'Authorization' : b_string}
    url = SERVER_URL + "/api/person/12345/animal/12345/events"

    try:
        response = requests.get(url, headers = auth_hdr)
    except Exception as err:
        logger.error(err)
    else:
        assert response.status_code == 200
        from api.fake_data import sl_mock_data
        assert response.json() == sl_mock_data("events")


@pytest.mark.skipif(SL_Token, reason="Not run when SL_Token Present")
def test_user_get_animals(state: State):
    """ Test that the api returns mock data if the Shelterluv Token
        is missing from secrets
    """

    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_user']

    assert len(b_string) > 24

    auth_hdr = {'Authorization' : b_string}
    url = SERVER_URL + "/api/person/12345/animals"

    try:
        response = requests.get(url, headers = auth_hdr)
    except Exception as err:
        logger.error(err)
    else:
        assert response.status_code == 200
        from api.fake_data import sl_mock_data
        assert response.json() == sl_mock_data("animals")


@pytest.mark.skipif(not SL_Token, reason="Run when SL_Token Present")
def test_user_get_animals_sl_token(state: State):
    """ Test to confirm api does not return mock values if the Shelterluv Token
        is present in the secrets_dict file.
        Note this works on the assumption the SL token is not valid, and returns
        a default empty value

        >> This is tricky - if SL token is correct and person_id is valid, could get animal records returned.

    """

    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_user']

    assert len(b_string) > 24

    auth_hdr = {'Authorization' : b_string}
    url = SERVER_URL + "/api/person/12345/animals"

    try:
        response = requests.get(url, headers = auth_hdr)
    except Exception as err:
        logger.error(err)
        pytest.fail('test_user_get_animals_sl_token - Request failed', pytrace=False)
    else:
        assert response.status_code == 200
        assert response.json() == {'person_details': {}, 'animal_details': {}}


@pytest.mark.skipif(not SL_Token, reason="Run when SL_Token Present")
def test_user_get_person_animal_events_sl_token(state: State):
    """ Test to confirm api does not return mock values if the Shelterluv Token
        is present in the secrets_dict file.
        Note this works on the assumption the SL token is not valid, and returns
        a default empty value
    """

    # Build auth string value including token from state
    b_string = 'Bearer ' + state.state['base_user']

    assert len(b_string) > 24

    auth_hdr = {'Authorization' : b_string}
    url = SERVER_URL + "/api/person/12345/animal/12345/events"

    try:
        response = requests.get(url, headers = auth_hdr)
    except Exception as err:
        logger.error(err)
        pytest.fail('test_user_get_person_animal_events_sl_token - Request failed', pytrace=False)
    else:
        assert response.status_code == 200
        assert response.json() == {}

src/server/shifts_importer.py METASEP
import re
from flask.globals import current_app

from openpyxl import load_workbook
from jellyfish import jaro_similarity

from config import  engine

import structlog
logger = structlog.get_logger()


from sqlalchemy import  insert,  Table,  Column, MetaData, exc
from sqlalchemy.dialects.postgresql import Insert
metadata = MetaData()


MINIMUM_SIMILARITY = 0.85  # How good does the table match need to be?

expected_columns =  {
            'Number' : 'volg_id',
            'Site' : 'site',
            'Place' : None,
            'Assignment' : 'assignment',
            'From date' : 'from_date',
            'To date' : None,
            'From time' :None,
            'To time' : None,
            'Hours' : 'hours',
            'No Call/No Show' : None,
            'Call/Email to miss shift' : None,
            'Absence' : None,
            'Volunteers' : None
            }

def validate_import_vs(filename, conn):
    """ Validate that the XLSX column names int the file are close enough to expectations that we can trust the data.
        If so, insert the data into the volgisticsshifts table. 
    """

    logger.info('------ Loading %s ',  filename.filename )
    wb = load_workbook(filename)   #  ,read_only=True should be faster but gets size incorrect 
    ws = wb['Service']   # Needs to be 'Service' sheet
    # ws.reset_dimensions()   # Tells openpyxl to ignore what sheet says and check for itself
    ws.calculate_dimension()

    columns = ws.max_column
    if columns > 26:
        # TODO: Handle AA, AB, usw...
        logger.warn("Column count > 26; columns after Z not processed")
        columns = 26

    header = [cell.value for cell in ws[1]]

    min_similarity = 1.0
    min_column = None

    for expected, got in zip(expected_columns.keys(), header):
        jsim = jaro_similarity(expected, got) 
        if jsim < min_similarity :
            min_similarity = jsim
            min_column = expected + ' / ' + got

        
    logger.debug("Minimum similarity:  %s", "{:.2}".format(min_similarity) )
    if min_column:
        logger.debug("On expected/got: %s", str(min_column))


    if  min_similarity >= MINIMUM_SIMILARITY :  # Good enough to trust
        
        vs  = Table("volgisticsshifts", metadata, autoload=True, autoload_with=engine)

        seen_header = False  # Used to skip header row

        # Stats for import
        dupes = 0
        other_integrity = 0
        other_exceptions = 0
        row_count = 0
        missing_volgistics_id = 0

        for row in ws.values:        
            if seen_header: 
                row_count += 1
                if row_count % 1000 == 0:
                    logger.debug("Row: %s", str(row_count) )
                zrow = dict(zip(expected_columns.values(), row))  
                # zrow is a dict of db_col:value pairs, with at most one key being None (as it overwrote any previous)
                # We need to remove the None item, if it exists
                try:
                    del zrow[None]
                except KeyError:
                    pass 

                #  Cleanup time!  Many older imports have... peculiarities 

                #  End cleanup 

                if zrow['volg_id'] :  # No point in importing if there's nothing to match
                    # Finally ready to insert row into the table
                    # 

                    stmt = Insert(vs).values(zrow)

                    skip_dupes = stmt.on_conflict_do_nothing(
                        constraint='uq_shift'
                       )
                    try:
                        result = conn.execute(skip_dupes)
                    except exc.IntegrityError as e:  # Catch-all for several more specific exceptions
                        if  re.match('duplicate key value', str(e.orig) ):
                            dupes += 1
                            pass
                        else:
                            other_integrity += 1
                            logger.error(e)
                    except Exception as e: 
                        other_exceptions += 1
                        logger.error(e)
                 
                else: # Missing contact_id
                    missing_volgistics_id += 1


            else:  # Haven't seen header, so this was first row.
                seen_header = True

        # NOTE: we now run this in a engine.begin() context manager, so our
        # parent will commit. Don't commit here!


        logger.info("Total rows: %s  Dupes: %s Missing volgistics id: %s",  str(row_count), str(dupes), str(missing_volgistics_id)  )
        logger.info("Other integrity exceptions: %s  Other exceptions: %s",  str(other_exceptions),  str(other_integrity) )
        wb.close()
        return { True : "File imported" }
src/server/secrets_dict.py METASEP
SD_COMMENT="This is for local development"
APP_SECRET_KEY="ASKASK"
JWT_SECRET="JWTSECRET"
POSTGRES_PASSWORD="thispasswordisverysecure"
BASEUSER_PW="basepw"
BASEEDITOR_PW="editorpw"
BASEADMIN_PW="basepw"
DROPBOX_APP="DBAPPPW"

src/server/models.py METASEP
import datetime
import re
from itertools import combinations

import pandas as pd
import sqlalchemy as sa
from sqlalchemy import (
    Boolean,
    DateTime,
    Index,
    Integer,
    String,
    delete,
    desc,
    func,
    literal_column,
    select,
    text,
    tuple_,
)
from sqlalchemy.dialects.postgresql import JSONB, insert
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.functions import coalesce

Base = declarative_base()


def Column(*colargs, source_column=None, contacts_column=None, **kwargs):
    # Currently many of our database tables are populated by loading some csv or
    # excel table and inserting those columns with little more than a column
    # name change. Many of those databse columns will also later be copied into
    # pdp_contacts with little processing. This drop-in replacement for
    # sqlalchemy's Column function lets us easily provide this extra information
    # for some automated processing.

    info = kwargs.get("info", {})
    if source_column:
        info["source_column"] = source_column
    if contacts_column:
        info["contacts_column"] = contacts_column

    return sa.Column(*colargs, info=info, **kwargs)


def get_source_column_translation(cls):
    # Produce a mapping of source column to database column for a class that
    # uses the Column helper

    return {
        col.info["source_column"]: col.name
        for col in cls.__table__.columns
        if "source_column" in col.info
    }


def get_contacts_mapping(cls):
    # Produce an association of pdp_contacts columns with some other table's
    # columns for use in an INSERT ... FROM SELECT

    return [
        (PdpContacts.matching_id, 0),
        (PdpContacts.source_type, literal_column(f"'{cls.__tablename__}'")),
    ] + [
        (col.info["contacts_column"], col)
        for col in cls.__table__.columns
        if "contacts_column" in col.info
    ]


def dedup_consecutive(table, unique_id, id, order_by, dedup_on):
    # Many of our raw data tables have a similar structure: a contact id column,
    # an insert time column, and several other pieces of raw data. If someone
    # inserts a "new" record for a certain id, but none of the raw data is
    # different from the previous record, we'd like to get rid of it.
    #
    # This bit of SQL magic partitions a table by a given id column, orders it
    # by some order_by column, and removes duplicate consecutive entries based
    # on some dedup_on expression.
    #
    # Note the use of "IS NOT DISTINCT FROM" instead of "!="; the latter does
    # not work well on null values.

    sq = select(
        unique_id,
        id,
        order_by,
        dedup_on.bool_op("IS NOT DISTINCT FROM")(
            func.lag(dedup_on).over(partition_by=id, order_by=order_by)
        ).label("is_dupe"),
    ).subquery()

    to_delete = select(sq.c[0]).where(sq.c[3]).subquery()
    return delete(table).where(unique_id == to_delete.c[0])


def normalize_phone_number(number):
    result = None

    if number and str(number) != "nan":
        number = re.sub("[() -.+]", "", str(number))

        if number and number[0] == "1":
            number = number[1:]

        if number.isdigit() and len(number) == 10:
            result = number

    return result


class PdpContacts(Base):
    __tablename__ = "pdp_contacts"
    __table_args__ = (
        Index("idx_pdp_contacts_lower_first_name", text("lower(first_name)")),
        Index("idx_pdp_contacts_lower_last_name", text("lower(last_name)")),
        Index("idx_pdp_contacts_lower_email", text("lower(email)")),
        Index("idx_pdp_contacts_source_type_and_id", "source_type", "source_id"),
    )

    _id = Column(Integer, primary_key=True, autoincrement=True)
    matching_id = Column(Integer)
    source_type = Column(String)
    source_id = Column(String)
    is_organization = Column(Boolean, default=False)
    first_name = Column(String, default=None)
    last_name = Column(String, default=None)
    email = Column(String, default=None)
    mobile = Column(String, default=None)
    street_and_number = Column(String, default=None)
    apartment = Column(String)
    city = Column(String, default=None)
    state = Column(String, default=None)
    zip = Column(String, default=None)
    json = Column(JSONB)
    created_date = Column(DateTime, default=datetime.datetime.utcnow)
    archived_date = Column(DateTime, default=None)


P = PdpContacts


class SalesForceContacts(Base):
    __tablename__ = "salesforcecontacts"

    _id = Column(Integer, primary_key=True)
    contact_id = Column(
        String, source_column="Contact ID 18", contacts_column=P.source_id
    )
    first_name = Column(
        String, source_column="First Name", contacts_column=P.first_name
    )
    last_name = Column(String, source_column="Last Name", contacts_column=P.last_name)
    account_name = Column(String, source_column="Account Name")
    mailing_country = Column(String, source_column="Mailing Country")
    mailing_street = Column(
        String, source_column="Mailing Street", contacts_column=P.street_and_number
    )
    mailing_city = Column(String, source_column="Mailing City", contacts_column=P.city)
    mailing_state_province = Column(
        String, source_column="Mailing State/Province", contacts_column=P.state
    )
    mailing_zip_postal_code = Column(
        String, source_column="Mailing Zip/Postal Code", contacts_column=P.zip
    )
    phone = Column(String, source_column="Phone")
    mobile = Column(String, source_column="Mobile")
    email = Column(String, source_column="Email", contacts_column=P.email)
    json = Column(JSONB)
    created_date = Column(DateTime, default=datetime.datetime.utcnow)

    @classmethod
    def insert_from_file_df(cls, df, conn):
        column_translation = get_source_column_translation(cls)
        df = df[column_translation.keys()]
        df = df.rename(columns=column_translation)

        df["phone"] = df["phone"].apply(normalize_phone_number)
        df["mobile"] = df["mobile"].apply(normalize_phone_number)

        dedup_on = [col for col in cls.__table__.columns if col.name in df.columns]
        df["created_date"] = datetime.datetime.utcnow()
        df.to_sql(cls.__tablename__, conn, if_exists="append", index=False)
        conn.execute(
            dedup_consecutive(
                cls.__table__,
                unique_id=cls._id,
                id=cls.contact_id,
                order_by=cls.created_date,
                dedup_on=tuple_(*dedup_on),
            )
        )

    @classmethod
    def insert_into_pdp_contacts(cls):
        column_mapping = get_contacts_mapping(cls) + [
            # Note: current version of SQLalchemy doesn't like seeing the same
            # column object twice in insert().from_select, hence this
            # literal_column. I think this is fixed in a later version?
            (P.apartment, literal_column("mailing_street")),
            (P.mobile, coalesce(cls.mobile, cls.phone)),
            (P.is_organization, cls.account_name.not_like("% Household")),
        ]
        contacts_columns, this_columns = zip(*column_mapping)

        return insert(PdpContacts).from_select(
            list(contacts_columns),
            select(*this_columns)
            .distinct(cls.contact_id)
            .order_by(cls.contact_id, desc(cls.created_date)),
        )


class ShelterluvPeople(Base):
    __tablename__ = "shelterluvpeople"

    _id = Column(Integer, primary_key=True)
    firstname = Column(String, source_column="Firstname", contacts_column=P.first_name)
    lastname = Column(String, source_column="Lastname", contacts_column=P.last_name)
    id = Column(String, source_column="ID")
    internal_id = Column(
        String, source_column="Internal-ID", contacts_column=P.source_id
    )
    associated = Column(String, source_column="Associated")
    street = Column(String, source_column="Street", contacts_column=P.street_and_number)
    apartment = Column(String, source_column="Apartment", contacts_column=P.apartment)
    city = Column(String, source_column="City", contacts_column=P.city)
    state = Column(String, source_column="State", contacts_column=P.state)
    zip = Column(String, source_column="Zip", contacts_column=P.zip)
    email = Column(String, source_column="Email", contacts_column=P.email)
    phone = Column(String, source_column="Phone", contacts_column=P.mobile)
    animal_ids = Column(JSONB, source_column="Animal_ids")
    json = Column(JSONB)
    created_date = Column(DateTime, default=datetime.datetime.utcnow)

    @classmethod
    def insert_from_df(cls, df, conn):
        column_translation = get_source_column_translation(cls)
        df = df[column_translation.keys()]
        df = df.rename(columns=column_translation)

        df["phone"] = df["phone"].apply(normalize_phone_number)

        dedup_on = [col for col in cls.__table__.columns if col.name in df.columns]
        df["created_date"] = datetime.datetime.utcnow()
        df.to_sql(
            cls.__tablename__,
            conn,
            dtype={"animal_ids": JSONB},
            if_exists="append",
            index=False,
        )
        conn.execute(
            dedup_consecutive(
                cls.__table__,
                unique_id=cls._id,
                id=cls.internal_id,
                order_by=cls.created_date,
                dedup_on=tuple_(*dedup_on),
            )
        )

    @classmethod
    def insert_into_pdp_contacts(cls):
        column_mapping = get_contacts_mapping(cls)
        contacts_columns, this_columns = zip(*column_mapping)
        return insert(PdpContacts).from_select(
            list(contacts_columns),
            select(*this_columns)
            .distinct(cls.internal_id)
            .order_by(cls.internal_id, desc(cls.created_date)),
        )


class Volgistics(Base):
    __tablename__ = "volgistics"

    _id = Column(Integer, primary_key=True)
    number = Column(String, source_column="Number", contacts_column=P.source_id)
    last_name = Column(String, source_column="Last name", contacts_column=P.last_name)
    first_name = Column(
        String, source_column="First name", contacts_column=P.first_name
    )
    middle_name = Column(String, source_column="Middle name")
    complete_address = Column(String, source_column="Complete address")
    street_1 = Column(String, source_column="Street 1")
    street_2 = Column(String, source_column="Street 2")
    street_3 = Column(String, source_column="Street 3")
    city = Column(String, source_column="City", contacts_column=P.city)
    state = Column(String, source_column="State", contacts_column=P.state)
    zip = Column(String, source_column="Zip", contacts_column=P.zip)
    all_phone_numbers = Column(String, source_column="All phone numbers")
    home = Column(String, source_column="Home")
    work = Column(String, source_column="Work")
    cell = Column(String, source_column="Cell")
    email = Column(String, source_column="Email", contacts_column=P.email)
    json = Column(JSONB)
    created_date = Column(DateTime, default=datetime.datetime.utcnow)

    @classmethod
    def insert_from_file(cls, xl_file, conn):
        df = pd.read_excel(xl_file, sheet_name="Master")

        column_translation = get_source_column_translation(cls)
        df = df[column_translation.keys()]
        df = df.rename(columns=column_translation)

        df["home"] = df["home"].apply(normalize_phone_number)
        df["work"] = df["work"].apply(normalize_phone_number)
        df["cell"] = df["cell"].apply(normalize_phone_number)

        dedup_on = [col for col in cls.__table__.columns if col.name in df.columns]
        df["created_date"] = datetime.datetime.utcnow()
        df.to_sql(
            cls.__tablename__,
            conn,
            if_exists="append",
            index=False,
        )
        conn.execute(
            dedup_consecutive(
                cls.__table__,
                unique_id=cls._id,
                id=cls.number,
                order_by=cls.created_date,
                dedup_on=tuple_(*dedup_on),
            )
        )

    @classmethod
    def insert_into_pdp_contacts(cls):
        column_mapping = get_contacts_mapping(cls) + [
            # NOTE: This logic seems wrong. It peels off the street number and
            # calls it the "apartment," and calls the rest of the address the
            # "street and number."
            (
                P.street_and_number,
                literal_column("regexp_replace(street_1, '^[^ ]* ?', '')"),
            ),
            (P.apartment, literal_column("(regexp_match(street_1, '^([^ ]*) '))[1]")),
            (P.mobile, coalesce(cls.cell, cls.home)),
        ]
        contacts_columns, this_columns = zip(*column_mapping)
        return insert(PdpContacts).from_select(
            list(contacts_columns),
            select(*this_columns)
            .distinct(cls.number)
            .order_by(cls.number, desc(cls.created_date)),
        )


class ManualMatches(Base):
    __tablename__ = "manual_matches"

    source_type_1 = Column(String, primary_key=True)
    source_id_1 = Column(String, primary_key=True)
    source_type_2 = Column(String, primary_key=True)
    source_id_2 = Column(String, primary_key=True)

    @classmethod
    def insert_from_df(cls, df, conn):
        # Our input csv has columns like "salesforcecontacts," "volgistics," and
        # "shelterluvpeople," where two columns are non-null if there is an
        # association between those two ids. We massage this table into one that
        # is easier to join on.
        
        match_dicts = df.to_dict(orient="records")

        matched_pairs = []
        for match in match_dicts:
            non_nulls = {k: v for (k, v) in match.items() if not pd.isna(v)}
            for ((st1, sid1), (st2, sid2)) in combinations(non_nulls.items(), 2):
                matched_pairs.append(
                    {
                        "source_type_1": st1,
                        "source_id_1": sid1,
                        "source_type_2": st2,
                        "source_id_2": sid2,
                    }
                )

        conn.execute(insert(cls).values(matched_pairs).on_conflict_do_nothing())

class SalesforceDonations(Base):
    __tablename__ = "salesforcedonations"

    _id = sa.Column(sa.Integer, primary_key=True)
    opp_id = sa.Column(sa.String)
    recurring_donor = sa.Column(sa.Boolean)
    primary_contact = sa.Column(sa.String)
    contact_id = sa.Column(sa.String)
    amount = sa.Column(sa.Numeric)
    close_date = sa.Column(sa.Date)
    donation_type = sa.Column(sa.String)
    primary_campaign_source = sa.Column(sa.String)


src/server/donations_importer.py METASEP
import re
from flask.globals import current_app

from openpyxl import load_workbook
from jellyfish import jaro_similarity

from config import  engine

import structlog
logger = structlog.get_logger()

from sqlalchemy import  insert,  Table,  Column, MetaData, exc
from sqlalchemy.dialects.postgresql import Insert
metadata = MetaData()



MINIMUM_SIMILARITY = 0.85  # How good does the table match need to be?

expected_columns =  {'Recurring donor' : 'recurring_donor',        # 'Export XLSX file column name' : 'db column name' 
                    'Opportunity Owner': None ,                    # None means we won't import that column into DB
                    'Account ID 18': None ,
                    'Account Name':  None, 
                    'Primary Contact': 'primary_contact',
                    'Contact ID 18': 'contact_id',
                    'Opportunity ID 18': 'opp_id',   # Should be a unique donation ID but isn't quite
                    'Opportunity Name': None,
                    'Stage': None,
                    'Fiscal Period': None, 
                    'Amount': 'amount', 
                    'Probability (%)': None, 
                    'Age': None,
                    'Close Date': 'close_date', 
                    'Created Date': None, 
                    'Type': 'donation_type', 
                    'Primary Campaign Source': 'primary_campaign_source' ,
                    'Source': None }
                    

def validate_import_sfd(filename, conn):
    """ Validate that the XLSX column names int the file are close enough to expectations that we can trust the data.
        If so, insert the data into the salseforcedonations table. 
    """

    logger.info('---------------------- Loading %s -------------------',  filename.filename)
    wb = load_workbook(filename)   #  ,read_only=True should be faster but gets size incorrect 
    ws = wb.active
    # ws.reset_dimensions()   # Tells openpyxl to ignore what sheet says and check for itself
    ws.calculate_dimension()

    columns = ws.max_column
    if columns > 26:
        # TODO: Handle AA, AB, usw...
        logger.warning("Column count > 26; columns after Z not processed")
        columns = 26

    header = [cell.value for cell in ws[1]]

    min_similarity = 1.0
    min_column = None

    for expected, got in zip(expected_columns.keys(), header):
        jsim = jaro_similarity(expected, got) 
        if jsim < min_similarity :
            min_similarity = jsim
            min_column = expected + ' / ' + got
    
    
    logger.debug("Minimum similarity: %s",  "{:.2}".format(min_similarity) )
    if min_column:
        logger.debug("On expected/got: %s", str(min_column))

    if  min_similarity >= MINIMUM_SIMILARITY :  # Good enough to trust
        
        sfd  = Table("salesforcedonations", metadata, autoload=True, autoload_with=engine)

        seen_header = False  # Used to skip header row

        # Stats for import
        dupes = 0
        other_integrity = 0
        other_exceptions = 0
        row_count = 0
        missing_contact_id = 0

        for row in ws.values:        
            if seen_header: 
                row_count += 1
                if row_count % 1000 == 0:
                    logger.debug("Row: %s",  str(row_count) )
                zrow = dict(zip(expected_columns.values(), row))  
                # zrow is a dict of db_col:value pairs, with at most one key being None (as it overwrote any previous)
                # We need to remove the None item, if it exists
                try:
                    del zrow[None]
                except KeyError:
                    pass 

                #  Cleanup time!  Many older imports have... peculiarities 
                if zrow['amount'] == None:  # We get some with no value, probably user error
                    zrow['amount'] = 0.0    # Setting bad amounts to 0 as per KF

                if zrow['recurring_donor'] == '=FALSE()' :
                    zrow['recurring_donor'] = False

                if zrow['recurring_donor'] == '=TRUE()' :
                    zrow['recurring_donor'] = True

                #  End cleanup 

                if zrow['contact_id'] :  # No point in importing if there's nothing to match
                    # Finally ready to insert row into the table
                    # 

                    stmt = Insert(sfd).values(zrow)

                    skip_dupes = stmt.on_conflict_do_nothing(
                        constraint='uq_donation'
                       )
                    try:
                        result = conn.execute(skip_dupes)
                    except exc.IntegrityError as e:  # Catch-all for several more specific exceptions
                        if  re.match('duplicate key value', str(e.orig) ):
                            dupes += 1
                            pass
                        else:
                            other_integrity += 1
                            logger.error(e)
                    except Exception as e: 
                        other_exceptions += 1
                        logger.error(e)
                 
                else: # Missing contact_id
                    missing_contact_id += 1


            else:  # Haven't seen header, so this was first row.
                seen_header = True

        # NOTE: we now run this in a engine.begin() context manager, so our
        # parent will commit. Don't commit here!


        logger.debug("Stats: Total rows: %s  Dupes: %s   Missing contact_id: %s",  str(row_count) ,  str(dupes),  str(missing_contact_id) )
        logger.debug("Other integrity exceptions: %s    Other exceptions: %s",  str(other_integrity),  str(other_exceptions) )
        wb.close()
        return { True : "File imported" }

    else:  # Similarity too low 
        wb.close()
        logger.warn("Similarity value of  %s   is below threshold of  %s  so file was not processed ", '{:.2}'.format(min_similarity),   str(MINIMUM_SIMILARITY))  
        return {False : "Similarity to expected column names below threshold"}


src/server/constants.py METASEP
import os

# Determine if app is ran from docker or local by testing the env var "IS_LOCAL"
IS_LOCAL = os.getenv("IS_LOCAL")
BASE_PATH = "../local_files/" if IS_LOCAL == "True" else "/app/static/"


# Initiate local file system
RAW_DATA_PATH = BASE_PATH + "raw_data/"
OUTPUT_PATH = BASE_PATH + "output/"
LOGS_PATH = BASE_PATH + "logs/"
REPORT_PATH = OUTPUT_PATH + "reports/"
ZIPPED_FILES = BASE_PATH + "zipped/"
src/server/config.py METASEP
import os
import sys
import sqlalchemy as db
import models
from constants import IS_LOCAL, BASE_PATH, RAW_DATA_PATH, OUTPUT_PATH, LOGS_PATH, REPORT_PATH, ZIPPED_FILES

import logging
import structlog
from structlog.processors import CallsiteParameter


# structlog setup for complete app

# Formatters
shared_processors=[
        structlog.contextvars.merge_contextvars,
        structlog.processors.add_log_level,
        structlog.processors.StackInfoRenderer(),
        structlog.dev.set_exc_info,
        structlog.processors.TimeStamper(fmt="iso", utc=True ),
        structlog.processors.CallsiteParameterAdder(
            [
                CallsiteParameter.FILENAME,
                CallsiteParameter.FUNC_NAME,
                CallsiteParameter.LINENO,
            ])
        ]

# Select output processor depending if running locally/interactively or not
if sys.stderr.isatty():   # Pretty-print
        processors = shared_processors + [structlog.dev.ConsoleRenderer(), ]
else:   # Emit structured/JSON
        processors = shared_processors +  [ structlog.processors.dict_tracebacks, structlog.processors.JSONRenderer(), ]

structlog.configure(
    processors=processors, 
    wrapper_class=structlog.make_filtering_bound_logger(logging.NOTSET),
    context_class=dict,
    logger_factory=structlog.PrintLoggerFactory(),
    cache_logger_on_first_use=False
)
logger = structlog.get_logger()


# Initiate postgres DB
# best practices is to have only one engine per application process
# https://docs.sqlalchemy.org/en/13/core/connections.html
POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", "thispasswordisverysecure")
POSTGRES_DATABASE = os.getenv("POSTGRES_DATABASE", "paws")
POSTGRES_USER = os.getenv("POSTGRES_USER", "postgres")

if IS_LOCAL == "True":
    DB = os.getenv(
        "LOCAL_DB_IP",
        "postgresql://postgres:"
        + POSTGRES_PASSWORD
        + "@localhost:5432/"
        + POSTGRES_DATABASE,
    )
else:
    DB = (
        "postgresql://"
        + POSTGRES_USER
        + ":"
        + POSTGRES_PASSWORD
        + "@paws-compose-db/"
        + POSTGRES_DATABASE
    )

engine = db.create_engine(DB)

# Run Alembic to create managed tables
# from alembic.config import Config
# from alembic import command

# alembic_cfg = Config("alembic.ini")
# command.stamp(alembic_cfg, "head")

# logger.warn("Testing")

with engine.connect() as connection:
    import db_setup.base_users
    db_setup.base_users.create_base_roles()  # IFF there are no roles already
    db_setup.base_users.create_base_users()  # IFF there are no users already
    db_setup.base_users.populate_sl_event_types()  # IFF there are no event types already
    db_setup.base_users.populate_rfm_mapping_table()   # Set to True to force loading latest version of populate script
                                                                       # found in the server/alembic directory

# Create these directories only one time - when initializing
if not os.path.isdir(BASE_PATH):
    os.makedirs(BASE_PATH, exist_ok=True)
    os.makedirs(RAW_DATA_PATH, exist_ok=True)
    os.makedirs(OUTPUT_PATH, exist_ok=True)
    os.makedirs(LOGS_PATH, exist_ok=True)
    os.makedirs(RAW_DATA_PATH, exist_ok=True)
    os.makedirs(REPORT_PATH, exist_ok=True)
    os.makedirs(ZIPPED_FILES, exist_ok=True)

src/server/app.py METASEP
import os

import structlog
logger = structlog.get_logger()

from flask import Flask

from flask_jwt_extended import JWTManager

try:   
    from secrets_dict import JWT_SECRET, APP_SECRET_KEY
except ImportError:   
    # Not running locally
    logger.info("Could not get secrets from file, trying environment **********")
    from os import environ

    try:
        JWT_SECRET = environ['JWT_SECRET']
        APP_SECRET_KEY = environ['APP_SECRET_KEY']
    except KeyError:
        # Nor in environment
        # You're SOL for now
        logger.critical("Couldn't get secrets from file or environment")



# logger = structlog.get_logger()


app = Flask(__name__)


app.config["JWT_SECRET_KEY"] = JWT_SECRET  
app.config["JWT_MAX_TIMEOUT"] = 30*60 #Seconds

 # We'll use max for default but can be reduced for testing
app.config["JWT_ACCESS_TOKEN_EXPIRES"] =  app.config["JWT_MAX_TIMEOUT"] 

jwt = JWTManager(app)


app.secret_key = APP_SECRET_KEY
app.config["MAX_CONTENT_LENGTH"] = 500 * 1024 * 1024  # 500 Megs
app.config["SEND_FILE_MAX_AGE_DEFAULT"] = 0

from api.admin_api import admin_api
from api.common_api import common_api
from api.user_api import user_api
from api.internal_api import internal_api


#  Emit a log entry at each level
app.register_blueprint(admin_api)
app.register_blueprint(common_api)
app.register_blueprint(user_api)
app.register_blueprint(internal_api)


# init_db_schema.start(connection)
logger.debug("Log sample - debug")        
logger.info("Log sample - info")    
logger.warn("Log sample - warn")
logger.error("Log sample - error")
logger.critical("Log sample - critical")

if __name__ == "__main__":
    FLASK_PORT = os.getenv("FLASK_PORT", None)

    # create_app()
    app.run(host="0.0.0.0", debug=True, port=FLASK_PORT)

src/server/pub_sub/stubs/pubsub_api_pb2_grpc.py METASEP

# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
                    servicer.GetSchema,
                    request_deserializer=pubsub__api__pb2.SchemaRequest.FromString,
                    response_serializer=pubsub__api__pb2.SchemaInfo.SerializeToString,
            ),
            'GetTopic': grpc.unary_unary_rpc_method_handler(
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
                    servicer.GetSchema,
                    request_deserializer=pubsub__api__pb2.SchemaRequest.FromString,
                    response_serializer=pubsub__api__pb2.SchemaInfo.SerializeToString,
            ),
            'GetTopic': grpc.unary_unary_rpc_method_handler(
                    servicer.GetTopic,
                    request_deserializer=pubsub__api__pb2.TopicRequest.FromString,
                    response_serializer=pubsub__api__pb2.TopicInfo.SerializeToString,
            ),
            'Publish': grpc.unary_unary_rpc_method_handler(
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
                    servicer.GetSchema,
                    request_deserializer=pubsub__api__pb2.SchemaRequest.FromString,
                    response_serializer=pubsub__api__pb2.SchemaInfo.SerializeToString,
            ),
            'GetTopic': grpc.unary_unary_rpc_method_handler(
                    servicer.GetTopic,
                    request_deserializer=pubsub__api__pb2.TopicRequest.FromString,
                    response_serializer=pubsub__api__pb2.TopicInfo.SerializeToString,
            ),
            'Publish': grpc.unary_unary_rpc_method_handler(
                    servicer.Publish,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
            'PublishStream': grpc.stream_stream_rpc_method_handler(
infile
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
non_informative
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

non_informative
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
                    servicer.GetSchema,
                    request_deserializer=pubsub__api__pb2.SchemaRequest.FromString,
                    response_serializer=pubsub__api__pb2.SchemaInfo.SerializeToString,
            ),
            'GetTopic': grpc.unary_unary_rpc_method_handler(
                    servicer.GetTopic,
                    request_deserializer=pubsub__api__pb2.TopicRequest.FromString,
                    response_serializer=pubsub__api__pb2.TopicInfo.SerializeToString,
            ),
            'Publish': grpc.unary_unary_rpc_method_handler(
                    servicer.Publish,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
            'PublishStream': grpc.stream_stream_rpc_method_handler(
                    servicer.PublishStream,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
    }
    generic_handler = grpc.method_handlers_generic_handler(
            'eventbus.v1.PubSub', rpc_method_handlers)
    server.add_generic_rpc_handlers((generic_handler,))


 # This class is part of an EXPERIMENTAL API.
class PubSub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

non_informative
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
non_informative
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
non_informative
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
                    servicer.GetSchema,
                    request_deserializer=pubsub__api__pb2.SchemaRequest.FromString,
                    response_serializer=pubsub__api__pb2.SchemaInfo.SerializeToString,
            ),
            'GetTopic': grpc.unary_unary_rpc_method_handler(
                    servicer.GetTopic,
                    request_deserializer=pubsub__api__pb2.TopicRequest.FromString,
                    response_serializer=pubsub__api__pb2.TopicInfo.SerializeToString,
            ),
            'Publish': grpc.unary_unary_rpc_method_handler(
                    servicer.Publish,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
            'PublishStream': grpc.stream_stream_rpc_method_handler(
                    servicer.PublishStream,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
    }
    generic_handler = grpc.method_handlers_generic_handler(
            'eventbus.v1.PubSub', rpc_method_handlers)
    server.add_generic_rpc_handlers((generic_handler,))


 # This class is part of an EXPERIMENTAL API.
class PubSub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    @staticmethod
    def Subscribe(request_iterator,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.stream_stream(request_iterator, target, '/eventbus.v1.PubSub/Subscribe',
            pubsub__api__pb2.FetchRequest.SerializeToString,
            pubsub__api__pb2.FetchResponse.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def GetSchema(request,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.unary_unary(request, target, '/eventbus.v1.PubSub/GetSchema',
            pubsub__api__pb2.SchemaRequest.SerializeToString,
            pubsub__api__pb2.SchemaInfo.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def GetTopic(request,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.unary_unary(request, target, '/eventbus.v1.PubSub/GetTopic',
            pubsub__api__pb2.TopicRequest.SerializeToString,
            pubsub__api__pb2.TopicInfo.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def Publish(request,
            target,
random
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
                    servicer.GetSchema,
                    request_deserializer=pubsub__api__pb2.SchemaRequest.FromString,
                    response_serializer=pubsub__api__pb2.SchemaInfo.SerializeToString,
            ),
            'GetTopic': grpc.unary_unary_rpc_method_handler(
                    servicer.GetTopic,
                    request_deserializer=pubsub__api__pb2.TopicRequest.FromString,
                    response_serializer=pubsub__api__pb2.TopicInfo.SerializeToString,
            ),
            'Publish': grpc.unary_unary_rpc_method_handler(
                    servicer.Publish,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
            'PublishStream': grpc.stream_stream_rpc_method_handler(
                    servicer.PublishStream,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
    }
    generic_handler = grpc.method_handlers_generic_handler(
            'eventbus.v1.PubSub', rpc_method_handlers)
    server.add_generic_rpc_handlers((generic_handler,))


 # This class is part of an EXPERIMENTAL API.
class PubSub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    @staticmethod
    def Subscribe(request_iterator,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.stream_stream(request_iterator, target, '/eventbus.v1.PubSub/Subscribe',
            pubsub__api__pb2.FetchRequest.SerializeToString,
            pubsub__api__pb2.FetchResponse.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def GetSchema(request,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.unary_unary(request, target, '/eventbus.v1.PubSub/GetSchema',
            pubsub__api__pb2.SchemaRequest.SerializeToString,
            pubsub__api__pb2.SchemaInfo.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def GetTopic(request,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.unary_unary(request, target, '/eventbus.v1.PubSub/GetTopic',
            pubsub__api__pb2.TopicRequest.SerializeToString,
            pubsub__api__pb2.TopicInfo.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def Publish(request,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.unary_unary(request, target, '/eventbus.v1.PubSub/Publish',
            pubsub__api__pb2.PublishRequest.SerializeToString,
            pubsub__api__pb2.PublishResponse.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def PublishStream(request_iterator,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.stream_stream(request_iterator, target, '/eventbus.v1.PubSub/PublishStream',
random
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
                    servicer.GetSchema,
                    request_deserializer=pubsub__api__pb2.SchemaRequest.FromString,
                    response_serializer=pubsub__api__pb2.SchemaInfo.SerializeToString,
            ),
            'GetTopic': grpc.unary_unary_rpc_method_handler(
                    servicer.GetTopic,
                    request_deserializer=pubsub__api__pb2.TopicRequest.FromString,
                    response_serializer=pubsub__api__pb2.TopicInfo.SerializeToString,
            ),
            'Publish': grpc.unary_unary_rpc_method_handler(
                    servicer.Publish,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
            'PublishStream': grpc.stream_stream_rpc_method_handler(
                    servicer.PublishStream,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
    }
    generic_handler = grpc.method_handlers_generic_handler(
            'eventbus.v1.PubSub', rpc_method_handlers)
    server.add_generic_rpc_handlers((generic_handler,))


 # This class is part of an EXPERIMENTAL API.
class PubSub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    @staticmethod
    def Subscribe(request_iterator,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.stream_stream(request_iterator, target, '/eventbus.v1.PubSub/Subscribe',
            pubsub__api__pb2.FetchRequest.SerializeToString,
            pubsub__api__pb2.FetchResponse.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def GetSchema(request,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.unary_unary(request, target, '/eventbus.v1.PubSub/GetSchema',
            pubsub__api__pb2.SchemaRequest.SerializeToString,
            pubsub__api__pb2.SchemaInfo.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

    @staticmethod
    def GetTopic(request,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
random
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from pub_sub.stubs import pubsub_api_pb2 as pubsub__api__pb2


class PubSubStub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.Subscribe = channel.stream_stream(
                '/eventbus.v1.PubSub/Subscribe',
                request_serializer=pubsub__api__pb2.FetchRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.FetchResponse.FromString,
                )
        self.GetSchema = channel.unary_unary(
                '/eventbus.v1.PubSub/GetSchema',
                request_serializer=pubsub__api__pb2.SchemaRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.SchemaInfo.FromString,
                )
        self.GetTopic = channel.unary_unary(
                '/eventbus.v1.PubSub/GetTopic',
                request_serializer=pubsub__api__pb2.TopicRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.TopicInfo.FromString,
                )
        self.Publish = channel.unary_unary(
                '/eventbus.v1.PubSub/Publish',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )
        self.PublishStream = channel.stream_stream(
                '/eventbus.v1.PubSub/PublishStream',
                request_serializer=pubsub__api__pb2.PublishRequest.SerializeToString,
                response_deserializer=pubsub__api__pb2.PublishResponse.FromString,
                )


class PubSubServicer(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    def Subscribe(self, request_iterator, context):
        """
        Bidirectional streaming RPC to subscribe to a Topic. The subscription is pull-based. A client can request
        for more events as it consumes events. This enables a client to handle flow control based on the client's processing speed.

        Typical flow:
        1. Client requests for X number of events via FetchRequest.
        2. Server receives request and delivers events until X events are delivered to the client via one or more FetchResponse messages.
        3. Client consumes the FetchResponse messages as they come.
        4. Client issues new FetchRequest for Y more number of events. This request can
        come before the server has delivered the earlier requested X number of events
        so the client gets a continuous stream of events if any.

        If a client requests more events before the server finishes the last
        requested amount, the server appends the new amount to the current amount of
        events it still needs to fetch and deliver.

        A client can subscribe at any point in the stream by providing a replay option in the first FetchRequest.
        The replay option is honored for the first FetchRequest received from a client. Any subsequent FetchRequests with a
        new replay option are ignored. A client needs to call the Subscribe RPC again to restart the subscription
        at a new point in the stream.

        The first FetchRequest of the stream identifies the topic to subscribe to.
        If any subsequent FetchRequest provides topic_name, it must match what
        was provided in the first FetchRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetSchema(self, request, context):
        """Get the event schema for a topic based on a schema ID.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def GetTopic(self, request, context):
        """
        Get the topic Information related to the specified topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def Publish(self, request, context):
        """
        Send a publish request to synchronously publish events to a topic.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')

    def PublishStream(self, request_iterator, context):
        """
        Bidirectional Streaming RPC to publish events to the event bus.
        PublishRequest contains the batch of events to publish.

        The first PublishRequest of the stream identifies the topic to publish on.
        If any subsequent PublishRequest provides topic_name, it must match what
        was provided in the first PublishRequest; otherwise, the RPC returns an error
        with INVALID_ARGUMENT status.

        The server returns a PublishResponse for each PublishRequest when publish is
        complete for the batch. A client does not have to wait for a PublishResponse
        before sending a new PublishRequest, i.e. multiple publish batches can be queued
        up, which allows for higher publish rate as a client can asynchronously
        publish more events while publishes are still in flight on the server side.

        PublishResponse holds a PublishResult for each event published that indicates success
        or failure of the publish. A client can then retry the publish as needed before sending
        more PublishRequests for new events to publish.

        A client must send a valid publish request with one or more events every 70 seconds to hold on to the stream.
        Otherwise, the server closes the stream and notifies the client. Once the client is notified of the stream closure,
        it must make a new PublishStream call to resume publishing.
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_PubSubServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'Subscribe': grpc.stream_stream_rpc_method_handler(
                    servicer.Subscribe,
                    request_deserializer=pubsub__api__pb2.FetchRequest.FromString,
                    response_serializer=pubsub__api__pb2.FetchResponse.SerializeToString,
            ),
            'GetSchema': grpc.unary_unary_rpc_method_handler(
                    servicer.GetSchema,
                    request_deserializer=pubsub__api__pb2.SchemaRequest.FromString,
                    response_serializer=pubsub__api__pb2.SchemaInfo.SerializeToString,
            ),
            'GetTopic': grpc.unary_unary_rpc_method_handler(
                    servicer.GetTopic,
                    request_deserializer=pubsub__api__pb2.TopicRequest.FromString,
                    response_serializer=pubsub__api__pb2.TopicInfo.SerializeToString,
            ),
            'Publish': grpc.unary_unary_rpc_method_handler(
                    servicer.Publish,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
            'PublishStream': grpc.stream_stream_rpc_method_handler(
                    servicer.PublishStream,
                    request_deserializer=pubsub__api__pb2.PublishRequest.FromString,
                    response_serializer=pubsub__api__pb2.PublishResponse.SerializeToString,
            ),
    }
    generic_handler = grpc.method_handlers_generic_handler(
            'eventbus.v1.PubSub', rpc_method_handlers)
    server.add_generic_rpc_handlers((generic_handler,))


 # This class is part of an EXPERIMENTAL API.
class PubSub(object):
    """
    The Pub/Sub API provides a single interface for publishing and subscribing to platform events, including real-time
    event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.

    A session token is needed to authenticate. Any of the Salesforce supported
    OAuth flows can be used to obtain a session token:
    https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_flows.htm&type=5

    For each RPC, a client needs to pass authentication information
    as metadata headers (https://www.grpc.io/docs/guides/concepts/#metadata) with their method call.

    For Salesforce session token authentication, use:
    accesstoken : access token
    instanceurl : Salesforce instance URL
    tenantid : tenant/org id of the client

    StatusException is thrown in case of response failure for any request.
    """

    @staticmethod
    def Subscribe(request_iterator,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
random
        self.Subscribe = channel.stream_stream(                     servicer.Subscribe,         self.GetSchema = channel.unary_unary(         self.GetTopic = channel.unary_unary(                     servicer.GetSchema,         self.Publish = channel.unary_unary(                     servicer.GetTopic,         self.PublishStream = channel.stream_stream(                     servicer.Publish,                     servicer.PublishStream,         PublishResponse holds a PublishResult for each event published that indicates success     For each RPC, a client needs to pass authentication information         publish more events while publishes are still in flight on the server side.     event monitoring events, and change data capture events. The Pub/Sub API is a gRPC API that is based on HTTP/2.             options=(),             pubsub__api__pb2.PublishRequest.SerializeToString,             metadata=None):             insecure=False,