HTTPリクエストのKeep-AliveとPrxoy対応など (#5226)
* DriveのKeep-Alive, Proxy と APのProxy対応 * request系でKeep-Aliveするように * fix lookup-dns-cache.d.ts * remove debug output
This commit is contained in:
		
							parent
							
								
									831ca53b63
								
							
						
					
					
						commit
						14736620ec
					
				
					 11 changed files with 151 additions and 176 deletions
				
			
		|  | @ -66,7 +66,6 @@ | |||
| 		"@types/koa-views": "2.0.3", | ||||
| 		"@types/koa__cors": "2.2.3", | ||||
| 		"@types/lolex": "3.1.1", | ||||
| 		"@types/minio": "7.0.2", | ||||
| 		"@types/mocha": "5.2.7", | ||||
| 		"@types/node": "12.0.10", | ||||
| 		"@types/nodemailer": "6.2.0", | ||||
|  | @ -99,11 +98,13 @@ | |||
| 		"@types/websocket": "0.0.40", | ||||
| 		"@types/ws": "6.0.1", | ||||
| 		"@typescript-eslint/parser": "1.11.0", | ||||
| 		"agentkeepalive": "4.0.2", | ||||
| 		"animejs": "3.0.1", | ||||
| 		"apexcharts": "3.8.3", | ||||
| 		"autobind-decorator": "2.4.0", | ||||
| 		"autosize": "4.0.2", | ||||
| 		"autwh": "0.1.0", | ||||
| 		"aws-sdk": "2.500.0", | ||||
| 		"bcryptjs": "2.4.3", | ||||
| 		"bootstrap": "4.3.1", | ||||
| 		"bootstrap-vue": "2.0.0-rc.13", | ||||
|  | @ -145,6 +146,7 @@ | |||
| 		"hard-source-webpack-plugin": "0.13.1", | ||||
| 		"html-minifier": "4.0.0", | ||||
| 		"http-signature": "1.2.0", | ||||
| 		"https-proxy-agent": "2.2.2", | ||||
| 		"insert-text-at-cursor": "0.3.0", | ||||
| 		"is-root": "2.1.0", | ||||
| 		"is-svg": "4.2.0", | ||||
|  | @ -170,7 +172,6 @@ | |||
| 		"loader-utils": "1.2.3", | ||||
| 		"lolex": "4.1.0", | ||||
| 		"lookup-dns-cache": "2.1.0", | ||||
| 		"minio": "7.0.10", | ||||
| 		"mocha": "6.2.0", | ||||
| 		"moji": "0.5.1", | ||||
| 		"ms": "2.1.2", | ||||
|  | @ -187,7 +188,6 @@ | |||
| 		"postcss-loader": "3.0.0", | ||||
| 		"prismjs": "1.16.0", | ||||
| 		"progress-bar-webpack-plugin": "1.12.1", | ||||
| 		"promise-any": "0.2.0", | ||||
| 		"promise-limit": "2.7.0", | ||||
| 		"promise-sequential": "1.1.1", | ||||
| 		"pug": "2.0.4", | ||||
|  |  | |||
							
								
								
									
										20
									
								
								src/@types/lookup-dns-cache.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								src/@types/lookup-dns-cache.d.ts
									
										
									
									
										vendored
									
									
								
							|  | @ -1,17 +1,9 @@ | |||
| declare module 'lookup-dns-cache' { | ||||
| 	type IPv4 = 4; | ||||
| 	import { LookupOneOptions, LookupAllOptions, LookupOptions, LookupAddress } from 'dns' | ||||
| 
 | ||||
| 	type IPv6 = 6; | ||||
| 
 | ||||
| 	type Family = IPv4 | IPv6 | undefined; | ||||
| 
 | ||||
| 	interface IRunOptions { | ||||
| 		family?: Family; | ||||
| 		all?: boolean; | ||||
| 	} | ||||
| 
 | ||||
| 	type RunCallback = (error: Error | null, address?: string | string[], family?: Family) => void; | ||||
| 
 | ||||
| 	export function lookup(hostname: string, options: IRunOptions | Family, callback: RunCallback): {} | undefined; | ||||
| 	export function lookup(hostname: string, callback: RunCallback): {} | undefined; | ||||
| 	function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void; | ||||
| 	function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void; | ||||
| 	function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void): void; | ||||
| 	function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family: number) => void): void; | ||||
| 	function lookup(hostname: string, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										7
									
								
								src/@types/promise-any.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								src/@types/promise-any.d.ts
									
										
									
									
										vendored
									
									
								
							|  | @ -1,7 +0,0 @@ | |||
| declare module 'promise-any' { | ||||
| 	function promiseAny<T>(iterable: Iterable<T | PromiseLike<T>>): Promise<T>; | ||||
| 
 | ||||
| 	namespace promiseAny {} // Hack
 | ||||
| 
 | ||||
| 	export = promiseAny; | ||||
| } | ||||
|  | @ -29,6 +29,7 @@ export async function downloadUrl(url: string, path: string) { | |||
| 			url: new URL(url).href, // https://github.com/syuilo/misskey/issues/2637
 | ||||
| 			proxy: config.proxy, | ||||
| 			timeout: 10 * 1000, | ||||
| 			forever: true, | ||||
| 			headers: { | ||||
| 				'User-Agent': config.userAgent | ||||
| 			} | ||||
|  |  | |||
|  | @ -1,8 +1,7 @@ | |||
| import { request } from 'https'; | ||||
| import * as https from 'https'; | ||||
| import { sign } from 'http-signature'; | ||||
| import * as crypto from 'crypto'; | ||||
| import { lookup, IRunOptions } from 'lookup-dns-cache'; | ||||
| import * as promiseAny from 'promise-any'; | ||||
| import * as cache from 'lookup-dns-cache'; | ||||
| 
 | ||||
| import config from '../../config'; | ||||
| import { ILocalUser } from '../../models/entities/user'; | ||||
|  | @ -12,9 +11,16 @@ import { UserKeypairs, Instances } from '../../models'; | |||
| import { fetchMeta } from '../../misc/fetch-meta'; | ||||
| import { toPuny } from '../../misc/convert-host'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import * as httpsProxyAgent from 'https-proxy-agent'; | ||||
| 
 | ||||
| export const logger = apLogger.createSubLogger('deliver'); | ||||
| 
 | ||||
| const agent = config.proxy | ||||
| 	? new httpsProxyAgent(config.proxy) | ||||
| 	: new https.Agent({ | ||||
| 			lookup: cache.lookup, | ||||
| 		}); | ||||
| 
 | ||||
| export default async (user: ILocalUser, url: string, object: any) => { | ||||
| 	const timeout = 10 * 1000; | ||||
| 
 | ||||
|  | @ -47,24 +53,20 @@ export default async (user: ILocalUser, url: string, object: any) => { | |||
| 	sha256.update(data); | ||||
| 	const hash = sha256.digest('base64'); | ||||
| 
 | ||||
| 	const addr = await resolveAddr(hostname); | ||||
| 	if (!addr) return; | ||||
| 
 | ||||
| 	const keypair = await UserKeypairs.findOne({ | ||||
| 		userId: user.id | ||||
| 	}).then(ensure); | ||||
| 
 | ||||
| 	await new Promise((resolve, reject) => { | ||||
| 		const req = request({ | ||||
| 		const req = https.request({ | ||||
| 			agent, | ||||
| 			protocol, | ||||
| 			hostname: addr, | ||||
| 			setHost: false, | ||||
| 			hostname, | ||||
| 			port, | ||||
| 			method: 'POST', | ||||
| 			path: pathname + search, | ||||
| 			timeout, | ||||
| 			headers: { | ||||
| 				'Host': host, | ||||
| 				'User-Agent': config.userAgent, | ||||
| 				'Content-Type': 'application/activity+json', | ||||
| 				'Digest': `SHA-256=${hash}` | ||||
|  | @ -110,30 +112,3 @@ export default async (user: ILocalUser, url: string, object: any) => { | |||
| 	}); | ||||
| 	//#endregion
 | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Resolve host (with cached, asynchrony) | ||||
|  */ | ||||
| async function resolveAddr(domain: string) { | ||||
| 	const af = config.outgoingAddressFamily || 'ipv4'; | ||||
| 	const useV4 = af == 'ipv4' || af == 'dual'; | ||||
| 	const useV6 = af == 'ipv6' || af == 'dual'; | ||||
| 
 | ||||
| 	const promises = []; | ||||
| 
 | ||||
| 	if (!useV4 && !useV6) throw 'No usable address family available'; | ||||
| 	if (useV4) promises.push(resolveAddrInner(domain, { family: 4 })); | ||||
| 	if (useV6) promises.push(resolveAddrInner(domain, { family: 6 })); | ||||
| 
 | ||||
| 	// v4/v6で先に取得できた方を採用する
 | ||||
| 	return await promiseAny(promises); | ||||
| } | ||||
| 
 | ||||
| function resolveAddrInner(domain: string, options: IRunOptions = {}): Promise<string> { | ||||
| 	return new Promise((res, rej) => { | ||||
| 		lookup(domain, options, (error, address) => { | ||||
| 			if (error) return rej(error); | ||||
| 			return res(Array.isArray(address) ? address[0] : address); | ||||
| 		}); | ||||
| 	}); | ||||
| } | ||||
|  |  | |||
|  | @ -57,6 +57,7 @@ export default class Resolver { | |||
| 			url: value, | ||||
| 			proxy: config.proxy, | ||||
| 			timeout: this.timeout, | ||||
| 			forever: true, | ||||
| 			headers: { | ||||
| 				'User-Agent': config.userAgent, | ||||
| 				Accept: 'application/activity+json, application/ld+json' | ||||
|  |  | |||
|  | @ -22,6 +22,7 @@ module.exports = async (ctx: Koa.BaseContext) => { | |||
| 				url: ctx.query.url, | ||||
| 				lang: ctx.query.lang || 'ja-JP' | ||||
| 			}, | ||||
| 			forever: true, | ||||
| 			json: true | ||||
| 		}) : await summaly(ctx.query.url, { | ||||
| 			followRedirects: false, | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ import { Buffer } from 'buffer'; | |||
| import * as fs from 'fs'; | ||||
| 
 | ||||
| import * as crypto from 'crypto'; | ||||
| import * as Minio from 'minio'; | ||||
| import * as uuid from 'uuid'; | ||||
| import * as sharp from 'sharp'; | ||||
| 
 | ||||
|  | @ -21,6 +20,8 @@ import { IRemoteUser, User } from '../../models/entities/user'; | |||
| import { driveChart, perUserDriveChart, instanceChart } from '../chart'; | ||||
| import { genId } from '../../misc/gen-id'; | ||||
| import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error'; | ||||
| import * as S3 from 'aws-sdk/clients/s3'; | ||||
| import { getS3 } from './s3'; | ||||
| 
 | ||||
| const logger = driveLogger.createSubLogger('register', 'yellow'); | ||||
| 
 | ||||
|  | @ -211,23 +212,21 @@ async function upload(key: string, stream: fs.ReadStream | Buffer, type: string, | |||
| 
 | ||||
| 	const meta = await fetchMeta(); | ||||
| 
 | ||||
| 	const minio = new Minio.Client({ | ||||
| 		endPoint: meta.objectStorageEndpoint!, | ||||
| 		region: meta.objectStorageRegion ? meta.objectStorageRegion : undefined, | ||||
| 		port: meta.objectStoragePort ? meta.objectStoragePort : undefined, | ||||
| 		useSSL: meta.objectStorageUseSSL, | ||||
| 		accessKey: meta.objectStorageAccessKey!, | ||||
| 		secretKey: meta.objectStorageSecretKey!, | ||||
| 	}); | ||||
| 	const params = { | ||||
| 		Bucket: meta.objectStorageBucket, | ||||
| 		Key: key, | ||||
| 		Body: stream, | ||||
| 		ContentType: type, | ||||
| 		CacheControl: 'max-age=31536000, immutable', | ||||
| 	} as S3.PutObjectRequest; | ||||
| 
 | ||||
| 	const metadata = { | ||||
| 		'Content-Type': type, | ||||
| 		'Cache-Control': 'max-age=31536000, immutable' | ||||
| 	} as Minio.ItemBucketMetadata; | ||||
| 	if (filename) params.ContentDisposition = contentDisposition('inline', filename); | ||||
| 
 | ||||
| 	if (filename) metadata['Content-Disposition'] = contentDisposition('inline', filename); | ||||
| 	const s3 = getS3(meta); | ||||
| 
 | ||||
| 	await minio.putObject(meta.objectStorageBucket!, key, stream, undefined, metadata); | ||||
| 	const upload = s3.upload(params); | ||||
| 
 | ||||
| 	await upload.promise(); | ||||
| } | ||||
| 
 | ||||
| async function deleteOldFile(user: IRemoteUser) { | ||||
|  |  | |||
|  | @ -1,10 +1,10 @@ | |||
| import * as Minio from 'minio'; | ||||
| import { DriveFile } from '../../models/entities/drive-file'; | ||||
| import { InternalStorage } from './internal-storage'; | ||||
| import { DriveFiles, Instances, Notes } from '../../models'; | ||||
| import { driveChart, perUserDriveChart, instanceChart } from '../chart'; | ||||
| import { createDeleteObjectStorageFileJob } from '../../queue'; | ||||
| import { fetchMeta } from '../../misc/fetch-meta'; | ||||
| import { getS3 } from './s3'; | ||||
| 
 | ||||
| export async function deleteFile(file: DriveFile, isExpired = false) { | ||||
| 	if (file.storedInternal) { | ||||
|  | @ -93,14 +93,10 @@ function postProcess(file: DriveFile, isExpired = false) { | |||
| export async function deleteObjectStorageFile(key: string) { | ||||
| 	const meta = await fetchMeta(); | ||||
| 
 | ||||
| 	const minio = new Minio.Client({ | ||||
| 		endPoint: meta.objectStorageEndpoint!, | ||||
| 		region: meta.objectStorageRegion ? meta.objectStorageRegion : undefined, | ||||
| 		port: meta.objectStoragePort ? meta.objectStoragePort : undefined, | ||||
| 		useSSL: meta.objectStorageUseSSL, | ||||
| 		accessKey: meta.objectStorageAccessKey!, | ||||
| 		secretKey: meta.objectStorageSecretKey!, | ||||
| 	}); | ||||
| 	const s3 = getS3(meta); | ||||
| 
 | ||||
| 	await minio.removeObject(meta.objectStorageBucket!, key); | ||||
| 	await s3.deleteObject({ | ||||
| 		Bucket: meta.objectStorageBucket!, | ||||
| 		Key: key | ||||
| 	}).promise(); | ||||
| } | ||||
|  |  | |||
							
								
								
									
										31
									
								
								src/services/drive/s3.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/services/drive/s3.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | |||
| import * as S3 from 'aws-sdk/clients/s3'; | ||||
| import config from '../../config'; | ||||
| import { Meta } from '../../models/entities/meta'; | ||||
| import * as httpsProxyAgent from 'https-proxy-agent'; | ||||
| import * as agentkeepalive from 'agentkeepalive'; | ||||
| 
 | ||||
| const httpsAgent = config.proxy | ||||
| 	? new httpsProxyAgent(config.proxy) | ||||
| 	: new agentkeepalive.HttpsAgent({ | ||||
| 			freeSocketTimeout: 30 * 1000 | ||||
| 		}); | ||||
| 
 | ||||
| export function getS3(meta: Meta) { | ||||
| 	const conf = { | ||||
| 		endpoint: meta.objectStorageEndpoint, | ||||
| 		accessKeyId: meta.objectStorageAccessKey, | ||||
| 		secretAccessKey: meta.objectStorageSecretKey, | ||||
| 		region: meta.objectStorageRegion, | ||||
| 		sslEnabled: meta.objectStorageUseSSL, | ||||
| 		httpOptions: { | ||||
| 		} | ||||
| 	} as S3.ClientConfiguration; | ||||
| 
 | ||||
| 	if (meta.objectStorageUseSSL) { | ||||
| 		conf.httpOptions!.agent = httpsAgent; | ||||
| 	} | ||||
| 
 | ||||
| 	const s3 = new S3(conf); | ||||
| 
 | ||||
| 	return s3; | ||||
| } | ||||
							
								
								
									
										166
									
								
								yarn.lock
									
										
									
									
									
								
							
							
						
						
									
										166
									
								
								yarn.lock
									
										
									
									
									
								
							|  | @ -489,13 +489,6 @@ | |||
|   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" | ||||
|   integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== | ||||
| 
 | ||||
| "@types/minio@7.0.2": | ||||
|   version "7.0.2" | ||||
|   resolved "https://registry.yarnpkg.com/@types/minio/-/minio-7.0.2.tgz#799571e4afe673072d2e89aef344da8f42e16f7e" | ||||
|   integrity sha512-ZyMa+x5Alann0girw9m2Wc01YnG7eakCwfofbKHOP/YTV7w7G0cUEz16VgxP7HxZhX632akZ4xGmc1wpnmLrjg== | ||||
|   dependencies: | ||||
|     "@types/node" "*" | ||||
| 
 | ||||
| "@types/mocha@*", "@types/mocha@5.2.7": | ||||
|   version "5.2.7" | ||||
|   resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" | ||||
|  | @ -1071,6 +1064,15 @@ agent-base@^4.3.0: | |||
|   dependencies: | ||||
|     es6-promisify "^5.0.0" | ||||
| 
 | ||||
| agentkeepalive@4.0.2: | ||||
|   version "4.0.2" | ||||
|   resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.0.2.tgz#38a490b779a97bd542d153e5a7da0d1fdef35dd3" | ||||
|   integrity sha512-A5gSniD4xMCYtSD4ilUHpQRB9ZbNjtIPittKUv7bA0j0UCwbT3EJBUYLKPJ/dtmaXRYWI2mG4/O90xbi7oahNw== | ||||
|   dependencies: | ||||
|     debug "^4.1.0" | ||||
|     depd "^1.1.2" | ||||
|     humanize-ms "^1.2.1" | ||||
| 
 | ||||
| ajv-errors@^1.0.0: | ||||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" | ||||
|  | @ -1500,11 +1502,6 @@ async@>=0.2.9: | |||
|   resolved "https://registry.yarnpkg.com/async/-/async-3.1.0.tgz#42b3b12ae1b74927b5217d8c0016baaf62463772" | ||||
|   integrity sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ== | ||||
| 
 | ||||
| async@^1.5.2: | ||||
|   version "1.5.2" | ||||
|   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" | ||||
|   integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= | ||||
| 
 | ||||
| async@^2.6.0: | ||||
|   version "2.6.3" | ||||
|   resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" | ||||
|  | @ -1551,6 +1548,21 @@ autwh@0.1.0: | |||
|   dependencies: | ||||
|     oauth "0.9.15" | ||||
| 
 | ||||
| aws-sdk@2.500.0: | ||||
|   version "2.500.0" | ||||
|   resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.500.0.tgz#2e4c5b7027c2d583fd0018f0aeed712cea135f7f" | ||||
|   integrity sha512-zVSO6STyBbbn5foqiH8Z0agpudtOibSRLhTXNkVnJTwJwYK5f9mv5WKOKcLivx/fvXwVE8QehZWyE3vBzl8I+w== | ||||
|   dependencies: | ||||
|     buffer "4.9.1" | ||||
|     events "1.1.1" | ||||
|     ieee754 "1.1.8" | ||||
|     jmespath "0.15.0" | ||||
|     querystring "0.2.0" | ||||
|     sax "1.2.1" | ||||
|     url "0.10.3" | ||||
|     uuid "3.3.2" | ||||
|     xml2js "0.4.19" | ||||
| 
 | ||||
| aws-sign2@~0.7.0: | ||||
|   version "0.7.0" | ||||
|   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" | ||||
|  | @ -1725,16 +1737,12 @@ bl@^1.0.0: | |||
|     readable-stream "^2.3.5" | ||||
|     safe-buffer "^5.1.1" | ||||
| 
 | ||||
| block-stream2@^1.0.0: | ||||
|   version "1.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/block-stream2/-/block-stream2-1.1.0.tgz#c738e3a91ba977ebb5e1fef431e13ca11d8639e2" | ||||
|   integrity sha1-xzjjqRupd+u14f70MeE8oR2GOeI= | ||||
|   dependencies: | ||||
|     defined "^1.0.0" | ||||
|     inherits "^2.0.1" | ||||
|     readable-stream "^2.0.4" | ||||
| bluebird@^3.1.1, bluebird@^3.4.1, bluebird@^3.5.1: | ||||
|   version "3.5.4" | ||||
|   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" | ||||
|   integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== | ||||
| 
 | ||||
| bluebird@^3.1.1, bluebird@^3.4.1, bluebird@^3.5.1, bluebird@^3.5.5: | ||||
| bluebird@^3.5.5: | ||||
|   version "3.5.5" | ||||
|   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" | ||||
|   integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== | ||||
|  | @ -1927,7 +1935,7 @@ buffer-xor@^1.0.3: | |||
|   resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" | ||||
|   integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= | ||||
| 
 | ||||
| buffer@^4.3.0: | ||||
| buffer@4.9.1, buffer@^4.3.0: | ||||
|   version "4.9.1" | ||||
|   resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" | ||||
|   integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= | ||||
|  | @ -2653,7 +2661,7 @@ concat-map@0.0.1: | |||
|   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" | ||||
|   integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= | ||||
| 
 | ||||
| concat-stream@^1.4.7, concat-stream@^1.4.8, concat-stream@^1.5.0, concat-stream@^1.6.0: | ||||
| concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: | ||||
|   version "1.6.2" | ||||
|   resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" | ||||
|   integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== | ||||
|  | @ -3769,11 +3777,6 @@ es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@ | |||
|     es6-symbol "~3.1.1" | ||||
|     next-tick "^1.0.0" | ||||
| 
 | ||||
| es6-error@^2.0.2: | ||||
|   version "2.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-2.1.1.tgz#91384301ec5ed1c9a7247d1128247216f03547cd" | ||||
|   integrity sha1-kThDAexe0cmnJH0RKCRyFvA1R80= | ||||
| 
 | ||||
| es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: | ||||
|   version "2.0.3" | ||||
|   resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" | ||||
|  | @ -3983,6 +3986,11 @@ eventemitter3@4.0.0: | |||
|   resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" | ||||
|   integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== | ||||
| 
 | ||||
| events@1.1.1: | ||||
|   version "1.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" | ||||
|   integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= | ||||
| 
 | ||||
| events@^3.0.0: | ||||
|   version "3.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" | ||||
|  | @ -5375,7 +5383,7 @@ https-browserify@^1.0.0: | |||
|   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" | ||||
|   integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= | ||||
| 
 | ||||
| https-proxy-agent@^2.2.1: | ||||
| https-proxy-agent@2.2.2, https-proxy-agent@^2.2.1: | ||||
|   version "2.2.2" | ||||
|   resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793" | ||||
|   integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg== | ||||
|  | @ -5383,6 +5391,13 @@ https-proxy-agent@^2.2.1: | |||
|     agent-base "^4.3.0" | ||||
|     debug "^3.1.0" | ||||
| 
 | ||||
| humanize-ms@^1.2.1: | ||||
|   version "1.2.1" | ||||
|   resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" | ||||
|   integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= | ||||
|   dependencies: | ||||
|     ms "^2.0.0" | ||||
| 
 | ||||
| humanize-number@0.0.2: | ||||
|   version "0.0.2" | ||||
|   resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18" | ||||
|  | @ -5402,6 +5417,11 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: | |||
|   dependencies: | ||||
|     postcss "^7.0.14" | ||||
| 
 | ||||
| ieee754@1.1.8: | ||||
|   version "1.1.8" | ||||
|   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" | ||||
|   integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q= | ||||
| 
 | ||||
| ieee754@^1.1.4: | ||||
|   version "1.1.13" | ||||
|   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" | ||||
|  | @ -6068,6 +6088,11 @@ isurl@^1.0.0-alpha5: | |||
|     has-to-string-tag-x "^1.2.0" | ||||
|     is-object "^1.0.1" | ||||
| 
 | ||||
| jmespath@0.15.0: | ||||
|   version "0.15.0" | ||||
|   resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" | ||||
|   integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= | ||||
| 
 | ||||
| jpeg-js@^0.3.3: | ||||
|   version "0.3.5" | ||||
|   resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.5.tgz#6fbd6cd0e49627c5a0341796c9e50c70a2aa3673" | ||||
|  | @ -6188,11 +6213,6 @@ json-stable-stringify-without-jsonify@^1.0.1: | |||
|   resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" | ||||
|   integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= | ||||
| 
 | ||||
| json-stream@^1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/json-stream/-/json-stream-1.0.0.tgz#1a3854e28d2bbeeab31cc7ddf683d2ddc5652708" | ||||
|   integrity sha1-GjhU4o0rvuqzHMfd9oPS3cVlJwg= | ||||
| 
 | ||||
| json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: | ||||
|   version "5.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" | ||||
|  | @ -6861,7 +6881,7 @@ lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: | |||
|   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" | ||||
|   integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= | ||||
| 
 | ||||
| lodash@^4.13.1, lodash@^4.14.0, lodash@^4.14.2, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4: | ||||
| lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4: | ||||
|   version "4.17.14" | ||||
|   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" | ||||
|   integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== | ||||
|  | @ -7170,7 +7190,7 @@ mime-db@1.40.0, "mime-db@>= 1.40.0 < 2", mime-db@^1.28.0: | |||
|   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" | ||||
|   integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== | ||||
| 
 | ||||
| mime-types@^2.1.12, mime-types@^2.1.14, mime-types@^2.1.18, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: | ||||
| mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: | ||||
|   version "2.1.24" | ||||
|   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" | ||||
|   integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== | ||||
|  | @ -7229,25 +7249,6 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: | |||
|   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" | ||||
|   integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= | ||||
| 
 | ||||
| minio@7.0.10: | ||||
|   version "7.0.10" | ||||
|   resolved "https://registry.yarnpkg.com/minio/-/minio-7.0.10.tgz#f8645eaf437e7de19f4dcfba8f55236a86e91959" | ||||
|   integrity sha512-Qs7MHHCfanu/xzZo9gCU0Rf3WZVgTKadaOy8jm6epdU5c6tAp0Tbcekzy13ECfE/w2pn0ku611B8hgy2O+7tNA== | ||||
|   dependencies: | ||||
|     async "^1.5.2" | ||||
|     block-stream2 "^1.0.0" | ||||
|     concat-stream "^1.4.8" | ||||
|     es6-error "^2.0.2" | ||||
|     json-stream "^1.0.0" | ||||
|     lodash "^4.14.2" | ||||
|     mime-types "^2.1.14" | ||||
|     mkdirp "^0.5.1" | ||||
|     querystring "0.2.0" | ||||
|     through2 "^0.6.5" | ||||
|     uuid "^3.1.0" | ||||
|     xml "^1.0.0" | ||||
|     xml2js "^0.4.15" | ||||
| 
 | ||||
| minipass@^2.2.1, minipass@^2.3.5: | ||||
|   version "2.3.5" | ||||
|   resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" | ||||
|  | @ -7381,7 +7382,7 @@ ms@2.1.1: | |||
|   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" | ||||
|   integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== | ||||
| 
 | ||||
| ms@2.1.2, ms@^2.1.1: | ||||
| ms@2.1.2, ms@^2.0.0, ms@^2.1.1: | ||||
|   version "2.1.2" | ||||
|   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" | ||||
|   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== | ||||
|  | @ -9142,11 +9143,6 @@ progress@^2.0.0: | |||
|   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" | ||||
|   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== | ||||
| 
 | ||||
| promise-any@0.2.0: | ||||
|   version "0.2.0" | ||||
|   resolved "https://registry.yarnpkg.com/promise-any/-/promise-any-0.2.0.tgz#7aeaafd6297698d8874cb7d3bc7c0faf89fffe8a" | ||||
|   integrity sha1-euqv1il2mNiHTLfTvHwPr4n//oo= | ||||
| 
 | ||||
| promise-inflight@^1.0.1: | ||||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" | ||||
|  | @ -9508,7 +9504,7 @@ read-pkg@^1.0.0: | |||
|     normalize-package-data "^2.3.2" | ||||
|     path-type "^1.0.0" | ||||
| 
 | ||||
| "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: | ||||
| "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: | ||||
|   version "2.3.6" | ||||
|   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" | ||||
|   integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== | ||||
|  | @ -9540,16 +9536,6 @@ readable-stream@1.1.x, readable-stream@~1.1.9: | |||
|     string_decoder "^1.1.1" | ||||
|     util-deprecate "^1.0.1" | ||||
| 
 | ||||
| "readable-stream@>=1.0.33-1 <1.1.0-0": | ||||
|   version "1.0.34" | ||||
|   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" | ||||
|   integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= | ||||
|   dependencies: | ||||
|     core-util-is "~1.0.0" | ||||
|     inherits "~2.0.1" | ||||
|     isarray "0.0.1" | ||||
|     string_decoder "~0.10.x" | ||||
| 
 | ||||
| readdirp@^2.2.1: | ||||
|   version "2.2.1" | ||||
|   resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" | ||||
|  | @ -10046,6 +10032,11 @@ sax@0.5.x: | |||
|   resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" | ||||
|   integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= | ||||
| 
 | ||||
| sax@1.2.1: | ||||
|   version "1.2.1" | ||||
|   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" | ||||
|   integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= | ||||
| 
 | ||||
| sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: | ||||
|   version "1.2.4" | ||||
|   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" | ||||
|  | @ -11026,14 +11017,6 @@ through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: | |||
|     readable-stream "~2.3.6" | ||||
|     xtend "~4.0.1" | ||||
| 
 | ||||
| through2@^0.6.5: | ||||
|   version "0.6.5" | ||||
|   resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" | ||||
|   integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= | ||||
|   dependencies: | ||||
|     readable-stream ">=1.0.33-1 <1.1.0-0" | ||||
|     xtend ">=4.0.0 <4.1.0-0" | ||||
| 
 | ||||
| through2@^3.0.0: | ||||
|   version "3.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" | ||||
|  | @ -11567,6 +11550,14 @@ url-to-options@^1.0.1: | |||
|   resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" | ||||
|   integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= | ||||
| 
 | ||||
| url@0.10.3: | ||||
|   version "0.10.3" | ||||
|   resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" | ||||
|   integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= | ||||
|   dependencies: | ||||
|     punycode "1.3.2" | ||||
|     querystring "0.2.0" | ||||
| 
 | ||||
| url@^0.11.0: | ||||
|   version "0.11.0" | ||||
|   resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" | ||||
|  | @ -12194,7 +12185,7 @@ xml-name-validator@^3.0.0: | |||
|   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" | ||||
|   integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== | ||||
| 
 | ||||
| xml2js@^0.4.15, xml2js@^0.4.17: | ||||
| xml2js@0.4.19, xml2js@^0.4.17: | ||||
|   version "0.4.19" | ||||
|   resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" | ||||
|   integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== | ||||
|  | @ -12202,11 +12193,6 @@ xml2js@^0.4.15, xml2js@^0.4.17: | |||
|     sax ">=0.6.0" | ||||
|     xmlbuilder "~9.0.1" | ||||
| 
 | ||||
| xml@^1.0.0: | ||||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" | ||||
|   integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= | ||||
| 
 | ||||
| xmlbuilder@~9.0.1: | ||||
|   version "9.0.7" | ||||
|   resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" | ||||
|  | @ -12217,10 +12203,10 @@ xmlchars@^2.1.1: | |||
|   resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.1.1.tgz#ef1a81c05bff629c2280007f12daca21bd6f6c93" | ||||
|   integrity sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w== | ||||
| 
 | ||||
| "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: | ||||
|   version "4.0.2" | ||||
|   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" | ||||
|   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== | ||||
| xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: | ||||
|   version "4.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" | ||||
|   integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= | ||||
| 
 | ||||
| y18n@^3.2.1: | ||||
|   version "3.2.1" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue