├── functions
├── .gitignore
├── package.json
├── index.js
└── package-lock.json
├── .firebaserc
├── public
├── robots.txt
├── favicon.ico
├── logo192.png
├── logo512.png
├── manifest.json
└── index.html
├── .github
└── FUNDING.yml
├── README.md
├── src
├── setupTests.js
├── App.test.js
├── index.css
├── index.js
├── logo.svg
├── App.css
├── App.js
└── serviceWorker.js
├── firebase.json
├── .gitignore
└── package.json
/functions/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "fireship-demos"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fireship-io/react-firebase-chat/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fireship-io/react-firebase-chat/HEAD/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fireship-io/react-firebase-chat/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [codediodeio]
4 | custom: ['https://fireship.io/pro']
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # React Firebase Super Chat
2 |
3 | A simple fullstack chat demo with React and Firebase.
4 |
5 | Watch on full [React Firebase Chat Tutorial](https://youtu.be/zQyrwxMPm88) on YouTube.
6 |
7 | [Live demo](https://fireship-demos.web.app/)
--------------------------------------------------------------------------------
/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom/extend-expect';
6 |
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "build",
4 | "ignore": [
5 | "firebase.json",
6 | "**/.*",
7 | "**/node_modules/**"
8 | ],
9 | "rewrites": [
10 | {
11 | "source": "**",
12 | "destination": "/index.html"
13 | }
14 | ]
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { render } from '@testing-library/react';
3 | import App from './App';
4 |
5 | test('renders learn react link', () => {
6 | const { getByText } = render();
7 | const linkElement = getByText(/learn react/i);
8 | expect(linkElement).toBeInTheDocument();
9 | });
10 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .firebase
8 |
9 | # testing
10 | /coverage
11 |
12 | # production
13 | /build
14 |
15 | # misc
16 | .DS_Store
17 | .env.local
18 | .env.development.local
19 | .env.test.local
20 | .env.production.local
21 |
22 | npm-debug.log*
23 | yarn-debug.log*
24 | yarn-error.log*
25 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import * as serviceWorker from './serviceWorker';
6 |
7 | ReactDOM.render(
8 |
9 |
10 | ,
11 | document.getElementById('root')
12 | );
13 |
14 | // If you want your app to work offline and load faster, you can change
15 | // unregister() to register() below. Note this comes with some pitfalls.
16 | // Learn more about service workers: https://bit.ly/CRA-PWA
17 | serviceWorker.unregister();
18 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/functions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "description": "Cloud Functions for Firebase",
4 | "scripts": {
5 | "serve": "firebase emulators:start --only functions",
6 | "shell": "firebase functions:shell",
7 | "start": "npm run shell",
8 | "deploy": "firebase deploy --only functions",
9 | "logs": "firebase functions:log"
10 | },
11 | "engines": {
12 | "node": "10"
13 | },
14 | "dependencies": {
15 | "bad-words": "^3.0.3",
16 | "firebase-admin": "^8.10.0",
17 | "firebase-functions": "^3.6.1"
18 | },
19 | "devDependencies": {
20 | "firebase-functions-test": "^0.2.0"
21 | },
22 | "private": true
23 | }
24 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-chat",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^4.2.4",
7 | "@testing-library/react": "^9.5.0",
8 | "@testing-library/user-event": "^7.2.1",
9 | "firebase": "^7.20.0",
10 | "react": "^16.13.1",
11 | "react-dom": "^16.13.1",
12 | "react-firebase-hooks": "^2.2.0",
13 | "react-scripts": "3.4.3"
14 | },
15 | "scripts": {
16 | "start": "react-scripts start",
17 | "build": "react-scripts build",
18 | "test": "react-scripts test",
19 | "eject": "react-scripts eject"
20 | },
21 | "eslintConfig": {
22 | "extends": "react-app"
23 | },
24 | "browserslist": {
25 | "production": [
26 | ">0.2%",
27 | "not dead",
28 | "not op_mini all"
29 | ],
30 | "development": [
31 | "last 1 chrome version",
32 | "last 1 firefox version",
33 | "last 1 safari version"
34 | ]
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/functions/index.js:
--------------------------------------------------------------------------------
1 | const functions = require('firebase-functions');
2 | const Filter = require('bad-words');
3 | const admin = require('firebase-admin');
4 | admin.initializeApp();
5 |
6 | const db = admin.firestore();
7 |
8 | exports.detectEvilUsers = functions.firestore
9 | .document('messages/{msgId}')
10 | .onCreate(async (doc, ctx) => {
11 |
12 | const filter = new Filter();
13 | const { text, uid } = doc.data();
14 |
15 |
16 | if (filter.isProfane(text)) {
17 |
18 | const cleaned = filter.clean(text);
19 | await doc.ref.update({text: `🤐 I got BANNED for life for saying... ${cleaned}`});
20 |
21 | await db.collection('banned').doc(uid).set({});
22 | }
23 |
24 | const userRef = db.collection('users').doc(uid)
25 |
26 | const userData = (await userRef.get()).data();
27 |
28 | if (userData.msgCount >= 7) {
29 | await db.collection('banned').doc(uid).set({});
30 | } else {
31 | await userRef.set({ msgCount: (userData.msgCount || 0) + 1 })
32 | }
33 |
34 | });
35 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
14 |
15 |
16 |
20 |
21 |
30 | React Firebase Superchat
31 |
32 |
33 |
34 |
35 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #282c34;
3 | }
4 |
5 | .App {
6 | text-align: center;
7 | max-width: 728px;
8 | margin: 0 auto;
9 | }
10 |
11 | .App header {
12 | background-color: #181717;
13 | height: 10vh;
14 | min-height: 50px;
15 | color: white;
16 | position: fixed;
17 | width: 100%;
18 | max-width: 728px;
19 | top: 0;
20 | display: flex;
21 | align-items: center;
22 | justify-content: space-between;
23 | z-index: 99;
24 | padding: 10px;
25 | box-sizing: border-box;
26 | }
27 |
28 | .App section {
29 | display: flex;
30 | flex-direction: column;
31 | justify-content: center;
32 | min-height: 100vh;
33 | background-color: rgb(40, 37, 53);
34 | }
35 |
36 | main {
37 | padding: 10px;
38 | height: 80vh;
39 | margin: 10vh 0 10vh;
40 | overflow-y: scroll;
41 | display: flex;
42 | flex-direction: column;
43 | }
44 |
45 | main::-webkit-scrollbar {
46 | width: 0.25rem;
47 | }
48 |
49 | main::-webkit-scrollbar-track {
50 | background: #1e1e24;
51 | }
52 |
53 | main::-webkit-scrollbar-thumb {
54 | background: #6649b8;
55 | }
56 |
57 | form {
58 | height: 10vh;
59 | position: fixed;
60 | bottom: 0;
61 | background-color: rgb(24, 23, 23);
62 | width: 100%;
63 | max-width: 728px;
64 | display: flex;
65 | font-size: 1.5rem;
66 | }
67 |
68 | form button {
69 | width: 20%;
70 | background-color: rgb(56, 56, 143);
71 | }
72 |
73 |
74 | input {
75 | line-height: 1.5;
76 | width: 100%;
77 | font-size: 1.5rem;
78 | background: rgb(58, 58, 58);
79 | color: white;
80 | outline: none;
81 | border: none;
82 | padding: 0 10px;
83 | }
84 |
85 | button {
86 | background-color: #282c34; /* Green */
87 | border: none;
88 | color: white;
89 | padding: 15px 32px;
90 | text-align: center;
91 | text-decoration: none;
92 | display: inline-block;
93 | cursor: pointer;
94 | font-size: 1.25rem;
95 | }
96 |
97 | button:disabled {
98 | opacity: 0.5;
99 | cursor: not-allowed;
100 | }
101 |
102 |
103 | .sign-in {
104 | color: #282c34;
105 | background: white;
106 | max-width: 400px;
107 | margin: 0 auto;
108 | }
109 |
110 |
111 |
112 |
113 | ul, li {
114 | text-align: left;
115 | list-style: none;
116 | }
117 |
118 | p {
119 | max-width: 500px;
120 | margin-bottom: 12px;
121 | line-height: 24px;
122 | padding: 10px 20px;
123 | border-radius: 25px;
124 | position: relative;
125 | color: white;
126 | text-align: center;
127 | }
128 |
129 | .message {
130 | display: flex;
131 | align-items: center;
132 | }
133 |
134 |
135 | .sent {
136 | flex-direction: row-reverse;
137 | }
138 |
139 | .sent p {
140 | color: white;
141 | background: #0b93f6;
142 | align-self: flex-end;
143 | }
144 | .received p {
145 | background: #e5e5ea;
146 | color: black;
147 | }
148 |
149 | img {
150 | width: 40px;
151 | height: 40px;
152 | border-radius: 50%;
153 | margin: 2px 5px;
154 | }
155 |
156 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { useRef, useState } from 'react';
2 | import './App.css';
3 |
4 | import firebase from 'firebase/app';
5 | import 'firebase/firestore';
6 | import 'firebase/auth';
7 | import 'firebase/analytics';
8 |
9 | import { useAuthState } from 'react-firebase-hooks/auth';
10 | import { useCollectionData } from 'react-firebase-hooks/firestore';
11 |
12 | firebase.initializeApp({
13 | // your config
14 | })
15 |
16 | const auth = firebase.auth();
17 | const firestore = firebase.firestore();
18 | const analytics = firebase.analytics();
19 |
20 |
21 | function App() {
22 |
23 | const [user] = useAuthState(auth);
24 |
25 | return (
26 |
27 |
31 |
32 |
35 |
36 |
37 | );
38 | }
39 |
40 | function SignIn() {
41 |
42 | const signInWithGoogle = () => {
43 | const provider = new firebase.auth.GoogleAuthProvider();
44 | auth.signInWithPopup(provider);
45 | }
46 |
47 | return (
48 | <>
49 |
50 | Do not violate the community guidelines or you will be banned for life!
51 | >
52 | )
53 |
54 | }
55 |
56 | function SignOut() {
57 | return auth.currentUser && (
58 |
59 | )
60 | }
61 |
62 |
63 | function ChatRoom() {
64 | const dummy = useRef();
65 | const messagesRef = firestore.collection('messages');
66 | const query = messagesRef.orderBy('createdAt').limit(25);
67 |
68 | const [messages] = useCollectionData(query, { idField: 'id' });
69 |
70 | const [formValue, setFormValue] = useState('');
71 |
72 |
73 | const sendMessage = async (e) => {
74 | e.preventDefault();
75 |
76 | const { uid, photoURL } = auth.currentUser;
77 |
78 | await messagesRef.add({
79 | text: formValue,
80 | createdAt: firebase.firestore.FieldValue.serverTimestamp(),
81 | uid,
82 | photoURL
83 | })
84 |
85 | setFormValue('');
86 | dummy.current.scrollIntoView({ behavior: 'smooth' });
87 | }
88 |
89 | return (<>
90 |
91 |
92 | {messages && messages.map(msg => )}
93 |
94 |
95 |
96 |
97 |
98 |
105 | >)
106 | }
107 |
108 |
109 | function ChatMessage(props) {
110 | const { text, uid, photoURL } = props.message;
111 |
112 | const messageClass = uid === auth.currentUser.uid ? 'sent' : 'received';
113 |
114 | return (<>
115 |
116 |

117 |
{text}
118 |
119 | >)
120 | }
121 |
122 |
123 | export default App;
124 |
--------------------------------------------------------------------------------
/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read https://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.0/8 are considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl, {
104 | headers: { 'Service-Worker': 'script' },
105 | })
106 | .then(response => {
107 | // Ensure service worker exists, and that we really are getting a JS file.
108 | const contentType = response.headers.get('content-type');
109 | if (
110 | response.status === 404 ||
111 | (contentType != null && contentType.indexOf('javascript') === -1)
112 | ) {
113 | // No service worker found. Probably a different app. Reload the page.
114 | navigator.serviceWorker.ready.then(registration => {
115 | registration.unregister().then(() => {
116 | window.location.reload();
117 | });
118 | });
119 | } else {
120 | // Service worker found. Proceed as normal.
121 | registerValidSW(swUrl, config);
122 | }
123 | })
124 | .catch(() => {
125 | console.log(
126 | 'No internet connection found. App is running in offline mode.'
127 | );
128 | });
129 | }
130 |
131 | export function unregister() {
132 | if ('serviceWorker' in navigator) {
133 | navigator.serviceWorker.ready
134 | .then(registration => {
135 | registration.unregister();
136 | })
137 | .catch(error => {
138 | console.error(error.message);
139 | });
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/functions/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "requires": true,
4 | "lockfileVersion": 1,
5 | "dependencies": {
6 | "@firebase/app-types": {
7 | "version": "0.6.1",
8 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz",
9 | "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg=="
10 | },
11 | "@firebase/auth-interop-types": {
12 | "version": "0.1.5",
13 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz",
14 | "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw=="
15 | },
16 | "@firebase/component": {
17 | "version": "0.1.19",
18 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz",
19 | "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==",
20 | "requires": {
21 | "@firebase/util": "0.3.2",
22 | "tslib": "^1.11.1"
23 | }
24 | },
25 | "@firebase/database": {
26 | "version": "0.6.12",
27 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.12.tgz",
28 | "integrity": "sha512-OLUxp8TkXiML4X5LWM5IACsSDvo3fcf4mTbTe5RF+N6TRFv0Svzlet5OgGIa3ET1dQvNiisrMX7zzRa0OTLs7Q==",
29 | "requires": {
30 | "@firebase/auth-interop-types": "0.1.5",
31 | "@firebase/component": "0.1.19",
32 | "@firebase/database-types": "0.5.2",
33 | "@firebase/logger": "0.2.6",
34 | "@firebase/util": "0.3.2",
35 | "faye-websocket": "0.11.3",
36 | "tslib": "^1.11.1"
37 | }
38 | },
39 | "@firebase/database-types": {
40 | "version": "0.5.2",
41 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.2.tgz",
42 | "integrity": "sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g==",
43 | "requires": {
44 | "@firebase/app-types": "0.6.1"
45 | }
46 | },
47 | "@firebase/logger": {
48 | "version": "0.2.6",
49 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz",
50 | "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw=="
51 | },
52 | "@firebase/util": {
53 | "version": "0.3.2",
54 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz",
55 | "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==",
56 | "requires": {
57 | "tslib": "^1.11.1"
58 | }
59 | },
60 | "@google-cloud/common": {
61 | "version": "2.4.0",
62 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.4.0.tgz",
63 | "integrity": "sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg==",
64 | "optional": true,
65 | "requires": {
66 | "@google-cloud/projectify": "^1.0.0",
67 | "@google-cloud/promisify": "^1.0.0",
68 | "arrify": "^2.0.0",
69 | "duplexify": "^3.6.0",
70 | "ent": "^2.2.0",
71 | "extend": "^3.0.2",
72 | "google-auth-library": "^5.5.0",
73 | "retry-request": "^4.0.0",
74 | "teeny-request": "^6.0.0"
75 | }
76 | },
77 | "@google-cloud/firestore": {
78 | "version": "3.8.6",
79 | "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.8.6.tgz",
80 | "integrity": "sha512-ox80NbrM1MLJgvAAUd1quFLx/ie/nSjrk1PtscSicpoYDlKb9e6j7pHrVpbopBMyliyfNl3tLJWaDh+x+uCXqw==",
81 | "optional": true,
82 | "requires": {
83 | "deep-equal": "^2.0.0",
84 | "functional-red-black-tree": "^1.0.1",
85 | "google-gax": "^1.15.3",
86 | "readable-stream": "^3.4.0",
87 | "through2": "^3.0.0"
88 | }
89 | },
90 | "@google-cloud/paginator": {
91 | "version": "2.0.3",
92 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz",
93 | "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==",
94 | "optional": true,
95 | "requires": {
96 | "arrify": "^2.0.0",
97 | "extend": "^3.0.2"
98 | }
99 | },
100 | "@google-cloud/projectify": {
101 | "version": "1.0.4",
102 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz",
103 | "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==",
104 | "optional": true
105 | },
106 | "@google-cloud/promisify": {
107 | "version": "1.0.4",
108 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz",
109 | "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==",
110 | "optional": true
111 | },
112 | "@google-cloud/storage": {
113 | "version": "4.7.0",
114 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.7.0.tgz",
115 | "integrity": "sha512-f0guAlbeg7Z0m3gKjCfBCu7FG9qS3M3oL5OQQxlvGoPtK7/qg3+W+KQV73O2/sbuS54n0Kh2mvT5K2FWzF5vVQ==",
116 | "optional": true,
117 | "requires": {
118 | "@google-cloud/common": "^2.1.1",
119 | "@google-cloud/paginator": "^2.0.0",
120 | "@google-cloud/promisify": "^1.0.0",
121 | "arrify": "^2.0.0",
122 | "compressible": "^2.0.12",
123 | "concat-stream": "^2.0.0",
124 | "date-and-time": "^0.13.0",
125 | "duplexify": "^3.5.0",
126 | "extend": "^3.0.2",
127 | "gaxios": "^3.0.0",
128 | "gcs-resumable-upload": "^2.2.4",
129 | "hash-stream-validation": "^0.2.2",
130 | "mime": "^2.2.0",
131 | "mime-types": "^2.0.8",
132 | "onetime": "^5.1.0",
133 | "p-limit": "^2.2.0",
134 | "pumpify": "^2.0.0",
135 | "readable-stream": "^3.4.0",
136 | "snakeize": "^0.1.0",
137 | "stream-events": "^1.0.1",
138 | "through2": "^3.0.0",
139 | "xdg-basedir": "^4.0.0"
140 | },
141 | "dependencies": {
142 | "gaxios": {
143 | "version": "3.2.0",
144 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz",
145 | "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==",
146 | "optional": true,
147 | "requires": {
148 | "abort-controller": "^3.0.0",
149 | "extend": "^3.0.2",
150 | "https-proxy-agent": "^5.0.0",
151 | "is-stream": "^2.0.0",
152 | "node-fetch": "^2.3.0"
153 | }
154 | }
155 | }
156 | },
157 | "@grpc/grpc-js": {
158 | "version": "1.0.5",
159 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.5.tgz",
160 | "integrity": "sha512-Hm+xOiqAhcpT9RYM8lc15dbQD7aQurM7ZU8ulmulepiPlN7iwBXXwP3vSBUimoFoApRqz7pSIisXU8pZaCB4og==",
161 | "optional": true,
162 | "requires": {
163 | "semver": "^6.2.0"
164 | }
165 | },
166 | "@grpc/proto-loader": {
167 | "version": "0.5.5",
168 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz",
169 | "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==",
170 | "optional": true,
171 | "requires": {
172 | "lodash.camelcase": "^4.3.0",
173 | "protobufjs": "^6.8.6"
174 | }
175 | },
176 | "@protobufjs/aspromise": {
177 | "version": "1.1.2",
178 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
179 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=",
180 | "optional": true
181 | },
182 | "@protobufjs/base64": {
183 | "version": "1.1.2",
184 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
185 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
186 | "optional": true
187 | },
188 | "@protobufjs/codegen": {
189 | "version": "2.0.4",
190 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
191 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
192 | "optional": true
193 | },
194 | "@protobufjs/eventemitter": {
195 | "version": "1.1.0",
196 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
197 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=",
198 | "optional": true
199 | },
200 | "@protobufjs/fetch": {
201 | "version": "1.1.0",
202 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
203 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
204 | "optional": true,
205 | "requires": {
206 | "@protobufjs/aspromise": "^1.1.1",
207 | "@protobufjs/inquire": "^1.1.0"
208 | }
209 | },
210 | "@protobufjs/float": {
211 | "version": "1.0.2",
212 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
213 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=",
214 | "optional": true
215 | },
216 | "@protobufjs/inquire": {
217 | "version": "1.1.0",
218 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
219 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=",
220 | "optional": true
221 | },
222 | "@protobufjs/path": {
223 | "version": "1.1.2",
224 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
225 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=",
226 | "optional": true
227 | },
228 | "@protobufjs/pool": {
229 | "version": "1.1.0",
230 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
231 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=",
232 | "optional": true
233 | },
234 | "@protobufjs/utf8": {
235 | "version": "1.1.0",
236 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
237 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
238 | "optional": true
239 | },
240 | "@tootallnate/once": {
241 | "version": "1.1.2",
242 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
243 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
244 | "optional": true
245 | },
246 | "@types/body-parser": {
247 | "version": "1.19.0",
248 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
249 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
250 | "requires": {
251 | "@types/connect": "*",
252 | "@types/node": "*"
253 | }
254 | },
255 | "@types/connect": {
256 | "version": "3.4.33",
257 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
258 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==",
259 | "requires": {
260 | "@types/node": "*"
261 | }
262 | },
263 | "@types/express": {
264 | "version": "4.17.3",
265 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz",
266 | "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==",
267 | "requires": {
268 | "@types/body-parser": "*",
269 | "@types/express-serve-static-core": "*",
270 | "@types/serve-static": "*"
271 | }
272 | },
273 | "@types/express-serve-static-core": {
274 | "version": "4.17.12",
275 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.12.tgz",
276 | "integrity": "sha512-EaEdY+Dty1jEU7U6J4CUWwxL+hyEGMkO5jan5gplfegUgCUsIUWqXxqw47uGjimeT4Qgkz/XUfwoau08+fgvKA==",
277 | "requires": {
278 | "@types/node": "*",
279 | "@types/qs": "*",
280 | "@types/range-parser": "*"
281 | }
282 | },
283 | "@types/fs-extra": {
284 | "version": "8.1.1",
285 | "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz",
286 | "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==",
287 | "optional": true,
288 | "requires": {
289 | "@types/node": "*"
290 | }
291 | },
292 | "@types/lodash": {
293 | "version": "4.14.161",
294 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.161.tgz",
295 | "integrity": "sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA==",
296 | "dev": true
297 | },
298 | "@types/long": {
299 | "version": "4.0.1",
300 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
301 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==",
302 | "optional": true
303 | },
304 | "@types/mime": {
305 | "version": "2.0.3",
306 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz",
307 | "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q=="
308 | },
309 | "@types/node": {
310 | "version": "8.10.63",
311 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.63.tgz",
312 | "integrity": "sha512-g+nSkeHFDd2WOQChfmy9SAXLywT47WZBrGS/NC5ym5PJ8c8RC6l4pbGaUW/X0+eZJnXw6/AVNEouXWhV4iz72Q=="
313 | },
314 | "@types/qs": {
315 | "version": "6.9.4",
316 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz",
317 | "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ=="
318 | },
319 | "@types/range-parser": {
320 | "version": "1.2.3",
321 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
322 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
323 | },
324 | "@types/serve-static": {
325 | "version": "1.13.5",
326 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz",
327 | "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==",
328 | "requires": {
329 | "@types/express-serve-static-core": "*",
330 | "@types/mime": "*"
331 | }
332 | },
333 | "abort-controller": {
334 | "version": "3.0.0",
335 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
336 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
337 | "optional": true,
338 | "requires": {
339 | "event-target-shim": "^5.0.0"
340 | }
341 | },
342 | "accepts": {
343 | "version": "1.3.7",
344 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
345 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
346 | "requires": {
347 | "mime-types": "~2.1.24",
348 | "negotiator": "0.6.2"
349 | }
350 | },
351 | "agent-base": {
352 | "version": "6.0.1",
353 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz",
354 | "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==",
355 | "optional": true,
356 | "requires": {
357 | "debug": "4"
358 | }
359 | },
360 | "array-filter": {
361 | "version": "1.0.0",
362 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz",
363 | "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=",
364 | "optional": true
365 | },
366 | "array-flatten": {
367 | "version": "1.1.1",
368 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
369 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
370 | },
371 | "arrify": {
372 | "version": "2.0.1",
373 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
374 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
375 | "optional": true
376 | },
377 | "available-typed-arrays": {
378 | "version": "1.0.2",
379 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz",
380 | "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==",
381 | "optional": true,
382 | "requires": {
383 | "array-filter": "^1.0.0"
384 | }
385 | },
386 | "bad-words": {
387 | "version": "3.0.3",
388 | "resolved": "https://registry.npmjs.org/bad-words/-/bad-words-3.0.3.tgz",
389 | "integrity": "sha512-To+nGz+U8SpEQieZ2kSadY/1hVO88UXAslCJuTgLjDOuGrs/tNW2BYwl0fctxcRLooe0nzYN1pGzgvRIrd0BeA==",
390 | "requires": {
391 | "badwords-list": "^1.0.0"
392 | }
393 | },
394 | "badwords-list": {
395 | "version": "1.0.0",
396 | "resolved": "https://registry.npmjs.org/badwords-list/-/badwords-list-1.0.0.tgz",
397 | "integrity": "sha1-XphW2/E0gqKVw7CzBK+51M/FxXk="
398 | },
399 | "base64-js": {
400 | "version": "1.3.1",
401 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
402 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
403 | "optional": true
404 | },
405 | "bignumber.js": {
406 | "version": "9.0.0",
407 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
408 | "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
409 | "optional": true
410 | },
411 | "body-parser": {
412 | "version": "1.19.0",
413 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
414 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
415 | "requires": {
416 | "bytes": "3.1.0",
417 | "content-type": "~1.0.4",
418 | "debug": "2.6.9",
419 | "depd": "~1.1.2",
420 | "http-errors": "1.7.2",
421 | "iconv-lite": "0.4.24",
422 | "on-finished": "~2.3.0",
423 | "qs": "6.7.0",
424 | "raw-body": "2.4.0",
425 | "type-is": "~1.6.17"
426 | },
427 | "dependencies": {
428 | "debug": {
429 | "version": "2.6.9",
430 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
431 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
432 | "requires": {
433 | "ms": "2.0.0"
434 | }
435 | },
436 | "ms": {
437 | "version": "2.0.0",
438 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
439 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
440 | }
441 | }
442 | },
443 | "buffer-equal-constant-time": {
444 | "version": "1.0.1",
445 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
446 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
447 | },
448 | "buffer-from": {
449 | "version": "1.1.1",
450 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
451 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
452 | "optional": true
453 | },
454 | "bytes": {
455 | "version": "3.1.0",
456 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
457 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
458 | },
459 | "compressible": {
460 | "version": "2.0.18",
461 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
462 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
463 | "optional": true,
464 | "requires": {
465 | "mime-db": ">= 1.43.0 < 2"
466 | }
467 | },
468 | "concat-stream": {
469 | "version": "2.0.0",
470 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
471 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
472 | "optional": true,
473 | "requires": {
474 | "buffer-from": "^1.0.0",
475 | "inherits": "^2.0.3",
476 | "readable-stream": "^3.0.2",
477 | "typedarray": "^0.0.6"
478 | }
479 | },
480 | "configstore": {
481 | "version": "5.0.1",
482 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
483 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
484 | "optional": true,
485 | "requires": {
486 | "dot-prop": "^5.2.0",
487 | "graceful-fs": "^4.1.2",
488 | "make-dir": "^3.0.0",
489 | "unique-string": "^2.0.0",
490 | "write-file-atomic": "^3.0.0",
491 | "xdg-basedir": "^4.0.0"
492 | }
493 | },
494 | "content-disposition": {
495 | "version": "0.5.3",
496 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
497 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
498 | "requires": {
499 | "safe-buffer": "5.1.2"
500 | },
501 | "dependencies": {
502 | "safe-buffer": {
503 | "version": "5.1.2",
504 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
505 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
506 | }
507 | }
508 | },
509 | "content-type": {
510 | "version": "1.0.4",
511 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
512 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
513 | },
514 | "cookie": {
515 | "version": "0.4.0",
516 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
517 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
518 | },
519 | "cookie-signature": {
520 | "version": "1.0.6",
521 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
522 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
523 | },
524 | "core-util-is": {
525 | "version": "1.0.2",
526 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
527 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
528 | "optional": true
529 | },
530 | "cors": {
531 | "version": "2.8.5",
532 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
533 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
534 | "requires": {
535 | "object-assign": "^4",
536 | "vary": "^1"
537 | }
538 | },
539 | "crypto-random-string": {
540 | "version": "2.0.0",
541 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
542 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
543 | "optional": true
544 | },
545 | "date-and-time": {
546 | "version": "0.13.1",
547 | "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.13.1.tgz",
548 | "integrity": "sha512-/Uge9DJAT+s+oAcDxtBhyR8+sKjUnZbYmyhbmWjTHNtX7B7oWD8YyYdeXcBRbwSj6hVvj+IQegJam7m7czhbFw==",
549 | "optional": true
550 | },
551 | "debug": {
552 | "version": "4.1.1",
553 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
554 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
555 | "optional": true,
556 | "requires": {
557 | "ms": "^2.1.1"
558 | }
559 | },
560 | "deep-equal": {
561 | "version": "2.0.3",
562 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz",
563 | "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==",
564 | "optional": true,
565 | "requires": {
566 | "es-abstract": "^1.17.5",
567 | "es-get-iterator": "^1.1.0",
568 | "is-arguments": "^1.0.4",
569 | "is-date-object": "^1.0.2",
570 | "is-regex": "^1.0.5",
571 | "isarray": "^2.0.5",
572 | "object-is": "^1.1.2",
573 | "object-keys": "^1.1.1",
574 | "object.assign": "^4.1.0",
575 | "regexp.prototype.flags": "^1.3.0",
576 | "side-channel": "^1.0.2",
577 | "which-boxed-primitive": "^1.0.1",
578 | "which-collection": "^1.0.1",
579 | "which-typed-array": "^1.1.2"
580 | }
581 | },
582 | "define-properties": {
583 | "version": "1.1.3",
584 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
585 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
586 | "requires": {
587 | "object-keys": "^1.0.12"
588 | }
589 | },
590 | "depd": {
591 | "version": "1.1.2",
592 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
593 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
594 | },
595 | "destroy": {
596 | "version": "1.0.4",
597 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
598 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
599 | },
600 | "dicer": {
601 | "version": "0.3.0",
602 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
603 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
604 | "requires": {
605 | "streamsearch": "0.1.2"
606 | }
607 | },
608 | "dot-prop": {
609 | "version": "5.3.0",
610 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
611 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
612 | "optional": true,
613 | "requires": {
614 | "is-obj": "^2.0.0"
615 | }
616 | },
617 | "duplexify": {
618 | "version": "3.7.1",
619 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
620 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
621 | "optional": true,
622 | "requires": {
623 | "end-of-stream": "^1.0.0",
624 | "inherits": "^2.0.1",
625 | "readable-stream": "^2.0.0",
626 | "stream-shift": "^1.0.0"
627 | },
628 | "dependencies": {
629 | "isarray": {
630 | "version": "1.0.0",
631 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
632 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
633 | "optional": true
634 | },
635 | "readable-stream": {
636 | "version": "2.3.7",
637 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
638 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
639 | "optional": true,
640 | "requires": {
641 | "core-util-is": "~1.0.0",
642 | "inherits": "~2.0.3",
643 | "isarray": "~1.0.0",
644 | "process-nextick-args": "~2.0.0",
645 | "safe-buffer": "~5.1.1",
646 | "string_decoder": "~1.1.1",
647 | "util-deprecate": "~1.0.1"
648 | }
649 | },
650 | "safe-buffer": {
651 | "version": "5.1.2",
652 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
653 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
654 | "optional": true
655 | }
656 | }
657 | },
658 | "ecdsa-sig-formatter": {
659 | "version": "1.0.11",
660 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
661 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
662 | "requires": {
663 | "safe-buffer": "^5.0.1"
664 | }
665 | },
666 | "ee-first": {
667 | "version": "1.1.1",
668 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
669 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
670 | },
671 | "encodeurl": {
672 | "version": "1.0.2",
673 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
674 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
675 | },
676 | "end-of-stream": {
677 | "version": "1.4.4",
678 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
679 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
680 | "optional": true,
681 | "requires": {
682 | "once": "^1.4.0"
683 | }
684 | },
685 | "ent": {
686 | "version": "2.2.0",
687 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
688 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
689 | "optional": true
690 | },
691 | "es-abstract": {
692 | "version": "1.17.6",
693 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
694 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
695 | "requires": {
696 | "es-to-primitive": "^1.2.1",
697 | "function-bind": "^1.1.1",
698 | "has": "^1.0.3",
699 | "has-symbols": "^1.0.1",
700 | "is-callable": "^1.2.0",
701 | "is-regex": "^1.1.0",
702 | "object-inspect": "^1.7.0",
703 | "object-keys": "^1.1.1",
704 | "object.assign": "^4.1.0",
705 | "string.prototype.trimend": "^1.0.1",
706 | "string.prototype.trimstart": "^1.0.1"
707 | }
708 | },
709 | "es-get-iterator": {
710 | "version": "1.1.0",
711 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
712 | "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
713 | "optional": true,
714 | "requires": {
715 | "es-abstract": "^1.17.4",
716 | "has-symbols": "^1.0.1",
717 | "is-arguments": "^1.0.4",
718 | "is-map": "^2.0.1",
719 | "is-set": "^2.0.1",
720 | "is-string": "^1.0.5",
721 | "isarray": "^2.0.5"
722 | }
723 | },
724 | "es-to-primitive": {
725 | "version": "1.2.1",
726 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
727 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
728 | "requires": {
729 | "is-callable": "^1.1.4",
730 | "is-date-object": "^1.0.1",
731 | "is-symbol": "^1.0.2"
732 | }
733 | },
734 | "escape-html": {
735 | "version": "1.0.3",
736 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
737 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
738 | },
739 | "etag": {
740 | "version": "1.8.1",
741 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
742 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
743 | },
744 | "event-target-shim": {
745 | "version": "5.0.1",
746 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
747 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
748 | "optional": true
749 | },
750 | "express": {
751 | "version": "4.17.1",
752 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
753 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
754 | "requires": {
755 | "accepts": "~1.3.7",
756 | "array-flatten": "1.1.1",
757 | "body-parser": "1.19.0",
758 | "content-disposition": "0.5.3",
759 | "content-type": "~1.0.4",
760 | "cookie": "0.4.0",
761 | "cookie-signature": "1.0.6",
762 | "debug": "2.6.9",
763 | "depd": "~1.1.2",
764 | "encodeurl": "~1.0.2",
765 | "escape-html": "~1.0.3",
766 | "etag": "~1.8.1",
767 | "finalhandler": "~1.1.2",
768 | "fresh": "0.5.2",
769 | "merge-descriptors": "1.0.1",
770 | "methods": "~1.1.2",
771 | "on-finished": "~2.3.0",
772 | "parseurl": "~1.3.3",
773 | "path-to-regexp": "0.1.7",
774 | "proxy-addr": "~2.0.5",
775 | "qs": "6.7.0",
776 | "range-parser": "~1.2.1",
777 | "safe-buffer": "5.1.2",
778 | "send": "0.17.1",
779 | "serve-static": "1.14.1",
780 | "setprototypeof": "1.1.1",
781 | "statuses": "~1.5.0",
782 | "type-is": "~1.6.18",
783 | "utils-merge": "1.0.1",
784 | "vary": "~1.1.2"
785 | },
786 | "dependencies": {
787 | "debug": {
788 | "version": "2.6.9",
789 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
790 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
791 | "requires": {
792 | "ms": "2.0.0"
793 | }
794 | },
795 | "ms": {
796 | "version": "2.0.0",
797 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
798 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
799 | },
800 | "safe-buffer": {
801 | "version": "5.1.2",
802 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
803 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
804 | }
805 | }
806 | },
807 | "extend": {
808 | "version": "3.0.2",
809 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
810 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
811 | "optional": true
812 | },
813 | "fast-text-encoding": {
814 | "version": "1.0.3",
815 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
816 | "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==",
817 | "optional": true
818 | },
819 | "faye-websocket": {
820 | "version": "0.11.3",
821 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
822 | "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
823 | "requires": {
824 | "websocket-driver": ">=0.5.1"
825 | }
826 | },
827 | "finalhandler": {
828 | "version": "1.1.2",
829 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
830 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
831 | "requires": {
832 | "debug": "2.6.9",
833 | "encodeurl": "~1.0.2",
834 | "escape-html": "~1.0.3",
835 | "on-finished": "~2.3.0",
836 | "parseurl": "~1.3.3",
837 | "statuses": "~1.5.0",
838 | "unpipe": "~1.0.0"
839 | },
840 | "dependencies": {
841 | "debug": {
842 | "version": "2.6.9",
843 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
844 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
845 | "requires": {
846 | "ms": "2.0.0"
847 | }
848 | },
849 | "ms": {
850 | "version": "2.0.0",
851 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
852 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
853 | }
854 | }
855 | },
856 | "firebase-admin": {
857 | "version": "8.13.0",
858 | "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.13.0.tgz",
859 | "integrity": "sha512-krXj5ncWMJBhCpXSn9UFY6zmDWjFjqgx+1e9ATXKFYndEjmKtNBuJzqdrAdDh7aTUR7X6+0TPx4Hbc08kd0lwQ==",
860 | "requires": {
861 | "@firebase/database": "^0.6.0",
862 | "@google-cloud/firestore": "^3.0.0",
863 | "@google-cloud/storage": "^4.1.2",
864 | "@types/node": "^8.10.59",
865 | "dicer": "^0.3.0",
866 | "jsonwebtoken": "^8.5.1",
867 | "node-forge": "^0.7.6"
868 | }
869 | },
870 | "firebase-functions": {
871 | "version": "3.11.0",
872 | "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.11.0.tgz",
873 | "integrity": "sha512-i1uMhZ/M6i5SCI3ulKo7EWX0/LD+I5o6N+sk0HbOWfzyWfOl0iJTvQkR3BVDcjrlhPVC4xG1bDTLxd+DTkLqaw==",
874 | "requires": {
875 | "@types/express": "4.17.3",
876 | "cors": "^2.8.5",
877 | "express": "^4.17.1",
878 | "lodash": "^4.17.14"
879 | }
880 | },
881 | "firebase-functions-test": {
882 | "version": "0.2.2",
883 | "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.2.tgz",
884 | "integrity": "sha512-SlHLnpKRn5nMsg4Y0CUTGs/R8NatghJCYZGw3fHzaS/5xDqwWPWuxmdHHc+MSuxrSrUROEwOrDTwrbjmRaSNjw==",
885 | "dev": true,
886 | "requires": {
887 | "@types/lodash": "^4.14.104",
888 | "lodash": "^4.17.5"
889 | }
890 | },
891 | "foreach": {
892 | "version": "2.0.5",
893 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
894 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
895 | "optional": true
896 | },
897 | "forwarded": {
898 | "version": "0.1.2",
899 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
900 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
901 | },
902 | "fresh": {
903 | "version": "0.5.2",
904 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
905 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
906 | },
907 | "function-bind": {
908 | "version": "1.1.1",
909 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
910 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
911 | },
912 | "functional-red-black-tree": {
913 | "version": "1.0.1",
914 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
915 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
916 | "optional": true
917 | },
918 | "gaxios": {
919 | "version": "2.3.4",
920 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz",
921 | "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==",
922 | "optional": true,
923 | "requires": {
924 | "abort-controller": "^3.0.0",
925 | "extend": "^3.0.2",
926 | "https-proxy-agent": "^5.0.0",
927 | "is-stream": "^2.0.0",
928 | "node-fetch": "^2.3.0"
929 | }
930 | },
931 | "gcp-metadata": {
932 | "version": "3.5.0",
933 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz",
934 | "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==",
935 | "optional": true,
936 | "requires": {
937 | "gaxios": "^2.1.0",
938 | "json-bigint": "^0.3.0"
939 | }
940 | },
941 | "gcs-resumable-upload": {
942 | "version": "2.3.3",
943 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz",
944 | "integrity": "sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==",
945 | "optional": true,
946 | "requires": {
947 | "abort-controller": "^3.0.0",
948 | "configstore": "^5.0.0",
949 | "gaxios": "^2.0.0",
950 | "google-auth-library": "^5.0.0",
951 | "pumpify": "^2.0.0",
952 | "stream-events": "^1.0.4"
953 | }
954 | },
955 | "google-auth-library": {
956 | "version": "5.10.1",
957 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz",
958 | "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==",
959 | "optional": true,
960 | "requires": {
961 | "arrify": "^2.0.0",
962 | "base64-js": "^1.3.0",
963 | "ecdsa-sig-formatter": "^1.0.11",
964 | "fast-text-encoding": "^1.0.0",
965 | "gaxios": "^2.1.0",
966 | "gcp-metadata": "^3.4.0",
967 | "gtoken": "^4.1.0",
968 | "jws": "^4.0.0",
969 | "lru-cache": "^5.0.0"
970 | }
971 | },
972 | "google-gax": {
973 | "version": "1.15.3",
974 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.15.3.tgz",
975 | "integrity": "sha512-3JKJCRumNm3x2EksUTw4P1Rad43FTpqrtW9jzpf3xSMYXx+ogaqTM1vGo7VixHB4xkAyATXVIa3OcNSh8H9zsQ==",
976 | "optional": true,
977 | "requires": {
978 | "@grpc/grpc-js": "~1.0.3",
979 | "@grpc/proto-loader": "^0.5.1",
980 | "@types/fs-extra": "^8.0.1",
981 | "@types/long": "^4.0.0",
982 | "abort-controller": "^3.0.0",
983 | "duplexify": "^3.6.0",
984 | "google-auth-library": "^5.0.0",
985 | "is-stream-ended": "^0.1.4",
986 | "lodash.at": "^4.6.0",
987 | "lodash.has": "^4.5.2",
988 | "node-fetch": "^2.6.0",
989 | "protobufjs": "^6.8.9",
990 | "retry-request": "^4.0.0",
991 | "semver": "^6.0.0",
992 | "walkdir": "^0.4.0"
993 | }
994 | },
995 | "google-p12-pem": {
996 | "version": "2.0.4",
997 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz",
998 | "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==",
999 | "optional": true,
1000 | "requires": {
1001 | "node-forge": "^0.9.0"
1002 | },
1003 | "dependencies": {
1004 | "node-forge": {
1005 | "version": "0.9.2",
1006 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.2.tgz",
1007 | "integrity": "sha512-naKSScof4Wn+aoHU6HBsifh92Zeicm1GDQKd1vp3Y/kOi8ub0DozCa9KpvYNCXslFHYRmLNiqRopGdTGwNLpNw==",
1008 | "optional": true
1009 | }
1010 | }
1011 | },
1012 | "graceful-fs": {
1013 | "version": "4.2.4",
1014 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
1015 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
1016 | "optional": true
1017 | },
1018 | "gtoken": {
1019 | "version": "4.1.4",
1020 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz",
1021 | "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==",
1022 | "optional": true,
1023 | "requires": {
1024 | "gaxios": "^2.1.0",
1025 | "google-p12-pem": "^2.0.0",
1026 | "jws": "^4.0.0",
1027 | "mime": "^2.2.0"
1028 | }
1029 | },
1030 | "has": {
1031 | "version": "1.0.3",
1032 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1033 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1034 | "requires": {
1035 | "function-bind": "^1.1.1"
1036 | }
1037 | },
1038 | "has-symbols": {
1039 | "version": "1.0.1",
1040 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
1041 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
1042 | },
1043 | "hash-stream-validation": {
1044 | "version": "0.2.4",
1045 | "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz",
1046 | "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==",
1047 | "optional": true
1048 | },
1049 | "http-errors": {
1050 | "version": "1.7.2",
1051 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
1052 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
1053 | "requires": {
1054 | "depd": "~1.1.2",
1055 | "inherits": "2.0.3",
1056 | "setprototypeof": "1.1.1",
1057 | "statuses": ">= 1.5.0 < 2",
1058 | "toidentifier": "1.0.0"
1059 | },
1060 | "dependencies": {
1061 | "inherits": {
1062 | "version": "2.0.3",
1063 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1064 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1065 | }
1066 | }
1067 | },
1068 | "http-parser-js": {
1069 | "version": "0.5.2",
1070 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
1071 | "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ=="
1072 | },
1073 | "http-proxy-agent": {
1074 | "version": "4.0.1",
1075 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
1076 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
1077 | "optional": true,
1078 | "requires": {
1079 | "@tootallnate/once": "1",
1080 | "agent-base": "6",
1081 | "debug": "4"
1082 | }
1083 | },
1084 | "https-proxy-agent": {
1085 | "version": "5.0.0",
1086 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
1087 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
1088 | "optional": true,
1089 | "requires": {
1090 | "agent-base": "6",
1091 | "debug": "4"
1092 | }
1093 | },
1094 | "iconv-lite": {
1095 | "version": "0.4.24",
1096 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1097 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1098 | "requires": {
1099 | "safer-buffer": ">= 2.1.2 < 3"
1100 | }
1101 | },
1102 | "imurmurhash": {
1103 | "version": "0.1.4",
1104 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1105 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1106 | "optional": true
1107 | },
1108 | "inherits": {
1109 | "version": "2.0.4",
1110 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1111 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1112 | "optional": true
1113 | },
1114 | "ipaddr.js": {
1115 | "version": "1.9.1",
1116 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1117 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1118 | },
1119 | "is-arguments": {
1120 | "version": "1.0.4",
1121 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
1122 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
1123 | "optional": true
1124 | },
1125 | "is-bigint": {
1126 | "version": "1.0.0",
1127 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz",
1128 | "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==",
1129 | "optional": true
1130 | },
1131 | "is-boolean-object": {
1132 | "version": "1.0.1",
1133 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz",
1134 | "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==",
1135 | "optional": true
1136 | },
1137 | "is-callable": {
1138 | "version": "1.2.1",
1139 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz",
1140 | "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg=="
1141 | },
1142 | "is-date-object": {
1143 | "version": "1.0.2",
1144 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
1145 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
1146 | },
1147 | "is-map": {
1148 | "version": "2.0.1",
1149 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
1150 | "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
1151 | "optional": true
1152 | },
1153 | "is-negative-zero": {
1154 | "version": "2.0.0",
1155 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
1156 | "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
1157 | },
1158 | "is-number-object": {
1159 | "version": "1.0.4",
1160 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
1161 | "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
1162 | "optional": true
1163 | },
1164 | "is-obj": {
1165 | "version": "2.0.0",
1166 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
1167 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
1168 | "optional": true
1169 | },
1170 | "is-regex": {
1171 | "version": "1.1.1",
1172 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
1173 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
1174 | "requires": {
1175 | "has-symbols": "^1.0.1"
1176 | }
1177 | },
1178 | "is-set": {
1179 | "version": "2.0.1",
1180 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
1181 | "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
1182 | "optional": true
1183 | },
1184 | "is-stream": {
1185 | "version": "2.0.0",
1186 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
1187 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
1188 | "optional": true
1189 | },
1190 | "is-stream-ended": {
1191 | "version": "0.1.4",
1192 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz",
1193 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==",
1194 | "optional": true
1195 | },
1196 | "is-string": {
1197 | "version": "1.0.5",
1198 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
1199 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
1200 | "optional": true
1201 | },
1202 | "is-symbol": {
1203 | "version": "1.0.3",
1204 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
1205 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
1206 | "requires": {
1207 | "has-symbols": "^1.0.1"
1208 | }
1209 | },
1210 | "is-typed-array": {
1211 | "version": "1.1.3",
1212 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz",
1213 | "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==",
1214 | "optional": true,
1215 | "requires": {
1216 | "available-typed-arrays": "^1.0.0",
1217 | "es-abstract": "^1.17.4",
1218 | "foreach": "^2.0.5",
1219 | "has-symbols": "^1.0.1"
1220 | }
1221 | },
1222 | "is-typedarray": {
1223 | "version": "1.0.0",
1224 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1225 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1226 | "optional": true
1227 | },
1228 | "is-weakmap": {
1229 | "version": "2.0.1",
1230 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
1231 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
1232 | "optional": true
1233 | },
1234 | "is-weakset": {
1235 | "version": "2.0.1",
1236 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
1237 | "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
1238 | "optional": true
1239 | },
1240 | "isarray": {
1241 | "version": "2.0.5",
1242 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
1243 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
1244 | "optional": true
1245 | },
1246 | "json-bigint": {
1247 | "version": "0.3.1",
1248 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz",
1249 | "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==",
1250 | "optional": true,
1251 | "requires": {
1252 | "bignumber.js": "^9.0.0"
1253 | }
1254 | },
1255 | "jsonwebtoken": {
1256 | "version": "8.5.1",
1257 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
1258 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
1259 | "requires": {
1260 | "jws": "^3.2.2",
1261 | "lodash.includes": "^4.3.0",
1262 | "lodash.isboolean": "^3.0.3",
1263 | "lodash.isinteger": "^4.0.4",
1264 | "lodash.isnumber": "^3.0.3",
1265 | "lodash.isplainobject": "^4.0.6",
1266 | "lodash.isstring": "^4.0.1",
1267 | "lodash.once": "^4.0.0",
1268 | "ms": "^2.1.1",
1269 | "semver": "^5.6.0"
1270 | },
1271 | "dependencies": {
1272 | "jwa": {
1273 | "version": "1.4.1",
1274 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
1275 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
1276 | "requires": {
1277 | "buffer-equal-constant-time": "1.0.1",
1278 | "ecdsa-sig-formatter": "1.0.11",
1279 | "safe-buffer": "^5.0.1"
1280 | }
1281 | },
1282 | "jws": {
1283 | "version": "3.2.2",
1284 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
1285 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
1286 | "requires": {
1287 | "jwa": "^1.4.1",
1288 | "safe-buffer": "^5.0.1"
1289 | }
1290 | },
1291 | "semver": {
1292 | "version": "5.7.1",
1293 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1294 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1295 | }
1296 | }
1297 | },
1298 | "jwa": {
1299 | "version": "2.0.0",
1300 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
1301 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
1302 | "optional": true,
1303 | "requires": {
1304 | "buffer-equal-constant-time": "1.0.1",
1305 | "ecdsa-sig-formatter": "1.0.11",
1306 | "safe-buffer": "^5.0.1"
1307 | }
1308 | },
1309 | "jws": {
1310 | "version": "4.0.0",
1311 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
1312 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
1313 | "optional": true,
1314 | "requires": {
1315 | "jwa": "^2.0.0",
1316 | "safe-buffer": "^5.0.1"
1317 | }
1318 | },
1319 | "lodash": {
1320 | "version": "4.17.20",
1321 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
1322 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
1323 | },
1324 | "lodash.at": {
1325 | "version": "4.6.0",
1326 | "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz",
1327 | "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=",
1328 | "optional": true
1329 | },
1330 | "lodash.camelcase": {
1331 | "version": "4.3.0",
1332 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
1333 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
1334 | "optional": true
1335 | },
1336 | "lodash.has": {
1337 | "version": "4.5.2",
1338 | "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz",
1339 | "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=",
1340 | "optional": true
1341 | },
1342 | "lodash.includes": {
1343 | "version": "4.3.0",
1344 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
1345 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
1346 | },
1347 | "lodash.isboolean": {
1348 | "version": "3.0.3",
1349 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
1350 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
1351 | },
1352 | "lodash.isinteger": {
1353 | "version": "4.0.4",
1354 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
1355 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
1356 | },
1357 | "lodash.isnumber": {
1358 | "version": "3.0.3",
1359 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
1360 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
1361 | },
1362 | "lodash.isplainobject": {
1363 | "version": "4.0.6",
1364 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
1365 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
1366 | },
1367 | "lodash.isstring": {
1368 | "version": "4.0.1",
1369 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
1370 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
1371 | },
1372 | "lodash.once": {
1373 | "version": "4.1.1",
1374 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
1375 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
1376 | },
1377 | "long": {
1378 | "version": "4.0.0",
1379 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
1380 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
1381 | "optional": true
1382 | },
1383 | "lru-cache": {
1384 | "version": "5.1.1",
1385 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1386 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1387 | "optional": true,
1388 | "requires": {
1389 | "yallist": "^3.0.2"
1390 | }
1391 | },
1392 | "make-dir": {
1393 | "version": "3.1.0",
1394 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1395 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1396 | "optional": true,
1397 | "requires": {
1398 | "semver": "^6.0.0"
1399 | }
1400 | },
1401 | "media-typer": {
1402 | "version": "0.3.0",
1403 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1404 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1405 | },
1406 | "merge-descriptors": {
1407 | "version": "1.0.1",
1408 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1409 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1410 | },
1411 | "methods": {
1412 | "version": "1.1.2",
1413 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1414 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1415 | },
1416 | "mime": {
1417 | "version": "2.4.6",
1418 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
1419 | "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
1420 | "optional": true
1421 | },
1422 | "mime-db": {
1423 | "version": "1.44.0",
1424 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
1425 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
1426 | },
1427 | "mime-types": {
1428 | "version": "2.1.27",
1429 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
1430 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
1431 | "requires": {
1432 | "mime-db": "1.44.0"
1433 | }
1434 | },
1435 | "mimic-fn": {
1436 | "version": "2.1.0",
1437 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1438 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1439 | "optional": true
1440 | },
1441 | "ms": {
1442 | "version": "2.1.2",
1443 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1444 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1445 | },
1446 | "negotiator": {
1447 | "version": "0.6.2",
1448 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1449 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1450 | },
1451 | "node-fetch": {
1452 | "version": "2.6.1",
1453 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
1454 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
1455 | "optional": true
1456 | },
1457 | "node-forge": {
1458 | "version": "0.7.6",
1459 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
1460 | "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw=="
1461 | },
1462 | "object-assign": {
1463 | "version": "4.1.1",
1464 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1465 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1466 | },
1467 | "object-inspect": {
1468 | "version": "1.8.0",
1469 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
1470 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
1471 | },
1472 | "object-is": {
1473 | "version": "1.1.2",
1474 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
1475 | "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
1476 | "optional": true,
1477 | "requires": {
1478 | "define-properties": "^1.1.3",
1479 | "es-abstract": "^1.17.5"
1480 | }
1481 | },
1482 | "object-keys": {
1483 | "version": "1.1.1",
1484 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1485 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
1486 | },
1487 | "object.assign": {
1488 | "version": "4.1.1",
1489 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
1490 | "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
1491 | "requires": {
1492 | "define-properties": "^1.1.3",
1493 | "es-abstract": "^1.18.0-next.0",
1494 | "has-symbols": "^1.0.1",
1495 | "object-keys": "^1.1.1"
1496 | },
1497 | "dependencies": {
1498 | "es-abstract": {
1499 | "version": "1.18.0-next.0",
1500 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz",
1501 | "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==",
1502 | "requires": {
1503 | "es-to-primitive": "^1.2.1",
1504 | "function-bind": "^1.1.1",
1505 | "has": "^1.0.3",
1506 | "has-symbols": "^1.0.1",
1507 | "is-callable": "^1.2.0",
1508 | "is-negative-zero": "^2.0.0",
1509 | "is-regex": "^1.1.1",
1510 | "object-inspect": "^1.8.0",
1511 | "object-keys": "^1.1.1",
1512 | "object.assign": "^4.1.0",
1513 | "string.prototype.trimend": "^1.0.1",
1514 | "string.prototype.trimstart": "^1.0.1"
1515 | }
1516 | }
1517 | }
1518 | },
1519 | "on-finished": {
1520 | "version": "2.3.0",
1521 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1522 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1523 | "requires": {
1524 | "ee-first": "1.1.1"
1525 | }
1526 | },
1527 | "once": {
1528 | "version": "1.4.0",
1529 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1530 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1531 | "optional": true,
1532 | "requires": {
1533 | "wrappy": "1"
1534 | }
1535 | },
1536 | "onetime": {
1537 | "version": "5.1.2",
1538 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
1539 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
1540 | "optional": true,
1541 | "requires": {
1542 | "mimic-fn": "^2.1.0"
1543 | }
1544 | },
1545 | "p-limit": {
1546 | "version": "2.3.0",
1547 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
1548 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
1549 | "optional": true,
1550 | "requires": {
1551 | "p-try": "^2.0.0"
1552 | }
1553 | },
1554 | "p-try": {
1555 | "version": "2.2.0",
1556 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1557 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1558 | "optional": true
1559 | },
1560 | "parseurl": {
1561 | "version": "1.3.3",
1562 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1563 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1564 | },
1565 | "path-to-regexp": {
1566 | "version": "0.1.7",
1567 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1568 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1569 | },
1570 | "process-nextick-args": {
1571 | "version": "2.0.1",
1572 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1573 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1574 | "optional": true
1575 | },
1576 | "protobufjs": {
1577 | "version": "6.10.1",
1578 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz",
1579 | "integrity": "sha512-pb8kTchL+1Ceg4lFd5XUpK8PdWacbvV5SK2ULH2ebrYtl4GjJmS24m6CKME67jzV53tbJxHlnNOSqQHbTsR9JQ==",
1580 | "optional": true,
1581 | "requires": {
1582 | "@protobufjs/aspromise": "^1.1.2",
1583 | "@protobufjs/base64": "^1.1.2",
1584 | "@protobufjs/codegen": "^2.0.4",
1585 | "@protobufjs/eventemitter": "^1.1.0",
1586 | "@protobufjs/fetch": "^1.1.0",
1587 | "@protobufjs/float": "^1.0.2",
1588 | "@protobufjs/inquire": "^1.1.0",
1589 | "@protobufjs/path": "^1.1.2",
1590 | "@protobufjs/pool": "^1.1.0",
1591 | "@protobufjs/utf8": "^1.1.0",
1592 | "@types/long": "^4.0.1",
1593 | "@types/node": "^13.7.0",
1594 | "long": "^4.0.0"
1595 | },
1596 | "dependencies": {
1597 | "@types/node": {
1598 | "version": "13.13.20",
1599 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.20.tgz",
1600 | "integrity": "sha512-1kx55tU3AvGX2Cjk2W4GMBxbgIz892V+X10S2gUreIAq8qCWgaQH+tZBOWc0bi2BKFhQt+CX0BTx28V9QPNa+A==",
1601 | "optional": true
1602 | }
1603 | }
1604 | },
1605 | "proxy-addr": {
1606 | "version": "2.0.6",
1607 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
1608 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
1609 | "requires": {
1610 | "forwarded": "~0.1.2",
1611 | "ipaddr.js": "1.9.1"
1612 | }
1613 | },
1614 | "pump": {
1615 | "version": "3.0.0",
1616 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1617 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1618 | "optional": true,
1619 | "requires": {
1620 | "end-of-stream": "^1.1.0",
1621 | "once": "^1.3.1"
1622 | }
1623 | },
1624 | "pumpify": {
1625 | "version": "2.0.1",
1626 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz",
1627 | "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==",
1628 | "optional": true,
1629 | "requires": {
1630 | "duplexify": "^4.1.1",
1631 | "inherits": "^2.0.3",
1632 | "pump": "^3.0.0"
1633 | },
1634 | "dependencies": {
1635 | "duplexify": {
1636 | "version": "4.1.1",
1637 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz",
1638 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==",
1639 | "optional": true,
1640 | "requires": {
1641 | "end-of-stream": "^1.4.1",
1642 | "inherits": "^2.0.3",
1643 | "readable-stream": "^3.1.1",
1644 | "stream-shift": "^1.0.0"
1645 | }
1646 | }
1647 | }
1648 | },
1649 | "qs": {
1650 | "version": "6.7.0",
1651 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
1652 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
1653 | },
1654 | "range-parser": {
1655 | "version": "1.2.1",
1656 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1657 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1658 | },
1659 | "raw-body": {
1660 | "version": "2.4.0",
1661 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
1662 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
1663 | "requires": {
1664 | "bytes": "3.1.0",
1665 | "http-errors": "1.7.2",
1666 | "iconv-lite": "0.4.24",
1667 | "unpipe": "1.0.0"
1668 | }
1669 | },
1670 | "readable-stream": {
1671 | "version": "3.6.0",
1672 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
1673 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
1674 | "optional": true,
1675 | "requires": {
1676 | "inherits": "^2.0.3",
1677 | "string_decoder": "^1.1.1",
1678 | "util-deprecate": "^1.0.1"
1679 | }
1680 | },
1681 | "regexp.prototype.flags": {
1682 | "version": "1.3.0",
1683 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
1684 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
1685 | "optional": true,
1686 | "requires": {
1687 | "define-properties": "^1.1.3",
1688 | "es-abstract": "^1.17.0-next.1"
1689 | }
1690 | },
1691 | "retry-request": {
1692 | "version": "4.1.3",
1693 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz",
1694 | "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==",
1695 | "optional": true,
1696 | "requires": {
1697 | "debug": "^4.1.1"
1698 | }
1699 | },
1700 | "safe-buffer": {
1701 | "version": "5.2.1",
1702 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1703 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1704 | },
1705 | "safer-buffer": {
1706 | "version": "2.1.2",
1707 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1708 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1709 | },
1710 | "semver": {
1711 | "version": "6.3.0",
1712 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1713 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1714 | "optional": true
1715 | },
1716 | "send": {
1717 | "version": "0.17.1",
1718 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1719 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1720 | "requires": {
1721 | "debug": "2.6.9",
1722 | "depd": "~1.1.2",
1723 | "destroy": "~1.0.4",
1724 | "encodeurl": "~1.0.2",
1725 | "escape-html": "~1.0.3",
1726 | "etag": "~1.8.1",
1727 | "fresh": "0.5.2",
1728 | "http-errors": "~1.7.2",
1729 | "mime": "1.6.0",
1730 | "ms": "2.1.1",
1731 | "on-finished": "~2.3.0",
1732 | "range-parser": "~1.2.1",
1733 | "statuses": "~1.5.0"
1734 | },
1735 | "dependencies": {
1736 | "debug": {
1737 | "version": "2.6.9",
1738 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1739 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1740 | "requires": {
1741 | "ms": "2.0.0"
1742 | },
1743 | "dependencies": {
1744 | "ms": {
1745 | "version": "2.0.0",
1746 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1747 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1748 | }
1749 | }
1750 | },
1751 | "mime": {
1752 | "version": "1.6.0",
1753 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1754 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1755 | },
1756 | "ms": {
1757 | "version": "2.1.1",
1758 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1759 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1760 | }
1761 | }
1762 | },
1763 | "serve-static": {
1764 | "version": "1.14.1",
1765 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1766 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1767 | "requires": {
1768 | "encodeurl": "~1.0.2",
1769 | "escape-html": "~1.0.3",
1770 | "parseurl": "~1.3.3",
1771 | "send": "0.17.1"
1772 | }
1773 | },
1774 | "setprototypeof": {
1775 | "version": "1.1.1",
1776 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1777 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1778 | },
1779 | "side-channel": {
1780 | "version": "1.0.3",
1781 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz",
1782 | "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==",
1783 | "optional": true,
1784 | "requires": {
1785 | "es-abstract": "^1.18.0-next.0",
1786 | "object-inspect": "^1.8.0"
1787 | },
1788 | "dependencies": {
1789 | "es-abstract": {
1790 | "version": "1.18.0-next.0",
1791 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz",
1792 | "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==",
1793 | "optional": true,
1794 | "requires": {
1795 | "es-to-primitive": "^1.2.1",
1796 | "function-bind": "^1.1.1",
1797 | "has": "^1.0.3",
1798 | "has-symbols": "^1.0.1",
1799 | "is-callable": "^1.2.0",
1800 | "is-negative-zero": "^2.0.0",
1801 | "is-regex": "^1.1.1",
1802 | "object-inspect": "^1.8.0",
1803 | "object-keys": "^1.1.1",
1804 | "object.assign": "^4.1.0",
1805 | "string.prototype.trimend": "^1.0.1",
1806 | "string.prototype.trimstart": "^1.0.1"
1807 | }
1808 | }
1809 | }
1810 | },
1811 | "signal-exit": {
1812 | "version": "3.0.3",
1813 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1814 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1815 | "optional": true
1816 | },
1817 | "snakeize": {
1818 | "version": "0.1.0",
1819 | "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz",
1820 | "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=",
1821 | "optional": true
1822 | },
1823 | "statuses": {
1824 | "version": "1.5.0",
1825 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1826 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1827 | },
1828 | "stream-events": {
1829 | "version": "1.0.5",
1830 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
1831 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
1832 | "optional": true,
1833 | "requires": {
1834 | "stubs": "^3.0.0"
1835 | }
1836 | },
1837 | "stream-shift": {
1838 | "version": "1.0.1",
1839 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
1840 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
1841 | "optional": true
1842 | },
1843 | "streamsearch": {
1844 | "version": "0.1.2",
1845 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
1846 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
1847 | },
1848 | "string.prototype.trimend": {
1849 | "version": "1.0.1",
1850 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
1851 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
1852 | "requires": {
1853 | "define-properties": "^1.1.3",
1854 | "es-abstract": "^1.17.5"
1855 | }
1856 | },
1857 | "string.prototype.trimstart": {
1858 | "version": "1.0.1",
1859 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
1860 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
1861 | "requires": {
1862 | "define-properties": "^1.1.3",
1863 | "es-abstract": "^1.17.5"
1864 | }
1865 | },
1866 | "string_decoder": {
1867 | "version": "1.1.1",
1868 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1869 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1870 | "optional": true,
1871 | "requires": {
1872 | "safe-buffer": "~5.1.0"
1873 | },
1874 | "dependencies": {
1875 | "safe-buffer": {
1876 | "version": "5.1.2",
1877 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1878 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1879 | "optional": true
1880 | }
1881 | }
1882 | },
1883 | "stubs": {
1884 | "version": "3.0.0",
1885 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
1886 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=",
1887 | "optional": true
1888 | },
1889 | "teeny-request": {
1890 | "version": "6.0.3",
1891 | "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.3.tgz",
1892 | "integrity": "sha512-TZG/dfd2r6yeji19es1cUIwAlVD8y+/svB1kAC2Y0bjEyysrfbO8EZvJBRwIE6WkwmUoB7uvWLwTIhJbMXZ1Dw==",
1893 | "optional": true,
1894 | "requires": {
1895 | "http-proxy-agent": "^4.0.0",
1896 | "https-proxy-agent": "^5.0.0",
1897 | "node-fetch": "^2.2.0",
1898 | "stream-events": "^1.0.5",
1899 | "uuid": "^7.0.0"
1900 | }
1901 | },
1902 | "through2": {
1903 | "version": "3.0.2",
1904 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
1905 | "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
1906 | "optional": true,
1907 | "requires": {
1908 | "inherits": "^2.0.4",
1909 | "readable-stream": "2 || 3"
1910 | }
1911 | },
1912 | "toidentifier": {
1913 | "version": "1.0.0",
1914 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1915 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1916 | },
1917 | "tslib": {
1918 | "version": "1.13.0",
1919 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
1920 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
1921 | },
1922 | "type-is": {
1923 | "version": "1.6.18",
1924 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1925 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1926 | "requires": {
1927 | "media-typer": "0.3.0",
1928 | "mime-types": "~2.1.24"
1929 | }
1930 | },
1931 | "typedarray": {
1932 | "version": "0.0.6",
1933 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1934 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
1935 | "optional": true
1936 | },
1937 | "typedarray-to-buffer": {
1938 | "version": "3.1.5",
1939 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
1940 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
1941 | "optional": true,
1942 | "requires": {
1943 | "is-typedarray": "^1.0.0"
1944 | }
1945 | },
1946 | "unique-string": {
1947 | "version": "2.0.0",
1948 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
1949 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
1950 | "optional": true,
1951 | "requires": {
1952 | "crypto-random-string": "^2.0.0"
1953 | }
1954 | },
1955 | "unpipe": {
1956 | "version": "1.0.0",
1957 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1958 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1959 | },
1960 | "util-deprecate": {
1961 | "version": "1.0.2",
1962 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1963 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1964 | "optional": true
1965 | },
1966 | "utils-merge": {
1967 | "version": "1.0.1",
1968 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1969 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1970 | },
1971 | "uuid": {
1972 | "version": "7.0.3",
1973 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
1974 | "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
1975 | "optional": true
1976 | },
1977 | "vary": {
1978 | "version": "1.1.2",
1979 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1980 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1981 | },
1982 | "walkdir": {
1983 | "version": "0.4.1",
1984 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
1985 | "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==",
1986 | "optional": true
1987 | },
1988 | "websocket-driver": {
1989 | "version": "0.7.4",
1990 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
1991 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
1992 | "requires": {
1993 | "http-parser-js": ">=0.5.1",
1994 | "safe-buffer": ">=5.1.0",
1995 | "websocket-extensions": ">=0.1.1"
1996 | }
1997 | },
1998 | "websocket-extensions": {
1999 | "version": "0.1.4",
2000 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
2001 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
2002 | },
2003 | "which-boxed-primitive": {
2004 | "version": "1.0.1",
2005 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz",
2006 | "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==",
2007 | "optional": true,
2008 | "requires": {
2009 | "is-bigint": "^1.0.0",
2010 | "is-boolean-object": "^1.0.0",
2011 | "is-number-object": "^1.0.3",
2012 | "is-string": "^1.0.4",
2013 | "is-symbol": "^1.0.2"
2014 | }
2015 | },
2016 | "which-collection": {
2017 | "version": "1.0.1",
2018 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
2019 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
2020 | "optional": true,
2021 | "requires": {
2022 | "is-map": "^2.0.1",
2023 | "is-set": "^2.0.1",
2024 | "is-weakmap": "^2.0.1",
2025 | "is-weakset": "^2.0.1"
2026 | }
2027 | },
2028 | "which-typed-array": {
2029 | "version": "1.1.2",
2030 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz",
2031 | "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==",
2032 | "optional": true,
2033 | "requires": {
2034 | "available-typed-arrays": "^1.0.2",
2035 | "es-abstract": "^1.17.5",
2036 | "foreach": "^2.0.5",
2037 | "function-bind": "^1.1.1",
2038 | "has-symbols": "^1.0.1",
2039 | "is-typed-array": "^1.1.3"
2040 | }
2041 | },
2042 | "wrappy": {
2043 | "version": "1.0.2",
2044 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2045 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2046 | "optional": true
2047 | },
2048 | "write-file-atomic": {
2049 | "version": "3.0.3",
2050 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
2051 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
2052 | "optional": true,
2053 | "requires": {
2054 | "imurmurhash": "^0.1.4",
2055 | "is-typedarray": "^1.0.0",
2056 | "signal-exit": "^3.0.2",
2057 | "typedarray-to-buffer": "^3.1.5"
2058 | }
2059 | },
2060 | "xdg-basedir": {
2061 | "version": "4.0.0",
2062 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
2063 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
2064 | "optional": true
2065 | },
2066 | "yallist": {
2067 | "version": "3.1.1",
2068 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2069 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2070 | "optional": true
2071 | }
2072 | }
2073 | }
2074 |
--------------------------------------------------------------------------------