From 6fb5c30b1dc7888b34f0d805476d23fa581208dc Mon Sep 17 00:00:00 2001 From: Bronwen Date: Fri, 21 May 2021 23:31:35 -0400 Subject: [PATCH 01/25] systems save to disk. Closes #3 --- package.json | 4 + src/Instance.ts | 62 +++++++++++--- src/KV.ts | 3 - src/Serializable.ts | 198 -------------------------------------------- src/System.ts | 26 ++++-- src/extensions.ts | 5 ++ src/run.ts | 7 +- test/counter.v | 1 + test/main.v | 2 + yarn.lock | 50 +++++++++++ 10 files changed, 136 insertions(+), 222 deletions(-) delete mode 100644 src/KV.ts delete mode 100644 src/Serializable.ts diff --git a/package.json b/package.json index 3eb38b9..7fae617 100644 --- a/package.json +++ b/package.json @@ -18,12 +18,15 @@ }, "dependencies": { "@types/debug": "^4.1.5", + "@types/fs-extra": "^9.0.11", "@types/lodash": "^4.14.169", "@types/nearley": "^2.11.1", "@types/node": "^15.3.0", "@types/uglify-js": "^3.13.0", + "@types/uuid": "^8.3.0", "cross-env": "^7.0.3", "debug": "^4.3.1", + "fs-extra": "^10.0.0", "lodash": "^4.17.21", "moo": "^0.5.1", "nearley": "^2.20.1", @@ -31,6 +34,7 @@ "supervisor": "^0.12.0", "typescript": "^4.2.4", "uglify-js": "^3.13.5", + "uuid": "^8.3.2", "yarn": "^1.22.10" } } diff --git a/src/Instance.ts b/src/Instance.ts index b9b5cb4..ff84599 100644 --- a/src/Instance.ts +++ b/src/Instance.ts @@ -1,20 +1,27 @@ - -import Serializable from './Serializable.js'; -import minify from './minify.js'; import debug from 'debug'; import _ from 'lodash'; const log = debug('vogue:instance'); import vm from 'vm'; -import Module, { Link } from './Module.js'; +import Module, { Link, Variable } from './Module.js'; import System from './System.js'; -import { KV } from './KV.js'; +import * as uuid from 'uuid'; /** * @typedef {import('./System.js').default} System * @typedef {import('./Module.js').default} Module */ +export type SerializedInstance = { + type: string, + links: { + [name: string]: string + }, + members: { + [name: string]: any // SO LONG AS ITS SERIALIZABLE ._.* + }, + id: string +} -export default class Instance extends Serializable { +export default class Instance { module: Module; links = {} system: System; @@ -23,11 +30,12 @@ export default class Instance extends Serializable { internalFunctions = {}; _link: Instance; location: string; + _id: string; createContext(): vm.Context { if(this.context) return this.context; - const initialContext: KV = {}; + const initialContext: any = {}; // system globals! // TODO turn this into its own vogue module! system.create/instance.create @@ -49,34 +57,38 @@ export default class Instance extends Serializable { for(const name in this.module.imports) initialContext[name] = this.module.imports[name]; + // instance defined functions + initialContext.sync = this.system.saveInstance.bind(this.system, this); + const context = vm.createContext(initialContext); + // user defined functions for(const name in this.module.functions) { const { code, parameters, async } = this.module.functions[name]; const injectedScript = ` var ${name} = ${async ? 'async' : ''} function ${name}(${parameters.join(', ')}) ${code} +${name} = ${name}.bind(this); `; - vm.runInContext(injectedScript, context, { - - }); + vm.runInContext(injectedScript, context, {}); } return context; }; constructor(module: Module, location: string, parameters: {[name: string]: any}, system: System) { - super(); this.module = module; this.location = location; this.system = system; this.context = this.createContext(); + this._id = uuid.v4(); this._link = new Proxy(this, { get(target: Instance, prop: string, receiver) { log(`getting ${target.module.name.full}.${prop}: (${target.module.identifiers[prop]}|${typeof target.context[prop]})`); const DNEText = `${target.module.name.full}.${prop.toString()} either does not exist, or is not accessible`; if(prop === 'restore') throw new Error(DNEText); + if(prop === '__link__') return target._id; if(prop in target.module.functions) { return target.context[prop]; @@ -93,4 +105,32 @@ var ${name} = ${async ? 'async' : ''} function ${name}(${parameters.join(', ')}) get link () { return this._link; } + + toSerializableObject(): SerializedInstance { + const obj: any = {}; + obj.type = this.module.name.full; + obj.links = Object.fromEntries(this.module.links.map((link: Link): [string, string] => { + const name = link.name; + const linkId = this.context[name]?.__link__; + return [name, linkId]; + })); + obj.members = Object.fromEntries( + this.module.variables + .filter((member: Variable): boolean => { + return member.persist; + }) + .map((member: Variable): [string, any] => { + const name = member.name; + const value = this.context[name]; + return [name, value]; + }) + ); + obj.id = this._id; + + return obj as SerializedInstance; + } + + toString() { + return this.module.name.full + '(' + this._id + ')'; + } } \ No newline at end of file diff --git a/src/KV.ts b/src/KV.ts deleted file mode 100644 index 795fc4d..0000000 --- a/src/KV.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type KV = { - [key: string]: any -}; \ No newline at end of file diff --git a/src/Serializable.ts b/src/Serializable.ts deleted file mode 100644 index c410650..0000000 --- a/src/Serializable.ts +++ /dev/null @@ -1,198 +0,0 @@ -// import { Ubjson } from '@shelacek/ubjson'; -import { existsSync, readFileSync, writeFileSync } from 'fs'; -import { KV } from './KV'; - -export default class Serializable { - - constructor(...args: any[]) {} - - // things that need to be stored only in cold - // storage are keyed with a special prefix - static CLASS_REFERENCE = '$$CLASS_NAME'; - - // things that need to be stored only at runtime - // are keyed with symbols to not interfere with - // user code. - static PERSIST_LOCATION = Symbol('PERSIST_LOCATION'); - - start() {} - - // toUbj() { - // return Ubjson.encode(this.toSerializableObject()); - // } - - // static fromUbj(buffer) { - // return this.fromSerializableObject(Ubjson.decode(buffer)); - // } - - toJson() { - return JSON.stringify(this.toSerializableObject(), null, 2); - } - - static serializationDependencies(): any[] { - return []; - } - - static fromJson(str: string) { - return this.fromSerializableObject(JSON.parse(str)); - } - - toSerializableObject() { - - const transformValue = (val: any): any => { - if(Array.isArray(val)) { - return transformArray(val); - } else if (val === null || val === undefined) { - return val; - } else if(typeof val === 'object') { - return transformObject(val); - } else { - return val; - } - } - - const transformObject = (obj: KV): KV => { - const clone: KV = {}; - for(const prop of Object.keys(obj)) { - if(prop.startsWith('_')) continue; - - clone[prop] = transformValue(obj[prop]); - } - if(obj instanceof Serializable) { - clone[Serializable.CLASS_REFERENCE] = obj.constructor.name; - } - return clone; - } - - const transformArray = (arr: any[]): any[] => { - const clone = []; - for(const item of arr) { - clone.push(transformValue(item)); - } - return clone; - } - - return transformObject(this); - } - - static fromSerializableObject(obj: KV) { - if(obj[Serializable.CLASS_REFERENCE] !== this.name) return null; - - const transformValue = (val: any): any => { - if(Array.isArray(val)) { - return transformArray(val); - } else if(val === null || val === undefined) { - return val; - } else if(typeof val === 'object') { - if(Serializable.CLASS_REFERENCE in val) { - const classes = this.serializationDependencies(); - const matchingClasses = classes.filter((classObject) => { - classObject.name === val[Serializable.CLASS_REFERENCE] - }); - if(matchingClasses.length === 1) { - return matchingClasses[0].fromSerializableObject(val); - } else { - return transformObject(val); - } - } - return transformObject(val); - } else { - return val; - } - } - - const transformObject = (obj: KV): KV => { - const clone: KV = {}; - for(const prop of Object.keys(obj)) { - if(prop.startsWith('_')) continue; - - clone[prop] = transformValue(obj[prop]); - } - return clone; - } - - const transformArray = (arr: any[]): any[] => { - const clone = []; - for(const item of arr) { - clone.push(transformValue(item)); - } - return clone; - } - - const clone = transformObject(obj); - if(Serializable.CLASS_REFERENCE in obj) - clone.__proto__ = this.prototype; - - clone.restore(); - - return clone; - } - - serialize({ - encoding = 'json' - } = {}) { - - switch(encoding) { - case 'json': return this.toJson(); - case 'ubjson': - // case 'ubj': return this.toUbj(); - default: { - throw new TypeError('Unknown encoding: ' + encoding); - } - } - - } - - static deserialize(obj: any, { - encoding = 'json' - } = {}) { - - switch(encoding) { - case 'json': return this.fromJson(obj); - case 'ubjson': - // case 'ubj': return this.fromUbj(obj); - default: { - throw new TypeError('Unknown encoding: ' + encoding); - } - } - } - - async restore() {} - - static createFromDisk(filename: string, ...args: any[]) { - if(existsSync(filename)) { - const instance = this.deserialize(readFileSync(createFilepath(filename))); - // TS is plain and simply wrong... symbols can be used to index object... - // @ts-ignore - instance[Serializable.PERSIST_LOCATION] = createFilepath(filename); - instance?.restore(); - return instance; - } else { - const instance = new this(...args); - // again... TS is wrong... - // @ts-ignore - instance[Serializable.PERSIST_LOCATION] = createFilepath(filename); - instance?.updateDisk(); - return instance; - } - } - - updateDisk(filepath?: string) { - // if it hasnt yet been written to disk... - // this can happen if the contrustor - // was called outside of createFromDisk - if(filepath) { - // see above... TS7053 is just _wrong_. incorrect. thats not how JS works. - // @ts-ignore - this[Serializable.PERSIST_LOCATION] = createFilepath(filepath); - } - const data = this.serialize(); - // this is getting annoying... - // @ts-ignore - writeFileSync(this[Serializable.PERSIST_LOCATION], data); - } -} - -function createFilepath(path: string) { - return `data/${path}`; -} \ No newline at end of file diff --git a/src/System.ts b/src/System.ts index 0d51240..79e85d6 100644 --- a/src/System.ts +++ b/src/System.ts @@ -1,8 +1,10 @@ import Instance from './Instance.js'; -import Serializable from './Serializable.js'; import _ from 'lodash'; import Module from './Module.js'; import debug from 'debug'; +import { writeFileSync } from 'fs'; +import { resolve } from 'path'; +import { ensureDirSync } from 'fs-extra'; const log = debug('vogue:system') const {get, set} = _; @@ -13,7 +15,7 @@ type ModuleNamespaceMap = { type ModuleName = string; -class System extends Serializable { +class System { instances: Instance[] = []; modules: Module[]; namespace: ModuleNamespaceMap = {}; @@ -23,12 +25,11 @@ class System extends Serializable { rootDir: string; constructor(modules: Module[], rootDir: string) { - super(); + this.rootDir = rootDir; this.modules = modules; this.createNamespace(); const bootModules = this.deriveBootModules(); this.createStaticInstances(); - this.rootDir = rootDir; log('instantiating boot modules...'); for(const name of bootModules) { @@ -79,6 +80,19 @@ class System extends Serializable { }, {}); } + saveInstance(instance: Instance): void { + log('saving ' + instance) + const path = resolve(this.rootDir, '.system'); + ensureDirSync(path); + const file = instance._id + '.json'; + const filepath = resolve(path, file); + log(filepath); + const json = JSON.stringify(instance.toSerializableObject(), null, 2) + log(json); + writeFileSync(filepath, json); + log('synced ' + instance); + } + getModule(name: ModuleName): Module { const module = get(this.namespace, name); if(module instanceof Module) return module; @@ -86,7 +100,9 @@ class System extends Serializable { } createInstance(name: ModuleName, args = {}) { - return new Instance(this.getModule(name), '', args, this); + const instance = new Instance(this.getModule(name), '', args, this); + this.saveInstance(instance); + return instance; } newInstance(name: ModuleName, args = {}) { diff --git a/src/extensions.ts b/src/extensions.ts index e0bb37d..06b0441 100644 --- a/src/extensions.ts +++ b/src/extensions.ts @@ -4,3 +4,8 @@ Object.defineProperty(Array.prototype, 'empty', { return this.length === 0; } }); + + +process.on('unhandledRejection', (reason: Error, p) => { + console.log(reason.stack ?? reason.name + '\n\nStack trace unavailable...'); +}); \ No newline at end of file diff --git a/src/run.ts b/src/run.ts index ed37cc7..5de9ebb 100644 --- a/src/run.ts +++ b/src/run.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env node +#!/usr/bin/env node --enable-source-maps --unhandled-rejections=strict import debug from 'debug'; const log = debug('vogue:cli'); const systemLocation = resolve(process.argv[2]); @@ -11,14 +11,11 @@ import Module from './Module.js'; import System from './System.js'; import './extensions.js'; import { fileURLToPath } from 'url'; -// globals inside grammar context -import minify from './minify'; const { get, set } = _; const standardLibrary = resolve(fileURLToPath(dirname(import.meta.url)), '..', 'lib', 'vogue'); (async () => { - // TODO simplify this line gaddam const ignoreDeps = (path: string) => parse(path).name !== 'node_modules'; const files = [ @@ -35,7 +32,7 @@ const standardLibrary = resolve(fileURLToPath(dirname(import.meta.url)), '..', ' const modules = await Promise.all(fullpaths.map(loc => Module.create(loc, systemLocation))); const sys = new System(modules, systemLocation); -})() +})(); function walkdirSync(root: string, filter: ((path: string) => boolean) = () => true): string[] { log('reading', root, '...'); diff --git a/test/counter.v b/test/counter.v index 3e04bf3..f241772 100644 --- a/test/counter.v +++ b/test/counter.v @@ -2,6 +2,7 @@ member count; increment() { count ++; + sync(); } getCount() { diff --git a/test/main.v b/test/main.v index a901312..cd334cf 100644 --- a/test/main.v +++ b/test/main.v @@ -19,4 +19,6 @@ async restore { // window.setScene() // await counter.render(); + + sync(); } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 3bfd784..4231fa1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,6 +6,13 @@ version "4.1.5" resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz" +"@types/fs-extra@^9.0.11": + version "9.0.11" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.11.tgz#8cc99e103499eab9f347dbc6ca4e99fb8d2c2b87" + integrity sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA== + dependencies: + "@types/node" "*" + "@types/lodash@^4.14.169": version "4.14.169" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.169.tgz" @@ -14,6 +21,11 @@ version "2.11.1" resolved "https://registry.npmjs.org/@types/nearley/-/nearley-2.11.1.tgz" +"@types/node@*": + version "15.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.0.tgz#f0ddca5a61e52627c9dcb771a6039d44694597bc" + integrity sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A== + "@types/node@^15.3.0": version "15.3.0" resolved "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz" @@ -24,6 +36,11 @@ dependencies: source-map "^0.6.1" +"@types/uuid@^8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" + integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== + async@0.2.10: version "0.2.10" resolved "https://registry.npmjs.org/async/-/async-0.2.10.tgz" @@ -62,6 +79,20 @@ discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz" +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" @@ -70,6 +101,15 @@ isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + lie@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz" @@ -172,6 +212,16 @@ underscore@~1.4.4: version "1.4.4" resolved "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" From f604948d715b9610a5629d91ee836af11607026e Mon Sep 17 00:00:00 2001 From: Bronwen Date: Fri, 21 May 2021 23:31:55 -0400 Subject: [PATCH 02/25] attempt to fix travis --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ba8e41f..bc37bc4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,4 +4,5 @@ node_js: os: - windows - linux - - osx \ No newline at end of file + - osx +env: YARN_GPG=no \ No newline at end of file From 7a12c1adb8c74ce55497d9fb9ddf4fbc764f35b5 Mon Sep 17 00:00:00 2001 From: Bronwen Date: Fri, 21 May 2021 23:43:08 -0400 Subject: [PATCH 03/25] automatic syncing of members on change. Closes #2 --- .gitignore | 1 + .npmignore | 3 ++- src/Instance.ts | 22 ++++++++++++++++++++-- test/counter.v | 1 - 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 884a4d8..1998067 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules out +.system \ No newline at end of file diff --git a/.npmignore b/.npmignore index ff53e28..4a8977f 100644 --- a/.npmignore +++ b/.npmignore @@ -2,4 +2,5 @@ node_modules src test .editorconfig -tsconfig.json \ No newline at end of file +tsconfig.json +.system \ No newline at end of file diff --git a/src/Instance.ts b/src/Instance.ts index ff84599..567fc49 100644 --- a/src/Instance.ts +++ b/src/Instance.ts @@ -52,8 +52,11 @@ export default class Instance { initialContext[link.name] = []; for(const link of this.module.links.filter((v: Link) => !v.array && !v.required)) initialContext[link.name] = null; - for(const variable of this.module.variables) - initialContext[variable.name] = null; + for(const variable of this.module.variables) { + attachHookedProperty(initialContext, variable.name, null, () => { + this.system.saveInstance(this); + }) + } for(const name in this.module.imports) initialContext[name] = this.module.imports[name]; @@ -133,4 +136,19 @@ ${name} = ${name}.bind(this); toString() { return this.module.name.full + '(' + this._id + ')'; } +} + +function attachHookedProperty(target: any, name: string, initialValue: any, changedHook: () => void) { + const propId = uuid.v4(); + target[propId] = initialValue; + // TODO if its an object, replace it with a dead simple proxy? for detecting internal changes... + Object.defineProperty(target, name, { + get() { + return target[propId]; + }, + set(value) { + target[propId] = value; + changedHook(); + } + }) } \ No newline at end of file diff --git a/test/counter.v b/test/counter.v index f241772..3e04bf3 100644 --- a/test/counter.v +++ b/test/counter.v @@ -2,7 +2,6 @@ member count; increment() { count ++; - sync(); } getCount() { From 24467f479ae684ce5135b95a3920bf46802fcadc Mon Sep 17 00:00:00 2001 From: Valerie Date: Sat, 22 May 2021 13:18:01 -0400 Subject: [PATCH 04/25] lots of potential issues, but definitely Closes #21 --- package.json | 2 +- src/Instance.ts | 96 ++++++++++++++++++++++++++++++------------ src/Module.ts | 4 +- src/System.ts | 108 +++++++++++++++++++++++++++++++++++++++++------- vogue-0.0.1.tgz | Bin 30409 -> 0 bytes 5 files changed, 165 insertions(+), 45 deletions(-) delete mode 100644 vogue-0.0.1.tgz diff --git a/package.json b/package.json index 7fae617..453cd61 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "scripts": { "test": "node --enable-source-maps --unhandled-rejections=strict out/run.js test", "debug": "cross-env DEBUG=vogue:* yarn test", - "debug:watch": "cross-env DEBUG=vogue:* supervisor -w out,test,lib -n exit --exec yarn -- test", + "debug:watch": "cross-env DEBUG=vogue:* supervisor -w out,test/**/*.v,lib -n exit --exec yarn -- test", "postinstall": "yarn compile && cd test && yarn", "postcompile:watch": "echo DONE", "compile": "tsc", diff --git a/src/Instance.ts b/src/Instance.ts index 567fc49..9ce88dd 100644 --- a/src/Instance.ts +++ b/src/Instance.ts @@ -2,7 +2,7 @@ import debug from 'debug'; import _ from 'lodash'; const log = debug('vogue:instance'); import vm from 'vm'; -import Module, { Link, Variable } from './Module.js'; +import Module, { LinkDescription, Variable } from './Module.js'; import System from './System.js'; import * as uuid from 'uuid'; /** @@ -10,6 +10,8 @@ import * as uuid from 'uuid'; * @typedef {import('./Module.js').default} Module */ +export type Link = any; // BUT PROXY + export type SerializedInstance = { type: string, links: { @@ -25,38 +27,49 @@ export default class Instance { module: Module; links = {} system: System; - context: vm.Context; + context: vm.Context | null = null; locals = []; internalFunctions = {}; _link: Instance; location: string; _id: string; + initialContext: any = {}; + + get currentContext(): any { + return this.context ?? this.initialContext; + } + + sync() { + this.system.saveInstance(this); + } createContext(): vm.Context { if(this.context) return this.context; + const initialContext: any = {}; // system globals! // TODO turn this into its own vogue module! system.create/instance.create // TODO request context from system... - initialContext.create = this.system.newInstance.bind(this.system); + initialContext.create = this.system.newLink.bind(this.system); initialContext.process = process; - for(const name in this.system.staticInstances) - initialContext[name] = this.system.staticInstances[name]; + for(const name in this.system.staticLinks) { + log('creating context with static link: ' + name); + initialContext[name] = this.system.staticLinks[name]; + } // local links! // optional arrays // TODO maybe make these property accessors to allow for some automation - for(const link of this.module.links.filter((v: Link) => v.array && !v.required)) + for(const link of this.module.links.filter((v: LinkDescription) => v.array && !v.required)) initialContext[link.name] = []; - for(const link of this.module.links.filter((v: Link) => !v.array && !v.required)) + for(const link of this.module.links.filter((v: LinkDescription) => !v.array && !v.required)) initialContext[link.name] = null; - for(const variable of this.module.variables) { - attachHookedProperty(initialContext, variable.name, null, () => { - this.system.saveInstance(this); - }) - } + for(const variable of this.module.variables) + attachHookedProperty(initialContext, variable.name, null, this.sync.bind(this)) + for(const name in this.initialContext) + initialContext[name] = this.initialContext[name] for(const name in this.module.imports) initialContext[name] = this.module.imports[name]; @@ -68,41 +81,70 @@ export default class Instance { // user defined functions for(const name in this.module.functions) { const { code, parameters, async } = this.module.functions[name]; - const injectedScript = -` -var ${name} = ${async ? 'async' : ''} function ${name}(${parameters.join(', ')}) ${code} -${name} = ${name}.bind(this); -`; + const injectedScript = ` + var ${name} = ${async ? 'async ' : ''}function ${name}(${parameters.join(', ')}) ${code} + ${name} = ${name}.bind(this);`.trim(); + // log('injecting function...') + // log(injectedScript) vm.runInContext(injectedScript, context, {}); } + log('context created! ' + Object.keys(context)); + // log(context); + return context; }; - constructor(module: Module, location: string, parameters: {[name: string]: any}, system: System) { + setMember(name: string, value: any) { + log('setMember: ' + this.toString() + '.' + name + ' => ' + value); + this.currentContext[name] = value; + } + + setLink(name: string, value: Link) { + log('setLink: ' + this.toString() + '.' + name + ' => ' + value.__link__); + this.currentContext[name] = value; + } + + constructor( + module: Module, + location: string, + parameters: {[name: string]: any}, + system: System, + options?: { + id?: string + } + ) { this.module = module; this.location = location; this.system = system; - this.context = this.createContext(); - this._id = uuid.v4(); + // this.context = this.createContext(); + this._id = options?.id ?? uuid.v4(); this._link = new Proxy(this, { get(target: Instance, prop: string, receiver) { - log(`getting ${target.module.name.full}.${prop}: (${target.module.identifiers[prop]}|${typeof target.context[prop]})`); + log(`getting ${target.module.name.full}.${prop.toString()}: (${target.module.identifiers[prop]}|${typeof target.context?.[prop]})`); + + if(target.context === null) + target.restore(); + const DNEText = `${target.module.name.full}.${prop.toString()} either does not exist, or is not accessible`; if(prop === 'restore') throw new Error(DNEText); if(prop === '__link__') return target._id; if(prop in target.module.functions) { - return target.context[prop]; + return target.context?.[prop]; } throw new Error(DNEText); } }); + log('created ' + this); } restore() { - return this.context.restore?.(); + if(this.context === null) + this.context = this.createContext(); + + return this.context?.restore?.(); } get link () { @@ -112,9 +154,9 @@ ${name} = ${name}.bind(this); toSerializableObject(): SerializedInstance { const obj: any = {}; obj.type = this.module.name.full; - obj.links = Object.fromEntries(this.module.links.map((link: Link): [string, string] => { + obj.links = Object.fromEntries(this.module.links.map((link: LinkDescription): [string, string] => { const name = link.name; - const linkId = this.context[name]?.__link__; + const linkId = this.context?.[name]?.__link__; return [name, linkId]; })); obj.members = Object.fromEntries( @@ -124,7 +166,7 @@ ${name} = ${name}.bind(this); }) .map((member: Variable): [string, any] => { const name = member.name; - const value = this.context[name]; + const value = this.context?.[name]; return [name, value]; }) ); @@ -134,7 +176,7 @@ ${name} = ${name}.bind(this); } toString() { - return this.module.name.full + '(' + this._id + ')'; + return this.module.name.full + '(' + this._id.substr(0, 4) + ')'; } } diff --git a/src/Module.ts b/src/Module.ts index 5e9f3a7..c36c14e 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -14,7 +14,7 @@ import { createRequire } from 'module'; import { pathToFileURL } from 'url'; const log = debug('vogue:module'); -export type Link = { +export type LinkDescription = { name: string, array: boolean, required: boolean @@ -26,7 +26,7 @@ export type Variable = { } export default class Module { - links: Link[] = []; + links: LinkDescription[] = []; globals = []; functions: { [name: string]: { diff --git a/src/System.ts b/src/System.ts index 79e85d6..503bb6c 100644 --- a/src/System.ts +++ b/src/System.ts @@ -1,8 +1,8 @@ -import Instance from './Instance.js'; +import Instance, { Link, SerializedInstance } from './Instance.js'; import _ from 'lodash'; import Module from './Module.js'; import debug from 'debug'; -import { writeFileSync } from 'fs'; +import { lstatSync, readdirSync, readFileSync, writeFileSync } from 'fs'; import { resolve } from 'path'; import { ensureDirSync } from 'fs-extra'; const log = debug('vogue:system') @@ -16,11 +16,11 @@ type ModuleNamespaceMap = { type ModuleName = string; class System { - instances: Instance[] = []; + instances: Map = new Map(); modules: Module[]; namespace: ModuleNamespaceMap = {}; - staticInstances: { - [key: string]: Instance + staticLinks: { + [key: string]: Link } = {}; rootDir: string; @@ -28,16 +28,87 @@ class System { this.rootDir = rootDir; this.modules = modules; this.createNamespace(); + + const vault = readdirSync(resolve(this.rootDir, '.system')).map(v => resolve(this.rootDir, '.system', v)); + const serializedInstances: SerializedInstance[] = vault.map((v) => JSON.parse(readFileSync(v).toString())); + + log('injecting serialized instances...'); + for(const serializedInstance of serializedInstances) + this.injectSerializedInstance(serializedInstance); + log('linking serialized instances...'); + for(const serializedInstance of serializedInstances) + this.linkSerializedInstance(serializedInstance); + + log('restoring static instances...'); + for(const [,instance] of this.instances) { + if(!!instance.module.static) { + instance.restore(); + } + } + + log('restoring boot instances...'); + for(const [,instance] of this.instances) { + if(!!instance.module.singleton) { + instance.restore(); + } + } + // this.inject(serializedInstance); + + + if (vault.length !== 0) { + return this; + } + + // TODO future workflow notes + // pull jsons into boots + // filter json boots + // create static / singletons into boots + // boot boots! + + const bootModules = this.deriveBootModules(); this.createStaticInstances(); log('instantiating boot modules...'); for(const name of bootModules) { log(' ' + name); - this.newInstance(name); + this.newLink(name); } } + linkSerializedInstance(serializedInstance: SerializedInstance): void { + const instance = this.getInstanceById(serializedInstance.id); + for(const name in serializedInstance.links) { + const linkId = serializedInstance.links[name] + const linkedInstance = this.getInstanceById(linkId); + const linkedInstanceLink = linkedInstance.link; + instance.setLink(name, linkedInstanceLink); + } + } + + injectSerializedInstance(serializedInstance: SerializedInstance): void { + const instance = new Instance(this.getModule(serializedInstance.type), this.rootDir, {}, this, { + id: serializedInstance.id + }); + this.instances.set(instance._id, instance); + + for(const name in serializedInstance.members) { + instance.setMember(name, serializedInstance.members[name]); + } + + if(instance.module.static) { + log('injected static instance ' + instance.module.static + ': ' + instance.module.name.full); + this.staticLinks[instance.module.static] = instance.link; + } + } + + getInstanceById(id: string): Instance { + if(!this.instances.has(id)) + throw new Error(`${id} is not a valid instance link id`); + + return this.instances.get(id) as Instance; + } + createStaticInstances() { log('deriving static modules...'); const staticModules = this.modules.filter((module) => { @@ -50,8 +121,8 @@ class System { log('instantiating static modules...'); for(const module of staticModules) { log(' ' + module.static + ': ' + module.name.full); - this.staticInstances[module.static] = - this.newInstance(module.name.full, {}); + this.staticLinks[module.static] = + this.newLink(module.name.full, {}); } } @@ -81,16 +152,13 @@ class System { } saveInstance(instance: Instance): void { - log('saving ' + instance) const path = resolve(this.rootDir, '.system'); ensureDirSync(path); const file = instance._id + '.json'; const filepath = resolve(path, file); - log(filepath); + log('saving ' + instance + '...'); const json = JSON.stringify(instance.toSerializableObject(), null, 2) - log(json); writeFileSync(filepath, json); - log('synced ' + instance); } getModule(name: ModuleName): Module { @@ -100,12 +168,12 @@ class System { } createInstance(name: ModuleName, args = {}) { - const instance = new Instance(this.getModule(name), '', args, this); + const instance = new Instance(this.getModule(name), this.rootDir, args, this); this.saveInstance(instance); return instance; } - newInstance(name: ModuleName, args = {}) { + newLink(name: ModuleName, args = {}) { const instance = this.createInstance(name, args); const link = instance.link; instance.restore(); @@ -113,4 +181,14 @@ class System { } } -export default System; \ No newline at end of file +export default System; + +// class SerializedInstanceInjector { +// system: System; +// serializedInstances: SerializedInstance[]; + +// constructor(serializedInstances: SerializedInstance[], system: System) { +// this.serializedInstances = serializedInstances; +// this.system = system; +// } +// } \ No newline at end of file diff --git a/vogue-0.0.1.tgz b/vogue-0.0.1.tgz deleted file mode 100644 index 7b94f1e2e2771997cf2f16b5084a4d7e24f60eef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30409 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 E08u|%{r~^~ From 6c62ae499436c29f7f9d7538658fd21816cbacd1 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sat, 22 May 2021 13:18:30 -0400 Subject: [PATCH 05/25] cleanup --- .gitignore | 3 ++- .npmignore | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 1998067..b017598 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules out -.system \ No newline at end of file +.system +*.tgz \ No newline at end of file diff --git a/.npmignore b/.npmignore index 4a8977f..76e8274 100644 --- a/.npmignore +++ b/.npmignore @@ -3,4 +3,5 @@ src test .editorconfig tsconfig.json -.system \ No newline at end of file +.system +*.tgz \ No newline at end of file From 463ecc62c1677840aff4ad04bc16aac04c3c8838 Mon Sep 17 00:00:00 2001 From: Bronwen Date: Sat, 22 May 2021 16:36:11 -0400 Subject: [PATCH 06/25] better tests? --- src/System.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/System.ts b/src/System.ts index 503bb6c..b7167e9 100644 --- a/src/System.ts +++ b/src/System.ts @@ -28,6 +28,8 @@ class System { this.rootDir = rootDir; this.modules = modules; this.createNamespace(); + + ensureDirSync(resolve(this.rootDir, '.system')); const vault = readdirSync(resolve(this.rootDir, '.system')).map(v => resolve(this.rootDir, '.system', v)); const serializedInstances: SerializedInstance[] = vault.map((v) => JSON.parse(readFileSync(v).toString())); From 23925a030f4a71043fb9ba4725072e2f4ab444e5 Mon Sep 17 00:00:00 2001 From: Bronwen Date: Sat, 22 May 2021 18:13:26 -0400 Subject: [PATCH 07/25] namespace parse tests! --- package.json | 6 +- tests/lexer.js | 20 ++ tests/modules/namespaceX.v | 1 + tests/modules/namespaceXY.v | 1 + tests/modules/namespaceXYZ.v | 1 + yarn.lock | 585 ++++++++++++++++++++++++++++++++++- 6 files changed, 610 insertions(+), 4 deletions(-) create mode 100644 tests/lexer.js create mode 100644 tests/modules/namespaceX.v create mode 100644 tests/modules/namespaceXY.v create mode 100644 tests/modules/namespaceXYZ.v diff --git a/package.json b/package.json index 453cd61..cd69462 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "vogue": "out/run.js" }, "scripts": { - "test": "node --enable-source-maps --unhandled-rejections=strict out/run.js test", - "debug": "cross-env DEBUG=vogue:* yarn test", + "test": "mocha tests", + "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", "debug:watch": "cross-env DEBUG=vogue:* supervisor -w out,test/**/*.v,lib -n exit --exec yarn -- test", "postinstall": "yarn compile && cd test && yarn", "postcompile:watch": "echo DONE", @@ -24,10 +24,12 @@ "@types/node": "^15.3.0", "@types/uglify-js": "^3.13.0", "@types/uuid": "^8.3.0", + "chai": "^4.3.4", "cross-env": "^7.0.3", "debug": "^4.3.1", "fs-extra": "^10.0.0", "lodash": "^4.17.21", + "mocha": "^8.4.0", "moo": "^0.5.1", "nearley": "^2.20.1", "nedb": "^1.8.0", diff --git a/tests/lexer.js b/tests/lexer.js new file mode 100644 index 0000000..1bc706c --- /dev/null +++ b/tests/lexer.js @@ -0,0 +1,20 @@ +import { createAst } from './../out/createAst.js'; +import { readFileSync } from 'fs'; +import { resolve, parse } from 'path'; +import { fileURLToPath } from 'node:url'; +import { expect } from 'chai'; + +describe('Lexer', () => { + it('parses namespaces without dots', () => { + const ast = createAst(resolve(parse(fileURLToPath(import.meta.url)).dir, 'modules', 'namespaceX.v')); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x'}]); + }); + it('parses namespaces with a single dot', () => { + const ast = createAst(resolve(parse(fileURLToPath(import.meta.url)).dir, 'modules', 'namespaceXY.v')); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y'}]); + }); + it('parses namespaces two dots', () => { + const ast = createAst(resolve(parse(fileURLToPath(import.meta.url)).dir, 'modules', 'namespaceXYZ.v')); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y.z'}]); + }); +}) \ No newline at end of file diff --git a/tests/modules/namespaceX.v b/tests/modules/namespaceX.v new file mode 100644 index 0000000..cf48ea6 --- /dev/null +++ b/tests/modules/namespaceX.v @@ -0,0 +1 @@ +namespace x; \ No newline at end of file diff --git a/tests/modules/namespaceXY.v b/tests/modules/namespaceXY.v new file mode 100644 index 0000000..ed48418 --- /dev/null +++ b/tests/modules/namespaceXY.v @@ -0,0 +1 @@ +namespace x.y; \ No newline at end of file diff --git a/tests/modules/namespaceXYZ.v b/tests/modules/namespaceXYZ.v new file mode 100644 index 0000000..c8624b5 --- /dev/null +++ b/tests/modules/namespaceXYZ.v @@ -0,0 +1 @@ +namespace x.y.z; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 4231fa1..8bec488 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,20 +41,166 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + async@0.2.10: version "0.2.10" resolved "https://registry.npmjs.org/async/-/async-0.2.10.tgz" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + binary-search-tree@0.2.5: version "0.2.5" resolved "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz" dependencies: underscore "~1.4.4" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +chai@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + commander@^2.19.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + cross-env@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" @@ -69,16 +215,68 @@ cross-spawn@^7.0.1: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.3.1: +debug@4.3.1, debug@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" dependencies: ms "2.1.2" +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz" +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + fs-extra@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" @@ -88,19 +286,132 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -122,10 +433,31 @@ localforage@^1.3.0: dependencies: lie "3.1.1" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" @@ -136,6 +468,37 @@ mkdirp@~0.5.1: dependencies: minimist "^1.2.5" +mocha@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + moo@^0.5.0, moo@^0.5.1: version "0.5.1" resolved "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz" @@ -144,6 +507,16 @@ ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + nearley@^2.20.1: version "2.20.1" resolved "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz" @@ -163,10 +536,56 @@ nedb@^1.8.0: mkdirp "~0.5.1" underscore "~1.4.4" +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + railroad-diagrams@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz" @@ -178,10 +597,41 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + ret@~0.1.10: version "0.1.15" resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -196,10 +646,72 @@ source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + supervisor@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/supervisor/-/supervisor-0.12.0.tgz" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + typescript@^4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz" @@ -222,12 +734,81 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -which@^2.0.1: +which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" dependencies: isexe "^2.0.0" +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yarn@^1.22.10: version "1.22.10" resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.10.tgz" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 95bafd405887e316bb375b81bb62c2129e2dc88f Mon Sep 17 00:00:00 2001 From: Bronwen Date: Sat, 22 May 2021 18:27:59 -0400 Subject: [PATCH 08/25] test watcher... test link parsing --- package.json | 1 + tests/lexer.js | 49 +++++++++++++++++++++---------- tests/lib/ModuleFiles.js | 16 ++++++++++ tests/modules/link.v | 1 + tests/modules/linkArray.v | 1 + tests/modules/requiredLink.v | 1 + tests/modules/requiredLinkArray.v | 1 + 7 files changed, 55 insertions(+), 15 deletions(-) create mode 100644 tests/lib/ModuleFiles.js create mode 100644 tests/modules/link.v create mode 100644 tests/modules/linkArray.v create mode 100644 tests/modules/requiredLink.v create mode 100644 tests/modules/requiredLinkArray.v diff --git a/package.json b/package.json index cd69462..bcbc433 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ }, "scripts": { "test": "mocha tests", + "test:watch": "supervisor -n exit -w out,tests --exec mocha -- tests", "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", "debug:watch": "cross-env DEBUG=vogue:* supervisor -w out,test/**/*.v,lib -n exit --exec yarn -- test", "postinstall": "yarn compile && cd test && yarn", diff --git a/tests/lexer.js b/tests/lexer.js index 1bc706c..9ec60c3 100644 --- a/tests/lexer.js +++ b/tests/lexer.js @@ -1,20 +1,39 @@ import { createAst } from './../out/createAst.js'; -import { readFileSync } from 'fs'; -import { resolve, parse } from 'path'; -import { fileURLToPath } from 'node:url'; import { expect } from 'chai'; +import * as ModuleFiles from './lib/ModuleFiles.js' describe('Lexer', () => { - it('parses namespaces without dots', () => { - const ast = createAst(resolve(parse(fileURLToPath(import.meta.url)).dir, 'modules', 'namespaceX.v')); - expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x'}]); - }); - it('parses namespaces with a single dot', () => { - const ast = createAst(resolve(parse(fileURLToPath(import.meta.url)).dir, 'modules', 'namespaceXY.v')); - expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y'}]); - }); - it('parses namespaces two dots', () => { - const ast = createAst(resolve(parse(fileURLToPath(import.meta.url)).dir, 'modules', 'namespaceXYZ.v')); - expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y.z'}]); - }); + describe('namespaces', () => { + it('parses namespaces without dots', () => { + const ast = createAst(ModuleFiles.namespaceX); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x'}]); + }); + it('parses namespaces with a single dot', () => { + const ast = createAst(ModuleFiles.namespaceXY); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y'}]); + }); + it('parses namespaces two dots', () => { + const ast = createAst(ModuleFiles.namespaceXYZ); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y.z'}]); + }); + }) + + describe('links', () => { + it('parses link', () => { + const ast = createAst(ModuleFiles.link); + expect(ast).to.deep.equal([{type: 'link', array: false, required: false, name: 'test'}]); + }); + it('parses required link', () => { + const ast = createAst(ModuleFiles.requiredLink); + expect(ast).to.deep.equal([{type: 'link', array: false, required: true, name: 'test'}]); + }); + it('parses link array', () => { + const ast = createAst(ModuleFiles.linkArray); + expect(ast).to.deep.equal([{type: 'link', array: true, required: false, name: 'test'}]); + }); + it('parses required link array', () => { + const ast = createAst(ModuleFiles.requiredLinkArray); + expect(ast).to.deep.equal([{type: 'link', array: true, required: true, name: 'test'}]); + }); + }) }) \ No newline at end of file diff --git a/tests/lib/ModuleFiles.js b/tests/lib/ModuleFiles.js new file mode 100644 index 0000000..1432925 --- /dev/null +++ b/tests/lib/ModuleFiles.js @@ -0,0 +1,16 @@ + +import { resolve, parse } from 'path'; +import { fileURLToPath } from 'node:url'; + +function file(str) { + return resolve(parse(fileURLToPath(import.meta.url)).dir, '..', 'modules', str + '.v') +} + +export const namespaceX = file('namespaceX'); +export const namespaceXY = file('namespaceXY'); +export const namespaceXYZ = file('namespaceXYZ'); + +export const link = file('link'); +export const linkArray = file('linkArray'); +export const requiredLink = file('requiredLink'); +export const requiredLinkArray = file('requiredLinkArray'); diff --git a/tests/modules/link.v b/tests/modules/link.v new file mode 100644 index 0000000..097a07e --- /dev/null +++ b/tests/modules/link.v @@ -0,0 +1 @@ +link test; \ No newline at end of file diff --git a/tests/modules/linkArray.v b/tests/modules/linkArray.v new file mode 100644 index 0000000..567628c --- /dev/null +++ b/tests/modules/linkArray.v @@ -0,0 +1 @@ +link[] test; \ No newline at end of file diff --git a/tests/modules/requiredLink.v b/tests/modules/requiredLink.v new file mode 100644 index 0000000..db246e1 --- /dev/null +++ b/tests/modules/requiredLink.v @@ -0,0 +1 @@ +required link test; \ No newline at end of file diff --git a/tests/modules/requiredLinkArray.v b/tests/modules/requiredLinkArray.v new file mode 100644 index 0000000..aa7d649 --- /dev/null +++ b/tests/modules/requiredLinkArray.v @@ -0,0 +1 @@ +required link[] test; \ No newline at end of file From ca7f49e938d8a853ceb002d55ded023277f0eada Mon Sep 17 00:00:00 2001 From: Bronwen Date: Sun, 23 May 2021 17:38:54 -0400 Subject: [PATCH 09/25] coverage, better scripts & dev env --- .gitignore | 4 +- .mocharc.json | 8 + .npmignore | 4 +- .nycrc.json | 9 + examples/test/main.v | 5 + examples/{valyria => test}/package.json | 0 examples/{valyria => test}/yarn.lock | 1 + examples/valyria/main.v | 6 - package.json | 22 +- src/createAst.ts | 1 - src/extensions.ts | 8 +- src/minify.ts | 28 +- test/extensions.test.ts | 11 + test/lexer.test.ts | 82 ++++ test/lib/ModuleFiles.ts | 27 ++ test/modules/AsyncFunctionOneParam.v | 3 + test/modules/asyncFunctionEmptyParams.v | 3 + test/modules/asyncFunctionNoParams.v | 3 + test/modules/asyncFunctionTwoParams.v | 3 + test/modules/blank.v | 0 test/modules/functionEmptyParams.v | 3 + test/modules/functionNoParams.v | 3 + test/modules/functionOneParam.v | 3 + test/modules/functionTwoParams.v | 3 + {tests => test}/modules/link.v | 0 {tests => test}/modules/linkArray.v | 0 {tests => test}/modules/namespaceX.v | 0 {tests => test}/modules/namespaceXY.v | 0 {tests => test}/modules/namespaceXYZ.v | 0 {tests => test}/modules/requiredLink.v | 0 {tests => test}/modules/requiredLinkArray.v | 0 test/pawn.v | 6 - test/{ => system}/counter.v | 0 test/{ => system}/main.v | 0 test/{ => system}/package.json | 5 +- test/system/yarn.lock | 176 ++++++++ test/trees.v | 11 - test/tsconfig.json | 14 + test/world.v | 16 - test/yarn.lock | 346 ---------------- tests/lexer.js | 39 -- tests/lib/ModuleFiles.js | 16 - yarn.lock | 423 +++++++++++++++++--- 43 files changed, 768 insertions(+), 524 deletions(-) create mode 100644 .mocharc.json create mode 100644 .nycrc.json create mode 100644 examples/test/main.v rename examples/{valyria => test}/package.json (100%) rename examples/{valyria => test}/yarn.lock (96%) delete mode 100644 examples/valyria/main.v create mode 100644 test/extensions.test.ts create mode 100644 test/lexer.test.ts create mode 100644 test/lib/ModuleFiles.ts create mode 100644 test/modules/AsyncFunctionOneParam.v create mode 100644 test/modules/asyncFunctionEmptyParams.v create mode 100644 test/modules/asyncFunctionNoParams.v create mode 100644 test/modules/asyncFunctionTwoParams.v create mode 100644 test/modules/blank.v create mode 100644 test/modules/functionEmptyParams.v create mode 100644 test/modules/functionNoParams.v create mode 100644 test/modules/functionOneParam.v create mode 100644 test/modules/functionTwoParams.v rename {tests => test}/modules/link.v (100%) rename {tests => test}/modules/linkArray.v (100%) rename {tests => test}/modules/namespaceX.v (100%) rename {tests => test}/modules/namespaceXY.v (100%) rename {tests => test}/modules/namespaceXYZ.v (100%) rename {tests => test}/modules/requiredLink.v (100%) rename {tests => test}/modules/requiredLinkArray.v (100%) delete mode 100644 test/pawn.v rename test/{ => system}/counter.v (100%) rename test/{ => system}/main.v (100%) rename test/{ => system}/package.json (60%) create mode 100644 test/system/yarn.lock delete mode 100644 test/trees.v create mode 100644 test/tsconfig.json delete mode 100644 test/world.v delete mode 100644 test/yarn.lock delete mode 100644 tests/lexer.js delete mode 100644 tests/lib/ModuleFiles.js diff --git a/.gitignore b/.gitignore index b017598..a4f0abd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ node_modules out .system -*.tgz \ No newline at end of file +*.tgz +.nyc_output +coverage \ No newline at end of file diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000..f2ab853 --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,8 @@ +{ + "spec": [ + "test/**/*.test.ts" + ], + "loader": [ + "ts-node/esm.mjs" + ] +} \ No newline at end of file diff --git a/.npmignore b/.npmignore index 76e8274..9475183 100644 --- a/.npmignore +++ b/.npmignore @@ -4,4 +4,6 @@ test .editorconfig tsconfig.json .system -*.tgz \ No newline at end of file +*.tgz +.nyc_output +coverage \ No newline at end of file diff --git a/.nycrc.json b/.nycrc.json new file mode 100644 index 0000000..c686840 --- /dev/null +++ b/.nycrc.json @@ -0,0 +1,9 @@ +{ + "extension": [ + ".ts" + ], + "require": [ + "ts-node/esm.mjs" + ], + "cache": false +} \ No newline at end of file diff --git a/examples/test/main.v b/examples/test/main.v new file mode 100644 index 0000000..745b90d --- /dev/null +++ b/examples/test/main.v @@ -0,0 +1,5 @@ +singleton; + +restore { + console.log('worked!\n'.repeat(10)); +} \ No newline at end of file diff --git a/examples/valyria/package.json b/examples/test/package.json similarity index 100% rename from examples/valyria/package.json rename to examples/test/package.json diff --git a/examples/valyria/yarn.lock b/examples/test/yarn.lock similarity index 96% rename from examples/valyria/yarn.lock rename to examples/test/yarn.lock index e5e646d..c5dc1d0 100644 --- a/examples/valyria/yarn.lock +++ b/examples/test/yarn.lock @@ -509,6 +509,7 @@ tar-stream@^2.1.4: terminal-kit@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/terminal-kit/-/terminal-kit-2.1.2.tgz#08689ff9f8efc6614d34d4cc7be916a91742b896" + integrity sha512-1eG7CrQfE1dd5ZHPG5WrTk/DTeskFPqSLEl+QYmvwvI41dRCN2j1qVyxA4FwE0/x24AbjhSA3FJSIgWqQD610Q== dependencies: "@cronvel/get-pixels" "^3.4.0" chroma-js "^2.1.1" diff --git a/examples/valyria/main.v b/examples/valyria/main.v deleted file mode 100644 index c2e4461..0000000 --- a/examples/valyria/main.v +++ /dev/null @@ -1,6 +0,0 @@ -singleton; -link window - -restore { - window ??= create('SDL.window'); -} \ No newline at end of file diff --git a/package.json b/package.json index bcbc433..fd1ada1 100644 --- a/package.json +++ b/package.json @@ -8,33 +8,39 @@ "vogue": "out/run.js" }, "scripts": { - "test": "mocha tests", - "test:watch": "supervisor -n exit -w out,tests --exec mocha -- tests", + "test": "c8 --all mocha", + "test:watch": "mocha", "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", - "debug:watch": "cross-env DEBUG=vogue:* supervisor -w out,test/**/*.v,lib -n exit --exec yarn -- test", - "postinstall": "yarn compile && cd test && yarn", - "postcompile:watch": "echo DONE", - "compile": "tsc", - "compile:watch": "tsc --watch" + "debug:watch": "supervisor -w out,test/system/**/*.v,lib -n exit --exec yarn -- clear_and yarn debug", + "compile": "tsc --listEmittedFiles", + "compile:watch": "yarn compile --watch --preserveWatchOutput", + "postinstall": "yarn compile" }, "dependencies": { + "@types/chai": "^4.2.18", "@types/debug": "^4.1.5", "@types/fs-extra": "^9.0.11", + "@types/jest": "^26.0.23", "@types/lodash": "^4.14.169", "@types/nearley": "^2.11.1", "@types/node": "^15.3.0", + "@types/sinon": "^10.0.0", "@types/uglify-js": "^3.13.0", "@types/uuid": "^8.3.0", + "c8": "^7.7.2", "chai": "^4.3.4", "cross-env": "^7.0.3", "debug": "^4.3.1", + "esm": "^3.2.25", "fs-extra": "^10.0.0", "lodash": "^4.17.21", "mocha": "^8.4.0", + "mocha-lcov-reporter": "^1.3.0", "moo": "^0.5.1", "nearley": "^2.20.1", - "nedb": "^1.8.0", + "sinon": "^10.0.0", "supervisor": "^0.12.0", + "ts-node": "^9.1.1", "typescript": "^4.2.4", "uglify-js": "^3.13.5", "uuid": "^8.3.2", diff --git a/src/createAst.ts b/src/createAst.ts index e527371..fa7f6b4 100644 --- a/src/createAst.ts +++ b/src/createAst.ts @@ -14,7 +14,6 @@ import { readFileSync } from 'fs'; import debug from 'debug'; import { resolve, dirname } from 'path'; import { fileURLToPath } from 'url'; -import minify from './minify.js'; const log = debug('vogue:ast'); const grammarFile = resolve(fileURLToPath(dirname(import.meta.url)), '..', 'lib', 'grammar.ne'); diff --git a/src/extensions.ts b/src/extensions.ts index 06b0441..c1422e4 100644 --- a/src/extensions.ts +++ b/src/extensions.ts @@ -5,7 +5,7 @@ Object.defineProperty(Array.prototype, 'empty', { } }); - -process.on('unhandledRejection', (reason: Error, p) => { - console.log(reason.stack ?? reason.name + '\n\nStack trace unavailable...'); -}); \ No newline at end of file +// in theory we dont need this anymore... with strict promise rejections... +// process.on('unhandledRejection', (reason: Error, p) => { +// console.log(reason.stack ?? reason.name + '\n\nStack trace unavailable...'); +// }); \ No newline at end of file diff --git a/src/minify.ts b/src/minify.ts index 20535d1..d64f379 100644 --- a/src/minify.ts +++ b/src/minify.ts @@ -1,16 +1,16 @@ -import uglify from 'uglify-js'; +// import uglify from 'uglify-js'; -export default (code: string): string => { - return uglify.minify(code, { - compress: { - dead_code: true, - global_defs: { - DEBUG: false - } - }, - sourceMap: { - content: 'inline' - } - }).code; -} \ No newline at end of file +// export default (code: string): string => { +// return uglify.minify(code, { +// compress: { +// dead_code: true, +// global_defs: { +// DEBUG: false +// } +// }, +// sourceMap: { +// content: 'inline' +// } +// }).code; +// } \ No newline at end of file diff --git a/test/extensions.test.ts b/test/extensions.test.ts new file mode 100644 index 0000000..d22e16e --- /dev/null +++ b/test/extensions.test.ts @@ -0,0 +1,11 @@ +import { expect } from 'chai'; +import '../src/extensions.ts'; +import sinon from 'sinon'; + +describe('extensions', () => { + it('creates empty array extensions', () => { + expect(([] as any).empty).to.be.true; + expect(([1] as any).empty).to.be.false; + expect(([1, 2, 3] as any).empty).to.be.false; + }); +}) \ No newline at end of file diff --git a/test/lexer.test.ts b/test/lexer.test.ts new file mode 100644 index 0000000..817b0ce --- /dev/null +++ b/test/lexer.test.ts @@ -0,0 +1,82 @@ +import { createAst } from '../out/createAst.js'; +import { expect } from 'chai'; +import * as ModuleFiles from './lib/ModuleFiles.js' + +describe('Lexer', () => { + + it('parses blank file', () => { + const ast = createAst(ModuleFiles.blank); + expect(ast).to.deep.equal([]); + }); + + describe('namespaces', () => { + it('parses namespaces without dots', () => { + const ast = createAst(ModuleFiles.namespaceX); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x'}]); + }); + it('parses namespaces with a single dot', () => { + const ast = createAst(ModuleFiles.namespaceXY); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y'}]); + }); + it('parses namespaces two dots', () => { + const ast = createAst(ModuleFiles.namespaceXYZ); + expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y.z'}]); + }); + }); + + describe('links', () => { + it('parses link', () => { + const ast = createAst(ModuleFiles.link); + expect(ast).to.deep.equal([{type: 'link', array: false, required: false, name: 'test'}]); + }); + it('parses required link', () => { + const ast = createAst(ModuleFiles.requiredLink); + expect(ast).to.deep.equal([{type: 'link', array: false, required: true, name: 'test'}]); + }); + it('parses link array', () => { + const ast = createAst(ModuleFiles.linkArray); + expect(ast).to.deep.equal([{type: 'link', array: true, required: false, name: 'test'}]); + }); + it('parses required link array', () => { + const ast = createAst(ModuleFiles.requiredLinkArray); + expect(ast).to.deep.equal([{type: 'link', array: true, required: true, name: 'test'}]); + }); + }); + + describe('functions', () => { + it('function with parameters omitted', () => { + const ast = createAst(ModuleFiles.functionNoParams); + expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: [], async: false}]); + }); + it('function with empty parameters', () => { + const ast = createAst(ModuleFiles.functionEmptyParams); + expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: [], async: false}]); + }); + it('function with one parameter', () => { + const ast = createAst(ModuleFiles.functionOneParam); + expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: ["a"], async: false}]); + }); + it('function with two parameters', () => { + const ast = createAst(ModuleFiles.functionTwoParams); + expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: ["a", "b"], async: false}]); + }); + + it('async function with parameters omitted', () => { + const ast = createAst(ModuleFiles.asyncFunctionNoParams); + expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: [], async: true}]); + }); + it('async function with empty parameters', () => { + const ast = createAst(ModuleFiles.asyncFunctionEmptyParams); + expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: [], async: true}]); + }); + it('async function with one parameter', () => { + const ast = createAst(ModuleFiles.asyncFunctionOneParam); + expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: ["a"], async: true}]); + }); + it('async function with two parameters', () => { + const ast = createAst(ModuleFiles.asyncFunctionTwoParams); + expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: ["a", "b"], async: true}]); + }); + }); + +}); \ No newline at end of file diff --git a/test/lib/ModuleFiles.ts b/test/lib/ModuleFiles.ts new file mode 100644 index 0000000..e25cb18 --- /dev/null +++ b/test/lib/ModuleFiles.ts @@ -0,0 +1,27 @@ + +import { resolve, parse } from 'path'; +import { fileURLToPath } from 'url'; + +function file(str: string) { + return resolve(parse(fileURLToPath(import.meta.url)).dir, '..', 'modules', str + '.v') +} + +export const blank = file('blank'); + +export const namespaceX = file('namespaceX'); +export const namespaceXY = file('namespaceXY'); +export const namespaceXYZ = file('namespaceXYZ'); + +export const link = file('link'); +export const linkArray = file('linkArray'); +export const requiredLink = file('requiredLink'); +export const requiredLinkArray = file('requiredLinkArray'); + +export const functionNoParams = file('functionNoParams'); +export const functionEmptyParams = file('functionEmptyParams'); +export const functionOneParam = file('functionOneParam'); +export const functionTwoParams = file('functionTwoParams'); +export const asyncFunctionNoParams = file('asyncFunctionNoParams'); +export const asyncFunctionEmptyParams = file('asyncFunctionEmptyParams'); +export const asyncFunctionOneParam = file('asyncFunctionOneParam'); +export const asyncFunctionTwoParams = file('asyncFunctionTwoParams'); diff --git a/test/modules/AsyncFunctionOneParam.v b/test/modules/AsyncFunctionOneParam.v new file mode 100644 index 0000000..82c38fb --- /dev/null +++ b/test/modules/AsyncFunctionOneParam.v @@ -0,0 +1,3 @@ +async test(a) { + +} \ No newline at end of file diff --git a/test/modules/asyncFunctionEmptyParams.v b/test/modules/asyncFunctionEmptyParams.v new file mode 100644 index 0000000..3f5cd15 --- /dev/null +++ b/test/modules/asyncFunctionEmptyParams.v @@ -0,0 +1,3 @@ +async test() { + +} \ No newline at end of file diff --git a/test/modules/asyncFunctionNoParams.v b/test/modules/asyncFunctionNoParams.v new file mode 100644 index 0000000..bbe429f --- /dev/null +++ b/test/modules/asyncFunctionNoParams.v @@ -0,0 +1,3 @@ +async test { + +} \ No newline at end of file diff --git a/test/modules/asyncFunctionTwoParams.v b/test/modules/asyncFunctionTwoParams.v new file mode 100644 index 0000000..8e5d3f0 --- /dev/null +++ b/test/modules/asyncFunctionTwoParams.v @@ -0,0 +1,3 @@ +async test(a, b) { + +} \ No newline at end of file diff --git a/test/modules/blank.v b/test/modules/blank.v new file mode 100644 index 0000000..e69de29 diff --git a/test/modules/functionEmptyParams.v b/test/modules/functionEmptyParams.v new file mode 100644 index 0000000..25be7c8 --- /dev/null +++ b/test/modules/functionEmptyParams.v @@ -0,0 +1,3 @@ +test() { + +} \ No newline at end of file diff --git a/test/modules/functionNoParams.v b/test/modules/functionNoParams.v new file mode 100644 index 0000000..a8c71a8 --- /dev/null +++ b/test/modules/functionNoParams.v @@ -0,0 +1,3 @@ +test { + +} \ No newline at end of file diff --git a/test/modules/functionOneParam.v b/test/modules/functionOneParam.v new file mode 100644 index 0000000..c9ca1d5 --- /dev/null +++ b/test/modules/functionOneParam.v @@ -0,0 +1,3 @@ +test(a) { + +} \ No newline at end of file diff --git a/test/modules/functionTwoParams.v b/test/modules/functionTwoParams.v new file mode 100644 index 0000000..76398e2 --- /dev/null +++ b/test/modules/functionTwoParams.v @@ -0,0 +1,3 @@ +test(a, b) { + +} \ No newline at end of file diff --git a/tests/modules/link.v b/test/modules/link.v similarity index 100% rename from tests/modules/link.v rename to test/modules/link.v diff --git a/tests/modules/linkArray.v b/test/modules/linkArray.v similarity index 100% rename from tests/modules/linkArray.v rename to test/modules/linkArray.v diff --git a/tests/modules/namespaceX.v b/test/modules/namespaceX.v similarity index 100% rename from tests/modules/namespaceX.v rename to test/modules/namespaceX.v diff --git a/tests/modules/namespaceXY.v b/test/modules/namespaceXY.v similarity index 100% rename from tests/modules/namespaceXY.v rename to test/modules/namespaceXY.v diff --git a/tests/modules/namespaceXYZ.v b/test/modules/namespaceXYZ.v similarity index 100% rename from tests/modules/namespaceXYZ.v rename to test/modules/namespaceXYZ.v diff --git a/tests/modules/requiredLink.v b/test/modules/requiredLink.v similarity index 100% rename from tests/modules/requiredLink.v rename to test/modules/requiredLink.v diff --git a/tests/modules/requiredLinkArray.v b/test/modules/requiredLinkArray.v similarity index 100% rename from tests/modules/requiredLinkArray.v rename to test/modules/requiredLinkArray.v diff --git a/test/pawn.v b/test/pawn.v deleted file mode 100644 index 72a7433..0000000 --- a/test/pawn.v +++ /dev/null @@ -1,6 +0,0 @@ - - - -restore { - -} \ No newline at end of file diff --git a/test/counter.v b/test/system/counter.v similarity index 100% rename from test/counter.v rename to test/system/counter.v diff --git a/test/main.v b/test/system/main.v similarity index 100% rename from test/main.v rename to test/system/main.v diff --git a/test/package.json b/test/system/package.json similarity index 60% rename from test/package.json rename to test/system/package.json index be685c5..eed6f0b 100644 --- a/test/package.json +++ b/test/system/package.json @@ -1,12 +1,9 @@ { - "name": "test", + "name": "system", "version": "1.0.0", "main": "index.js", "license": "MIT", "dependencies": { - "chalk": "^4.1.1", - "random-world": "^1.2.1", - "signale": "^1.4.0", "sisteransi": "^1.0.5", "terminal-kit": "^2.1.2" } diff --git a/test/system/yarn.lock b/test/system/yarn.lock new file mode 100644 index 0000000..fcf7cdd --- /dev/null +++ b/test/system/yarn.lock @@ -0,0 +1,176 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cronvel/get-pixels@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@cronvel/get-pixels/-/get-pixels-3.4.0.tgz#697cd691c16bbb8b29ed596da73fd6a7e9a2f34d" + integrity sha512-do5jDoX9oCR/dGHE4POVQ3PYDCmQ2Fow4CA72UL4WoE8zUImA/0lChczjfl+ucNjE4sXFWUnzoO6j4WzrUvLnw== + dependencies: + jpeg-js "^0.4.1" + ndarray "^1.0.19" + ndarray-pack "^1.1.1" + node-bitmap "0.0.1" + omggif "^1.0.10" + pngjs "^5.0.0" + +chroma-js@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.1.2.tgz#1075cb9ae25bcb2017c109394168b5cf3aa500ec" + integrity sha512-ri/ouYDWuxfus3UcaMxC1Tfp3IE9K5iQzxc2hSxbBRVNQFut1UuGAsZmiAf2mOUubzGJwgMSv9lHg+XqLaz1QQ== + dependencies: + cross-env "^6.0.3" + +cross-env@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" + integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== + dependencies: + cross-spawn "^7.0.0" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cwise-compiler@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" + integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= + dependencies: + uniq "^1.0.0" + +iota-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" + integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= + +is-buffer@^1.0.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +jpeg-js@^0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" + integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== + +lazyness@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/lazyness/-/lazyness-1.2.0.tgz#5dc0f02c37280436b21f0e4918ce6e72a109c657" + integrity sha512-KenL6EFbwxBwRxG93t0gcUyi0Nw0Ub31FJKN1laA4UscdkL1K1AxUd0gYZdcLU3v+x+wcFi4uQKS5hL+fk500g== + +ndarray-pack@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" + integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= + dependencies: + cwise-compiler "^1.1.2" + ndarray "^1.0.13" + +ndarray@^1.0.13, ndarray@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" + integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== + dependencies: + iota-array "^1.0.0" + is-buffer "^1.0.2" + +nextgen-events@^1.3.4: + version "1.4.0" + resolved "https://registry.yarnpkg.com/nextgen-events/-/nextgen-events-1.4.0.tgz#82e7201e4d8421f1cb4dcfce973c10b455fdc2be" + integrity sha512-bwSpShfuLg/lcRFokZvtUcrn5kumy6uRI6Jc+QWzH+bW6ZRdog7LfwAwhqeTzVfsprZgDGrctr6rO5aJhcdAfg== + +node-bitmap@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/node-bitmap/-/node-bitmap-0.0.1.tgz#180eac7003e0c707618ef31368f62f84b2a69091" + integrity sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE= + +omggif@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" + integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +seventh@^0.7.40: + version "0.7.40" + resolved "https://registry.yarnpkg.com/seventh/-/seventh-0.7.40.tgz#a5a010496cb84421bb81f524840484a5aa473be9" + integrity sha512-7sxUydQx4iEh17uJUFjZDAwbffJirldZaNIJvVB/hk9mPEL3J4GpLGSL+mHFH2ydkye46DAsLGqzFJ+/Qj5foQ== + dependencies: + setimmediate "^1.0.5" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +string-kit@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/string-kit/-/string-kit-0.12.5.tgz#e7f646e7740e54b7ecae6cf67b73bb616aa16652" + integrity sha512-aB7yK0RgOx3SElEfQ6lZu2xS5hWr4ToJispiy+djJ4yh3f2zaTMCm44ZrHZnN1RiQQCLfpa5Btz2bishyBm8IQ== + +terminal-kit@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/terminal-kit/-/terminal-kit-2.1.2.tgz#08689ff9f8efc6614d34d4cc7be916a91742b896" + integrity sha512-1eG7CrQfE1dd5ZHPG5WrTk/DTeskFPqSLEl+QYmvwvI41dRCN2j1qVyxA4FwE0/x24AbjhSA3FJSIgWqQD610Q== + dependencies: + "@cronvel/get-pixels" "^3.4.0" + chroma-js "^2.1.1" + lazyness "^1.2.0" + ndarray "^1.0.19" + nextgen-events "^1.3.4" + seventh "^0.7.40" + string-kit "^0.12.5" + tree-kit "^0.7.0" + +tree-kit@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/tree-kit/-/tree-kit-0.7.0.tgz#f677b10f79d9b4442ba20e0d87c8a12ecabe5fbb" + integrity sha512-MAqFo2oJJ39zmxq3xETx0nMAgZw2z6pnJPjIAehEcrDaeePDhBBTshAlyhCDtezMDTIu1Av+vGE501xN3Sh8VA== + +uniq@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" diff --git a/test/trees.v b/test/trees.v deleted file mode 100644 index 7c5f230..0000000 --- a/test/trees.v +++ /dev/null @@ -1,11 +0,0 @@ -namespace structures; - -member alive; -member age; - -required link land; - -restore { - alive ??= true; - age ??= 0; -} \ No newline at end of file diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 0000000..0472462 --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "allowSyntheticDefaultImports": true, + "target": "esnext", + "sourceMap": true, + "declaration": true + }, + "include": [ + "**/*.ts" + ] +} \ No newline at end of file diff --git a/test/world.v b/test/world.v deleted file mode 100644 index 2625b35..0000000 --- a/test/world.v +++ /dev/null @@ -1,16 +0,0 @@ -link[] pawns; - -member map; -member size; - -restore { - for(let i = 0; i < 3; i ++) { - - } - - this.size ??= 64; -} - -async render() { - -} \ No newline at end of file diff --git a/test/yarn.lock b/test/yarn.lock deleted file mode 100644 index d7295b4..0000000 --- a/test/yarn.lock +++ /dev/null @@ -1,346 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cronvel/get-pixels@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@cronvel/get-pixels/-/get-pixels-3.4.0.tgz" - dependencies: - jpeg-js "^0.4.1" - ndarray "^1.0.19" - ndarray-pack "^1.1.1" - node-bitmap "0.0.1" - omggif "^1.0.10" - pngjs "^5.0.0" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - dependencies: - color-convert "^2.0.1" - -chalk@^2.3.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chroma-js@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/chroma-js/-/chroma-js-2.1.1.tgz" - dependencies: - cross-env "^6.0.3" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - -cross-env@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz" - dependencies: - cross-spawn "^7.0.0" - -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cwise-compiler@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz" - dependencies: - uniq "^1.0.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -graceful-fs@^4.1.2: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - -iota-array@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-buffer@^1.0.2: - version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - -jpeg-js@^0.4.1: - version "0.4.3" - resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz" - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - -lazyness@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/lazyness/-/lazyness-1.2.0.tgz" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -moment@^2.11.2: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -ndarray-pack@^1.1.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz" - dependencies: - cwise-compiler "^1.1.2" - ndarray "^1.0.13" - -ndarray@^1.0.13, ndarray@^1.0.19: - version "1.0.19" - resolved "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz" - dependencies: - iota-array "^1.0.0" - is-buffer "^1.0.2" - -nextgen-events@^1.3.4: - version "1.3.4" - resolved "https://registry.npmjs.org/nextgen-events/-/nextgen-events-1.3.4.tgz" - -node-bitmap@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz" - -omggif@^1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz" - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -pkg-conf@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - dependencies: - find-up "^2.0.0" - load-json-file "^4.0.0" - -pngjs@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz" - -random-world@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/random-world/-/random-world-1.2.1.tgz#aca953a169dc5ffa455a2bc39d7ee81da6f12480" - integrity sha1-rKlToWncX/pFWivDnX7oHabxJIA= - dependencies: - moment "^2.11.2" - seedrandom "^2.4.2" - underscore "^1.8.3" - uuid "^3.0.1" - -seedrandom@^2.4.2: - version "2.4.4" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba" - integrity sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA== - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - -seventh@^0.7.40: - version "0.7.40" - resolved "https://registry.npmjs.org/seventh/-/seventh-0.7.40.tgz" - dependencies: - setimmediate "^1.0.5" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - -signale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" - dependencies: - chalk "^2.3.2" - figures "^2.0.0" - pkg-conf "^2.1.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - -string-kit@^0.12.5: - version "0.12.5" - resolved "https://registry.npmjs.org/string-kit/-/string-kit-0.12.5.tgz" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - dependencies: - has-flag "^4.0.0" - -terminal-kit@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/terminal-kit/-/terminal-kit-2.1.2.tgz" - dependencies: - "@cronvel/get-pixels" "^3.4.0" - chroma-js "^2.1.1" - lazyness "^1.2.0" - ndarray "^1.0.19" - nextgen-events "^1.3.4" - seventh "^0.7.40" - string-kit "^0.12.5" - tree-kit "^0.7.0" - -tree-kit@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/tree-kit/-/tree-kit-0.7.0.tgz" - -underscore@^1.8.3: - version "1.13.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" - integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== - -uniq@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" - -uuid@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - dependencies: - isexe "^2.0.0" diff --git a/tests/lexer.js b/tests/lexer.js deleted file mode 100644 index 9ec60c3..0000000 --- a/tests/lexer.js +++ /dev/null @@ -1,39 +0,0 @@ -import { createAst } from './../out/createAst.js'; -import { expect } from 'chai'; -import * as ModuleFiles from './lib/ModuleFiles.js' - -describe('Lexer', () => { - describe('namespaces', () => { - it('parses namespaces without dots', () => { - const ast = createAst(ModuleFiles.namespaceX); - expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x'}]); - }); - it('parses namespaces with a single dot', () => { - const ast = createAst(ModuleFiles.namespaceXY); - expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y'}]); - }); - it('parses namespaces two dots', () => { - const ast = createAst(ModuleFiles.namespaceXYZ); - expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y.z'}]); - }); - }) - - describe('links', () => { - it('parses link', () => { - const ast = createAst(ModuleFiles.link); - expect(ast).to.deep.equal([{type: 'link', array: false, required: false, name: 'test'}]); - }); - it('parses required link', () => { - const ast = createAst(ModuleFiles.requiredLink); - expect(ast).to.deep.equal([{type: 'link', array: false, required: true, name: 'test'}]); - }); - it('parses link array', () => { - const ast = createAst(ModuleFiles.linkArray); - expect(ast).to.deep.equal([{type: 'link', array: true, required: false, name: 'test'}]); - }); - it('parses required link array', () => { - const ast = createAst(ModuleFiles.requiredLinkArray); - expect(ast).to.deep.equal([{type: 'link', array: true, required: true, name: 'test'}]); - }); - }) -}) \ No newline at end of file diff --git a/tests/lib/ModuleFiles.js b/tests/lib/ModuleFiles.js deleted file mode 100644 index 1432925..0000000 --- a/tests/lib/ModuleFiles.js +++ /dev/null @@ -1,16 +0,0 @@ - -import { resolve, parse } from 'path'; -import { fileURLToPath } from 'node:url'; - -function file(str) { - return resolve(parse(fileURLToPath(import.meta.url)).dir, '..', 'modules', str + '.v') -} - -export const namespaceX = file('namespaceX'); -export const namespaceXY = file('namespaceXY'); -export const namespaceXYZ = file('namespaceXYZ'); - -export const link = file('link'); -export const linkArray = file('linkArray'); -export const requiredLink = file('requiredLink'); -export const requiredLinkArray = file('requiredLinkArray'); diff --git a/yarn.lock b/yarn.lock index 8bec488..78466cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,67 @@ # yarn lockfile v1 +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/fake-timers@^7.0.4": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.0.tgz#8f13af27d842cbf51ad4502e05562fe9391d084e" + integrity sha512-hAEzXi6Wbvlb67NnGMGSNOeAflLVnMa4yliPU/ty1qjgW/vAletH15/v/esJwASSIA0YlIyjnloenFbEZc9q9A== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" + integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@types/chai@^4.2.18": + version "4.2.18" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" + integrity sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ== + "@types/debug@^4.1.5": version "4.1.5" resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz" @@ -13,6 +74,33 @@ dependencies: "@types/node" "*" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^26.0.23": + version "26.0.23" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" + integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + "@types/lodash@^4.14.169": version "4.14.169" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.169.tgz" @@ -30,6 +118,13 @@ version "15.3.0" resolved "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz" +"@types/sinon@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.0.tgz#eecc3847af03d45ffe53d55aaaaf6ecb28b5e584" + integrity sha512-jDZ55oCKxqlDmoTBBbBBEx+N8ZraUVhggMZ9T5t+6/Dh8/4NiOjSUfpLrPiEwxQDlAe3wpAkoXhWvE6LibtsMQ== + dependencies: + "@sinonjs/fake-timers" "^7.0.4" + "@types/uglify-js@^3.13.0": version "3.13.0" resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz" @@ -41,6 +136,18 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== +"@types/yargs-parser@*": + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + +"@types/yargs@^15.0.0": + version "15.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" + integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + dependencies: + "@types/yargs-parser" "*" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" @@ -76,6 +183,11 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -86,10 +198,6 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -async@0.2.10: - version "0.2.10" - resolved "https://registry.npmjs.org/async/-/async-0.2.10.tgz" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -100,12 +208,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -binary-search-tree@0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz" - dependencies: - underscore "~1.4.4" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -126,6 +228,29 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +c8@^7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/c8/-/c8-7.7.2.tgz#30ff37b8125d96cab3eb065895a0b68dbc495a0f" + integrity sha512-8AqNnUMxB3hsgYCYso2GJjlwnaNPlrEEbYbCQb7N76V1nrOgCKXiTcE3gXU18rIj0FeduPywROrIBMC7XAKApg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@istanbuljs/schema" "^0.1.2" + find-up "^5.0.0" + foreground-child "^2.0.0" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-reports "^3.0.2" + rimraf "^3.0.0" + test-exclude "^6.0.0" + v8-to-istanbul "^7.1.0" + yargs "^16.2.0" + yargs-parser "^20.2.7" + camelcase@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" @@ -201,13 +326,25 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +convert-source-map@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-env@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" dependencies: cross-spawn "^7.0.1" -cross-spawn@^7.0.1: +cross-spawn@^7.0.0, cross-spawn@^7.0.1: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" dependencies: @@ -233,11 +370,21 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^4.0.1, diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz" @@ -257,6 +404,11 @@ escape-string-regexp@4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -264,7 +416,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-up@5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -277,6 +429,14 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + fs-extra@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" @@ -325,6 +485,18 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3, glob@^7.1.4: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -345,9 +517,10 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== inflight@^1.0.4: version "1.0.6" @@ -401,10 +574,52 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-diff@^26.0.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + js-yaml@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" @@ -421,17 +636,10 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -lie@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz" - dependencies: - immediate "~3.0.5" - -localforage@^1.3.0: - version "1.9.0" - resolved "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz" - dependencies: - lie "3.1.1" +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== locate-path@^6.0.0: version "6.0.0" @@ -440,6 +648,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" @@ -451,6 +664,18 @@ log-symbols@4.0.0: dependencies: chalk "^4.0.0" +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -458,15 +683,10 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" - -mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - dependencies: - minimist "^1.2.5" +mocha-lcov-reporter@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz#469bdef4f8afc9a116056f079df6182d0afb0384" + integrity sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q= mocha@^8.4.0: version "8.4.0" @@ -526,15 +746,16 @@ nearley@^2.20.1: railroad-diagrams "^1.0.0" randexp "0.4.6" -nedb@^1.8.0: - version "1.8.0" - resolved "https://registry.npmjs.org/nedb/-/nedb-1.8.0.tgz" +nise@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" + integrity sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA== dependencies: - async "0.2.10" - binary-search-tree "0.2.5" - localforage "^1.3.0" - mkdirp "~0.5.1" - underscore "~1.4.4" + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -576,6 +797,13 @@ path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + pathval@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" @@ -586,6 +814,16 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + railroad-diagrams@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz" @@ -604,6 +842,11 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -620,11 +863,28 @@ ret@~0.1.10: version "0.1.15" resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + serialize-javascript@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" @@ -642,10 +902,40 @@ shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" -source-map@^0.6.1: +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +sinon@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-10.0.0.tgz#52279f97e35646ff73d23207d0307977c9b81430" + integrity sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw== + dependencies: + "@sinonjs/commons" "^1.8.1" + "@sinonjs/fake-timers" "^6.0.1" + "@sinonjs/samsam" "^5.3.1" + diff "^4.0.2" + nise "^4.1.0" + supports-color "^7.1.0" + +source-map-support@^0.5.17: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + "string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -700,6 +990,15 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -707,7 +1006,19 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -type-detect@^4.0.0, type-detect@^4.0.5: +ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -720,10 +1031,6 @@ uglify-js@^3.13.5: version "3.13.5" resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz" -underscore@~1.4.4: - version "1.4.4" - resolved "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -734,6 +1041,15 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-to-istanbul@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -776,7 +1092,7 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.7: version "20.2.7" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== @@ -791,7 +1107,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: +yargs@16.2.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -808,6 +1124,11 @@ yarn@^1.22.10: version "1.22.10" resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.10.tgz" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From c444db74e25bc2782e23778c566e5c34c7598427 Mon Sep 17 00:00:00 2001 From: Bronwen Date: Sun, 23 May 2021 17:39:02 -0400 Subject: [PATCH 10/25] more dev stuff --- package.json | 9 +- tsconfig.json | 3 +- yarn.lock | 465 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 470 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index fd1ada1..acdc0ae 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,13 @@ "vogue": "out/run.js" }, "scripts": { + "dev": "cross-env FORCE_COLOR=true multiview [ yarn test:watch ] [ yarn compile:watch ]", "test": "c8 --all mocha", - "test:watch": "mocha", + "test:watch": "supervisor -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec yarn -- test", "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", "debug:watch": "supervisor -w out,test/system/**/*.v,lib -n exit --exec yarn -- clear_and yarn debug", - "compile": "tsc --listEmittedFiles", - "compile:watch": "yarn compile --watch --preserveWatchOutput", + "compile": "tsc", + "compile:watch": "yarn compile --watch", "postinstall": "yarn compile" }, "dependencies": { @@ -29,6 +30,7 @@ "@types/uuid": "^8.3.0", "c8": "^7.7.2", "chai": "^4.3.4", + "concurrently": "^6.1.0", "cross-env": "^7.0.3", "debug": "^4.3.1", "esm": "^3.2.25", @@ -37,6 +39,7 @@ "mocha": "^8.4.0", "mocha-lcov-reporter": "^1.3.0", "moo": "^0.5.1", + "multiview": "^3.0.1", "nearley": "^2.20.1", "sinon": "^10.0.0", "supervisor": "^0.12.0", diff --git a/tsconfig.json b/tsconfig.json index 8dd7b2a..e7afa9d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,8 @@ "target": "esnext", "outDir": "out", "sourceMap": true, - "declaration": true + "declaration": true, + "pretty": true }, "include": [ "src/**/*.ts" diff --git a/yarn.lock b/yarn.lock index 78466cd..c9c5c6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,27 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/highlight@^7.12.13": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -118,6 +139,11 @@ version "15.3.0" resolved "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz" +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/sinon@^10.0.0": version "10.0.0" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.0.tgz#eecc3847af03d45ffe53d55aaaaf6ecb28b5e584" @@ -158,6 +184,11 @@ ansi-colors@4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-regex@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" + integrity sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0= + ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -168,6 +199,18 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-state@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ansi-state/-/ansi-state-1.0.5.tgz#0aeda248409664ac16b589121ac831cd6f721aa7" + integrity sha1-Cu2iSECWZKwWtYkSGsgxzW9yGqc= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -233,6 +276,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= + c8@^7.7.2: version "7.7.2" resolved "https://registry.yarnpkg.com/c8/-/c8-7.7.2.tgz#30ff37b8125d96cab3eb065895a0b68dbc495a0f" @@ -268,7 +316,16 @@ chai@^4.3.4: pathval "^1.1.1" type-detect "^4.0.5" -chalk@^4.0.0: +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -305,6 +362,18 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -312,11 +381,35 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +columnify@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.3.2.tgz#61bd578a9269ae6fd949ce36fff589f3702c7867" + integrity sha1-Yb1XipJprm/ZSc42//WJ83AseGc= + dependencies: + strip-ansi "^2.0.0" + wcwidth "^1.0.0" + +columns@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/columns/-/columns-0.8.0.tgz#c272fd81a18704423b2a3842e99d1920a577edd9" + integrity sha1-wnL9gaGHBEI7KjhC6Z0ZIKV37dk= + dependencies: + ansi-state "~1.0.5" + heartbeats "~3.1.0" + split "~0.3.2" + strip-bom "~1.0.0" + wcwidth.js "~1.0.0" + commander@^2.19.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" @@ -326,6 +419,21 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +concurrently@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.1.0.tgz#00d22525d3fcdce7f34cc7f3c9753f90a57d6208" + integrity sha512-jy+xj49pvqeKjc2TAVXRIhrgPG51eBKDZti0kZ41kaWk9iLbyWBjH6KMFpW7peOLkEymD+ZM83Lx6UEy3N/M9g== + dependencies: + chalk "^4.1.0" + date-fns "^2.16.1" + lodash "^4.17.21" + read-pkg "^5.2.0" + rxjs "^6.6.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^16.2.0" + convert-source-map@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" @@ -333,6 +441,11 @@ convert-source-map@^1.6.0: dependencies: safe-buffer "~5.1.1" +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -352,6 +465,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1: shebang-command "^2.0.0" which "^2.0.1" +date-fns@^2.16.1: + version "2.21.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.3.tgz#8f5f6889d7a96bbcc1f0ea50239b397a83357f9b" + integrity sha512-HeYdzCaFflc1i4tGbj7JKMjM4cKGYoyxwcIIkHzNgCkX8xXDNJDZXgDDVchIWpN4eQc3lH37WarduXFZJOtxfw== + debug@4.3.1, debug@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" @@ -370,6 +488,13 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" @@ -394,6 +519,13 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -404,11 +536,23 @@ escape-string-regexp@4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== +event-transmitter@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/event-transmitter/-/event-transmitter-2.0.0.tgz#7d58aeb72abb47c1e7eab0d7bf78033c0de33493" + integrity sha1-fViutyq7R8Hn6rDXv3gDPA3jNJM= + dependencies: + readable-stream "2.2.3" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -424,6 +568,11 @@ find-up@5.0.0, find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -456,6 +605,11 @@ fsevents@~2.3.1: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -507,16 +661,38 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +heartbeats@~3.1.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/heartbeats/-/heartbeats-3.1.5.tgz#99be8b2392b9075cc9aebebb5831616bceac160e" + integrity sha1-mb6LI5K5B1zJrr67WDFha86sFg4= + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -530,11 +706,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@~2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -542,6 +723,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-core-module@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + dependencies: + has "^1.0.3" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -574,11 +762,21 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -620,6 +818,11 @@ jest-get-type@^26.3.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" @@ -627,6 +830,11 @@ js-yaml@4.0.0: dependencies: argparse "^2.0.1" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -641,6 +849,16 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== +keypress@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.2.1.tgz#1e80454250018dbad4c3fe94497d6e67b6269c77" + integrity sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc= + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -683,6 +901,11 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist@^1.1.0: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + mocha-lcov-reporter@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz#469bdef4f8afc9a116056f079df6182d0afb0384" @@ -732,6 +955,19 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multiview@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/multiview/-/multiview-3.0.1.tgz#ecd7cc36b55a3a782a9615fc06b1ef74392cca1b" + integrity sha512-SQhM9HwOw3MUyeR1g0javHbdlQNL7NcMR5Q1aahMMGdOLe80hFid9la3n0B8fgl329Iy+0vvIpIBWu5LAigTqQ== + dependencies: + columns "0.8.0" + event-transmitter "2.0.0" + keypress "0.2.1" + protogram "1.1.3" + protogram-help "1.0.2" + tree-kill "^1.2.2" + unparse-args "1.0.1" + nanoid@3.1.20: version "3.1.20" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" @@ -757,6 +993,16 @@ nise@^4.1.0: just-extend "^4.0.2" path-to-regexp "^1.7.0" +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -783,6 +1029,16 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -797,6 +1053,11 @@ path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -814,6 +1075,11 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +pkginfo@~0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE= + pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" @@ -824,6 +1090,27 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +protogram-help@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/protogram-help/-/protogram-help-1.0.2.tgz#fb49cacff85fe80edb3568ac6eac78af0b032a19" + integrity sha1-+0nKz/hf6A7bNWisbqx4rwsDKhk= + dependencies: + columnify "~1.3.2" + pkginfo "~0.3.0" + +protogram@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/protogram/-/protogram-1.1.3.tgz#95f1df709c43310d62c13942baa09b753a688cf1" + integrity sha1-lfHfcJxDMQ1iwTlCuqCbdTpojPE= + dependencies: + subarg "~1.0.0" + unparse-args "~1.0.1" + railroad-diagrams@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz" @@ -847,6 +1134,29 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729" + integrity sha1-nPSUY5hd8BbIrogTCXqSk6mzNyk= + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -859,6 +1169,14 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +resolve@^1.10.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + ret@~0.1.10: version "0.1.15" resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" @@ -870,6 +1188,13 @@ rimraf@^3.0.0: dependencies: glob "^7.1.3" +rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -880,6 +1205,11 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -902,6 +1232,11 @@ shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" +shell-escape@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shell-escape/-/shell-escape-0.1.0.tgz#20e996fdd5f0c51be3f3c550119b77723d98e335" + integrity sha1-IOmW/dXwxRvj88VQEZt3cj2Y4zU= + signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -936,6 +1271,44 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" + integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== + +split@~0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= + dependencies: + through "2" + "string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -953,6 +1326,18 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +strip-ansi@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz#df62c1aa94ed2f114e1d0f21fd1d50482b79a60e" + integrity sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4= + dependencies: + ansi-regex "^1.0.0" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -967,22 +1352,44 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-bom@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +subarg@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= + dependencies: + minimist "^1.1.0" + supervisor@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/supervisor/-/supervisor-0.12.0.tgz" -supports-color@8.1.1: +supports-color@8.1.1, supports-color@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -999,6 +1406,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +through@2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1006,6 +1418,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + ts-node@^9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" @@ -1018,11 +1435,21 @@ ts-node@^9.1.1: source-map-support "^0.5.17" yn "3.1.1" +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + typescript@^4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz" @@ -1036,6 +1463,18 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unparse-args@1.0.1, unparse-args@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unparse-args/-/unparse-args-1.0.1.tgz#85906d556861045806f97533cd325ad100677078" + integrity sha1-hZBtVWhhBFgG+XUzzTJa0QBncHg= + dependencies: + shell-escape "~0.1.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -1050,6 +1489,26 @@ v8-to-istanbul@^7.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +wcwidth.js@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth.js/-/wcwidth.js-1.0.1.tgz#44ad20db7d28dbb0a538604637e905de030f2996" + integrity sha512-LfinnEPQ7qBU4VWQpUsPi2GO3DsMsW/JMPBSi/FdvsutiCFcyQ66qBJIRJ9Lc3zNueiFnhioeJSdqlAkdONO8g== + +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" From eb802f28cc568afcc7f48fc6fc58560d8c53c8eb Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 17:58:38 -0400 Subject: [PATCH 11/25] casing casing --- package.json | 6 +++--- test/modules/AsyncFunctionOneParam.v | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) delete mode 100644 test/modules/AsyncFunctionOneParam.v diff --git a/package.json b/package.json index acdc0ae..a796e85 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ "vogue": "out/run.js" }, "scripts": { - "dev": "cross-env FORCE_COLOR=true multiview [ yarn test:watch ] [ yarn compile:watch ]", + "dev": "multiview [ yarn test:watch ] [ yarn compile:watch ]", "test": "c8 --all mocha", "test:watch": "supervisor -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec yarn -- test", "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", "debug:watch": "supervisor -w out,test/system/**/*.v,lib -n exit --exec yarn -- clear_and yarn debug", - "compile": "tsc", - "compile:watch": "yarn compile --watch", + "compile": "tsc --listEmittedFiles", + "compile:watch": "yarn compile --watch --preserveWatchOutput", "postinstall": "yarn compile" }, "dependencies": { diff --git a/test/modules/AsyncFunctionOneParam.v b/test/modules/AsyncFunctionOneParam.v deleted file mode 100644 index 82c38fb..0000000 --- a/test/modules/AsyncFunctionOneParam.v +++ /dev/null @@ -1,3 +0,0 @@ -async test(a) { - -} \ No newline at end of file From fd69ee0d0ae8596ee1f0d952f0dd49e9060213e3 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 17:59:07 -0400 Subject: [PATCH 12/25] casing casing casin --- test/modules/asyncFunctionOneParameter.v | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 test/modules/asyncFunctionOneParameter.v diff --git a/test/modules/asyncFunctionOneParameter.v b/test/modules/asyncFunctionOneParameter.v new file mode 100644 index 0000000..ac21368 --- /dev/null +++ b/test/modules/asyncFunctionOneParameter.v @@ -0,0 +1,3 @@ +async test(a) { + +} \ No newline at end of file From ffb54417f329e80fec1569642faf604b8e4b3be8 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 18:02:38 -0400 Subject: [PATCH 13/25] dev not working on windows :( --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a796e85..a771f60 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ "scripts": { "dev": "multiview [ yarn test:watch ] [ yarn compile:watch ]", "test": "c8 --all mocha", - "test:watch": "supervisor -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec yarn -- test", + "test:watch": "supervisor -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec yarn.cmd -- test", "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", "debug:watch": "supervisor -w out,test/system/**/*.v,lib -n exit --exec yarn -- clear_and yarn debug", - "compile": "tsc --listEmittedFiles", + "compile": "tsc", "compile:watch": "yarn compile --watch --preserveWatchOutput", "postinstall": "yarn compile" }, From 8b6642e5503b6245bc2568d82bfd67501df9fe50 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 18:03:16 -0400 Subject: [PATCH 14/25] okay NOW --- .../{asyncFunctionOneParameter.v => asyncFunctionOneParam.v} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/modules/{asyncFunctionOneParameter.v => asyncFunctionOneParam.v} (100%) diff --git a/test/modules/asyncFunctionOneParameter.v b/test/modules/asyncFunctionOneParam.v similarity index 100% rename from test/modules/asyncFunctionOneParameter.v rename to test/modules/asyncFunctionOneParam.v From 6f8f279543d9df7201cd71168045d9c4597b7ae5 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 18:21:09 -0400 Subject: [PATCH 15/25] tests dont test block (for line ending differences) --- package.json | 2 +- test/lexer.test.ts | 72 ++++++++++++++++++++++++++++++---------------- 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index a771f60..685d8db 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "scripts": { "dev": "multiview [ yarn test:watch ] [ yarn compile:watch ]", "test": "c8 --all mocha", - "test:watch": "supervisor -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec yarn.cmd -- test", + "test:watch": "supervisor -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec yarn -- test", "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", "debug:watch": "supervisor -w out,test/system/**/*.v,lib -n exit --exec yarn -- clear_and yarn debug", "compile": "tsc", diff --git a/test/lexer.test.ts b/test/lexer.test.ts index 817b0ce..4fb6262 100644 --- a/test/lexer.test.ts +++ b/test/lexer.test.ts @@ -5,77 +5,101 @@ import * as ModuleFiles from './lib/ModuleFiles.js' describe('Lexer', () => { it('parses blank file', () => { - const ast = createAst(ModuleFiles.blank); + const ast: any = createAst(ModuleFiles.blank); expect(ast).to.deep.equal([]); }); describe('namespaces', () => { it('parses namespaces without dots', () => { - const ast = createAst(ModuleFiles.namespaceX); + const ast: any = createAst(ModuleFiles.namespaceX); expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x'}]); }); it('parses namespaces with a single dot', () => { - const ast = createAst(ModuleFiles.namespaceXY); + const ast: any = createAst(ModuleFiles.namespaceXY); expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y'}]); }); it('parses namespaces two dots', () => { - const ast = createAst(ModuleFiles.namespaceXYZ); + const ast: any = createAst(ModuleFiles.namespaceXYZ); expect(ast).to.deep.equal([{type: 'namespace', namespace: 'x.y.z'}]); }); }); describe('links', () => { it('parses link', () => { - const ast = createAst(ModuleFiles.link); + const ast: any = createAst(ModuleFiles.link); expect(ast).to.deep.equal([{type: 'link', array: false, required: false, name: 'test'}]); }); it('parses required link', () => { - const ast = createAst(ModuleFiles.requiredLink); + const ast: any = createAst(ModuleFiles.requiredLink); expect(ast).to.deep.equal([{type: 'link', array: false, required: true, name: 'test'}]); }); it('parses link array', () => { - const ast = createAst(ModuleFiles.linkArray); + const ast: any = createAst(ModuleFiles.linkArray); expect(ast).to.deep.equal([{type: 'link', array: true, required: false, name: 'test'}]); }); it('parses required link array', () => { - const ast = createAst(ModuleFiles.requiredLinkArray); + const ast: any = createAst(ModuleFiles.requiredLinkArray); expect(ast).to.deep.equal([{type: 'link', array: true, required: true, name: 'test'}]); }); }); describe('functions', () => { it('function with parameters omitted', () => { - const ast = createAst(ModuleFiles.functionNoParams); - expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: [], async: false}]); + const ast: any = createAst(ModuleFiles.functionNoParams); + expect(ast).to.be.an('array').with.length(1); + expect(ast[0]).to.be.an('object'); + expect(ast[0]).to.include({type: 'function', name: 'test', async: false}); + expect(ast[0].parameters).to.be.an('array').of.length(0); }); it('function with empty parameters', () => { - const ast = createAst(ModuleFiles.functionEmptyParams); - expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: [], async: false}]); + const ast: any = createAst(ModuleFiles.functionEmptyParams); + expect(ast).to.be.an('array').with.length(1); + expect(ast[0]).to.be.an('object'); + expect(ast[0]).to.include({type: 'function', name: 'test', async: false}); + expect(ast[0].parameters).to.be.an('array').of.length(0); }); it('function with one parameter', () => { - const ast = createAst(ModuleFiles.functionOneParam); - expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: ["a"], async: false}]); + const ast: any = createAst(ModuleFiles.functionOneParam); + expect(ast).to.be.an('array').with.length(1); + expect(ast[0]).to.be.an('object'); + expect(ast[0]).to.include({type: 'function', name: 'test', async: false}); + expect(ast[0].parameters).to.be.an('array').deep.equals(["a"]); }); it('function with two parameters', () => { - const ast = createAst(ModuleFiles.functionTwoParams); - expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: ["a", "b"], async: false}]); + const ast: any = createAst(ModuleFiles.functionTwoParams); + expect(ast).to.be.an('array').with.length(1); + expect(ast[0]).to.be.an('object'); + expect(ast[0]).to.include({type: 'function', name: 'test', async: false}); + expect(ast[0].parameters).to.be.an('array').deep.equals(["a", "b"]); }); it('async function with parameters omitted', () => { - const ast = createAst(ModuleFiles.asyncFunctionNoParams); - expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: [], async: true}]); + const ast: any = createAst(ModuleFiles.asyncFunctionNoParams); + expect(ast).to.be.an('array').with.length(1); + expect(ast[0]).to.be.an('object'); + expect(ast[0]).to.deep.include({type: 'function', name: 'test', async: true}); + expect(ast[0].parameters).to.be.an('array').of.length(0); }); it('async function with empty parameters', () => { - const ast = createAst(ModuleFiles.asyncFunctionEmptyParams); - expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: [], async: true}]); + const ast: any = createAst(ModuleFiles.asyncFunctionEmptyParams); + expect(ast).to.be.an('array').with.length(1); + expect(ast[0]).to.be.an('object'); + expect(ast[0]).to.deep.include({type: 'function', name: 'test', async: true}); + expect(ast[0].parameters).to.be.an('array').of.length(0); }); it('async function with one parameter', () => { - const ast = createAst(ModuleFiles.asyncFunctionOneParam); - expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: ["a"], async: true}]); + const ast: any = createAst(ModuleFiles.asyncFunctionOneParam); + expect(ast).to.be.an('array').with.length(1); + expect(ast[0]).to.be.an('object'); + expect(ast[0]).to.deep.include({type: 'function', name: 'test', async: true}); + expect(ast[0].parameters).to.be.an('array').deep.equals(["a"]); }); it('async function with two parameters', () => { - const ast = createAst(ModuleFiles.asyncFunctionTwoParams); - expect(ast).to.deep.equal([{type: 'function', name: 'test', block: '{\n\t\n}', parameters: ["a", "b"], async: true}]); + const ast: any = createAst(ModuleFiles.asyncFunctionTwoParams); + expect(ast).to.be.an('array').with.length(1); + expect(ast[0]).to.be.an('object'); + expect(ast[0]).to.deep.include({type: 'function', name: 'test', async: true}); + expect(ast[0].parameters).to.be.an('array').deep.equals(["a", "b"]); }); }); From 9418af0d525d8c2daba37672023a86a3232fd333 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 18:58:59 -0400 Subject: [PATCH 16/25] works on WINDOWS?!?! --- .nycrc.json | 9 --------- test/extensions.test.ts | 1 - test/lexer.test.ts | 2 +- test/tsconfig.json | 8 ++------ 4 files changed, 3 insertions(+), 17 deletions(-) delete mode 100644 .nycrc.json diff --git a/.nycrc.json b/.nycrc.json deleted file mode 100644 index c686840..0000000 --- a/.nycrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extension": [ - ".ts" - ], - "require": [ - "ts-node/esm.mjs" - ], - "cache": false -} \ No newline at end of file diff --git a/test/extensions.test.ts b/test/extensions.test.ts index d22e16e..6f193f6 100644 --- a/test/extensions.test.ts +++ b/test/extensions.test.ts @@ -1,6 +1,5 @@ import { expect } from 'chai'; import '../src/extensions.ts'; -import sinon from 'sinon'; describe('extensions', () => { it('creates empty array extensions', () => { diff --git a/test/lexer.test.ts b/test/lexer.test.ts index 4fb6262..98d6805 100644 --- a/test/lexer.test.ts +++ b/test/lexer.test.ts @@ -1,4 +1,4 @@ -import { createAst } from '../out/createAst.js'; +import { createAst } from '../src/createAst.js'; import { expect } from 'chai'; import * as ModuleFiles from './lib/ModuleFiles.js' diff --git a/test/tsconfig.json b/test/tsconfig.json index 0472462..055efbf 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,12 +1,8 @@ { "compilerOptions": { - "module": "esnext", + "module": "ES6", "moduleResolution": "node", - "strict": true, - "allowSyntheticDefaultImports": true, - "target": "esnext", - "sourceMap": true, - "declaration": true + "target": "es2020" }, "include": [ "**/*.ts" From 3f3ce060d5b55b2fc209e6b7a844da3f24d2d423 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 19:52:11 -0400 Subject: [PATCH 17/25] works on windows now! --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 685d8db..5812385 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "scripts": { "dev": "multiview [ yarn test:watch ] [ yarn compile:watch ]", "test": "c8 --all mocha", - "test:watch": "supervisor -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec yarn -- test", + "test:watch": "cross-env FORCE_COLOR=true supervisor -t -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec cross-env -- yarn test", "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", "debug:watch": "supervisor -w out,test/system/**/*.v,lib -n exit --exec yarn -- clear_and yarn debug", "compile": "tsc", From 2c052b3feeda3cb43643e33e9a1a55fb3924c806 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 20:35:48 -0400 Subject: [PATCH 18/25] re-instantiate examples/test as system testing --- {test/system => examples/test}/counter.v | 0 examples/test/main.v | 23 ++- package.json | 8 +- test/system/main.v | 24 ---- test/system/package.json | 10 -- test/system/yarn.lock | 176 ----------------------- 6 files changed, 25 insertions(+), 216 deletions(-) rename {test/system => examples/test}/counter.v (100%) delete mode 100644 test/system/main.v delete mode 100644 test/system/package.json delete mode 100644 test/system/yarn.lock diff --git a/test/system/counter.v b/examples/test/counter.v similarity index 100% rename from test/system/counter.v rename to examples/test/counter.v diff --git a/examples/test/main.v b/examples/test/main.v index 745b90d..cd334cf 100644 --- a/examples/test/main.v +++ b/examples/test/main.v @@ -1,5 +1,24 @@ singleton; -restore { - console.log('worked!\n'.repeat(10)); +link counter; +link window; + +async restore { + // process.stdout.write(typeof console._link + '\n'); + console.log('~ Welcome to Vogue ~'); + // process.stdout.write(JSON.stringify(console, null, 2)) + counter ??= create('counter', {}); + for(let i = 0; i < 10; i ++) + counter.increment(); + // const choice = await console.choice('select a thing', ['a', 'b', 'c', 'd']); + + console.log(counter.getCount()); + + // window ??= create('SDL.window', {}); + + // window.setScene() + + // await counter.render(); + + sync(); } \ No newline at end of file diff --git a/package.json b/package.json index 5812385..d8ca6bf 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,14 @@ "vogue": "out/run.js" }, "scripts": { - "dev": "multiview [ yarn test:watch ] [ yarn compile:watch ]", + "dev": "multiview [ yarn test:watch ] [ yarn compile:watch ] [ yarn debug:watch ]", "test": "c8 --all mocha", "test:watch": "cross-env FORCE_COLOR=true supervisor -t -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec cross-env -- yarn test", - "debug": "cross-env DEBUG=vogue:* yarn node --enable-source-maps --unhandled-rejections=strict out/run.js test", - "debug:watch": "supervisor -w out,test/system/**/*.v,lib -n exit --exec yarn -- clear_and yarn debug", + "debug": "cross-env DEBUG=vogue:* FORCE_COLOR=true DEBUG_COLORS=true DEBUG_HIDE_DATE=true node --enable-source-maps --unhandled-rejections=strict out/run.js examples/test", + "debug:watch": "supervisor -t -w out,test/system/**/*.v,lib -n exit --exec yarn -- debug", "compile": "tsc", "compile:watch": "yarn compile --watch --preserveWatchOutput", - "postinstall": "yarn compile" + "postinstall": "yarn compile && cd examples/test && yarn" }, "dependencies": { "@types/chai": "^4.2.18", diff --git a/test/system/main.v b/test/system/main.v deleted file mode 100644 index cd334cf..0000000 --- a/test/system/main.v +++ /dev/null @@ -1,24 +0,0 @@ -singleton; - -link counter; -link window; - -async restore { - // process.stdout.write(typeof console._link + '\n'); - console.log('~ Welcome to Vogue ~'); - // process.stdout.write(JSON.stringify(console, null, 2)) - counter ??= create('counter', {}); - for(let i = 0; i < 10; i ++) - counter.increment(); - // const choice = await console.choice('select a thing', ['a', 'b', 'c', 'd']); - - console.log(counter.getCount()); - - // window ??= create('SDL.window', {}); - - // window.setScene() - - // await counter.render(); - - sync(); -} \ No newline at end of file diff --git a/test/system/package.json b/test/system/package.json deleted file mode 100644 index eed6f0b..0000000 --- a/test/system/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "system", - "version": "1.0.0", - "main": "index.js", - "license": "MIT", - "dependencies": { - "sisteransi": "^1.0.5", - "terminal-kit": "^2.1.2" - } -} diff --git a/test/system/yarn.lock b/test/system/yarn.lock deleted file mode 100644 index fcf7cdd..0000000 --- a/test/system/yarn.lock +++ /dev/null @@ -1,176 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cronvel/get-pixels@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@cronvel/get-pixels/-/get-pixels-3.4.0.tgz#697cd691c16bbb8b29ed596da73fd6a7e9a2f34d" - integrity sha512-do5jDoX9oCR/dGHE4POVQ3PYDCmQ2Fow4CA72UL4WoE8zUImA/0lChczjfl+ucNjE4sXFWUnzoO6j4WzrUvLnw== - dependencies: - jpeg-js "^0.4.1" - ndarray "^1.0.19" - ndarray-pack "^1.1.1" - node-bitmap "0.0.1" - omggif "^1.0.10" - pngjs "^5.0.0" - -chroma-js@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.1.2.tgz#1075cb9ae25bcb2017c109394168b5cf3aa500ec" - integrity sha512-ri/ouYDWuxfus3UcaMxC1Tfp3IE9K5iQzxc2hSxbBRVNQFut1UuGAsZmiAf2mOUubzGJwgMSv9lHg+XqLaz1QQ== - dependencies: - cross-env "^6.0.3" - -cross-env@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" - integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== - dependencies: - cross-spawn "^7.0.0" - -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cwise-compiler@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" - integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= - dependencies: - uniq "^1.0.0" - -iota-array@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" - integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= - -is-buffer@^1.0.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -jpeg-js@^0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" - integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== - -lazyness@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/lazyness/-/lazyness-1.2.0.tgz#5dc0f02c37280436b21f0e4918ce6e72a109c657" - integrity sha512-KenL6EFbwxBwRxG93t0gcUyi0Nw0Ub31FJKN1laA4UscdkL1K1AxUd0gYZdcLU3v+x+wcFi4uQKS5hL+fk500g== - -ndarray-pack@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" - integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= - dependencies: - cwise-compiler "^1.1.2" - ndarray "^1.0.13" - -ndarray@^1.0.13, ndarray@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" - integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== - dependencies: - iota-array "^1.0.0" - is-buffer "^1.0.2" - -nextgen-events@^1.3.4: - version "1.4.0" - resolved "https://registry.yarnpkg.com/nextgen-events/-/nextgen-events-1.4.0.tgz#82e7201e4d8421f1cb4dcfce973c10b455fdc2be" - integrity sha512-bwSpShfuLg/lcRFokZvtUcrn5kumy6uRI6Jc+QWzH+bW6ZRdog7LfwAwhqeTzVfsprZgDGrctr6rO5aJhcdAfg== - -node-bitmap@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/node-bitmap/-/node-bitmap-0.0.1.tgz#180eac7003e0c707618ef31368f62f84b2a69091" - integrity sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE= - -omggif@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" - integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -pngjs@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" - integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -seventh@^0.7.40: - version "0.7.40" - resolved "https://registry.yarnpkg.com/seventh/-/seventh-0.7.40.tgz#a5a010496cb84421bb81f524840484a5aa473be9" - integrity sha512-7sxUydQx4iEh17uJUFjZDAwbffJirldZaNIJvVB/hk9mPEL3J4GpLGSL+mHFH2ydkye46DAsLGqzFJ+/Qj5foQ== - dependencies: - setimmediate "^1.0.5" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -string-kit@^0.12.5: - version "0.12.5" - resolved "https://registry.yarnpkg.com/string-kit/-/string-kit-0.12.5.tgz#e7f646e7740e54b7ecae6cf67b73bb616aa16652" - integrity sha512-aB7yK0RgOx3SElEfQ6lZu2xS5hWr4ToJispiy+djJ4yh3f2zaTMCm44ZrHZnN1RiQQCLfpa5Btz2bishyBm8IQ== - -terminal-kit@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/terminal-kit/-/terminal-kit-2.1.2.tgz#08689ff9f8efc6614d34d4cc7be916a91742b896" - integrity sha512-1eG7CrQfE1dd5ZHPG5WrTk/DTeskFPqSLEl+QYmvwvI41dRCN2j1qVyxA4FwE0/x24AbjhSA3FJSIgWqQD610Q== - dependencies: - "@cronvel/get-pixels" "^3.4.0" - chroma-js "^2.1.1" - lazyness "^1.2.0" - ndarray "^1.0.19" - nextgen-events "^1.3.4" - seventh "^0.7.40" - string-kit "^0.12.5" - tree-kit "^0.7.0" - -tree-kit@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/tree-kit/-/tree-kit-0.7.0.tgz#f677b10f79d9b4442ba20e0d87c8a12ecabe5fbb" - integrity sha512-MAqFo2oJJ39zmxq3xETx0nMAgZw2z6pnJPjIAehEcrDaeePDhBBTshAlyhCDtezMDTIu1Av+vGE501xN3Sh8VA== - -uniq@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" From 4a3e160cf846d548260443947291565dd6aaf271 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 20:37:20 -0400 Subject: [PATCH 19/25] update repo field --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index d8ca6bf..b26e8bf 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,9 @@ "bin": { "vogue": "out/run.js" }, + "repository": { + "url": "https://github.com/marcus13345/vogue" + }, "scripts": { "dev": "multiview [ yarn test:watch ] [ yarn compile:watch ] [ yarn debug:watch ]", "test": "c8 --all mocha", From 01ad715b106c792090c00d5840c31f2e81073bd3 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 21:27:42 -0400 Subject: [PATCH 20/25] update for release --- .npmignore | 6 +- package.json | 32 +- yarn.lock | 2752 +++++++++++++++++++++----------------------------- 3 files changed, 1179 insertions(+), 1611 deletions(-) diff --git a/.npmignore b/.npmignore index 9475183..a95bf19 100644 --- a/.npmignore +++ b/.npmignore @@ -6,4 +6,8 @@ tsconfig.json .system *.tgz .nyc_output -coverage \ No newline at end of file +coverage +syntax.md +testinglib +.travis.yml +.mocharc.json \ No newline at end of file diff --git a/package.json b/package.json index b26e8bf..200534f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vogue", - "version": "0.0.1", + "version": "0.1.0", "main": "index.js", "license": "MIT", "type": "module", @@ -20,7 +20,11 @@ "compile:watch": "yarn compile --watch --preserveWatchOutput", "postinstall": "yarn compile && cd examples/test && yarn" }, - "dependencies": { + "devDependencies": { + "c8": "^7.7.2", + "cross-env": "^7.0.3", + "multiview": "^3.0.1", + "yarn": "^1.22.10", "@types/chai": "^4.2.18", "@types/debug": "^4.1.5", "@types/fs-extra": "^9.0.11", @@ -31,25 +35,21 @@ "@types/sinon": "^10.0.0", "@types/uglify-js": "^3.13.0", "@types/uuid": "^8.3.0", - "c8": "^7.7.2", "chai": "^4.3.4", - "concurrently": "^6.1.0", - "cross-env": "^7.0.3", - "debug": "^4.3.1", - "esm": "^3.2.25", - "fs-extra": "^10.0.0", - "lodash": "^4.17.21", "mocha": "^8.4.0", "mocha-lcov-reporter": "^1.3.0", - "moo": "^0.5.1", - "multiview": "^3.0.1", - "nearley": "^2.20.1", - "sinon": "^10.0.0", "supervisor": "^0.12.0", + "sinon": "^10.0.0", "ts-node": "^9.1.1", - "typescript": "^4.2.4", + "typescript": "^4.2.4" + }, + "dependencies": { + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "lodash": "^4.17.21", + "moo": "^0.5.1", + "nearley": "^2.20.1", "uglify-js": "^3.13.5", - "uuid": "^8.3.2", - "yarn": "^1.22.10" + "uuid": "^8.3.2" } } diff --git a/yarn.lock b/yarn.lock index c9c5c6d..48b1f2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,1594 +1,1158 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== - dependencies: - "@babel/highlight" "^7.12.13" - -"@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== - -"@babel/highlight@^7.12.13": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" - integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^7.0.4": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.0.tgz#8f13af27d842cbf51ad4502e05562fe9391d084e" - integrity sha512-hAEzXi6Wbvlb67NnGMGSNOeAflLVnMa4yliPU/ty1qjgW/vAletH15/v/esJwASSIA0YlIyjnloenFbEZc9q9A== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/samsam@^5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" - integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== - dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - -"@types/chai@^4.2.18": - version "4.2.18" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" - integrity sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ== - -"@types/debug@^4.1.5": - version "4.1.5" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz" - -"@types/fs-extra@^9.0.11": - version "9.0.11" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.11.tgz#8cc99e103499eab9f347dbc6ca4e99fb8d2c2b87" - integrity sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" - integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^26.0.23": - version "26.0.23" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" - integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== - dependencies: - jest-diff "^26.0.0" - pretty-format "^26.0.0" - -"@types/lodash@^4.14.169": - version "4.14.169" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.169.tgz" - -"@types/nearley@^2.11.1": - version "2.11.1" - resolved "https://registry.npmjs.org/@types/nearley/-/nearley-2.11.1.tgz" - -"@types/node@*": - version "15.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.0.tgz#f0ddca5a61e52627c9dcb771a6039d44694597bc" - integrity sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A== - -"@types/node@^15.3.0": - version "15.3.0" - resolved "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz" - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/sinon@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.0.tgz#eecc3847af03d45ffe53d55aaaaf6ecb28b5e584" - integrity sha512-jDZ55oCKxqlDmoTBBbBBEx+N8ZraUVhggMZ9T5t+6/Dh8/4NiOjSUfpLrPiEwxQDlAe3wpAkoXhWvE6LibtsMQ== - dependencies: - "@sinonjs/fake-timers" "^7.0.4" - -"@types/uglify-js@^3.13.0": - version "3.13.0" - resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz" - dependencies: - source-map "^0.6.1" - -"@types/uuid@^8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" - integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== - -"@types/yargs-parser@*": - version "20.2.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" - integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== - -"@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== - dependencies: - "@types/yargs-parser" "*" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" - integrity sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-state@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ansi-state/-/ansi-state-1.0.5.tgz#0aeda248409664ac16b589121ac831cd6f721aa7" - integrity sha1-Cu2iSECWZKwWtYkSGsgxzW9yGqc= - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= - -c8@^7.7.2: - version "7.7.2" - resolved "https://registry.yarnpkg.com/c8/-/c8-7.7.2.tgz#30ff37b8125d96cab3eb065895a0b68dbc495a0f" - integrity sha512-8AqNnUMxB3hsgYCYso2GJjlwnaNPlrEEbYbCQb7N76V1nrOgCKXiTcE3gXU18rIj0FeduPywROrIBMC7XAKApg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@istanbuljs/schema" "^0.1.2" - find-up "^5.0.0" - foreground-child "^2.0.0" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-report "^3.0.0" - istanbul-reports "^3.0.2" - rimraf "^3.0.0" - test-exclude "^6.0.0" - v8-to-istanbul "^7.1.0" - yargs "^16.2.0" - yargs-parser "^20.2.7" - -camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -chai@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -columnify@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.3.2.tgz#61bd578a9269ae6fd949ce36fff589f3702c7867" - integrity sha1-Yb1XipJprm/ZSc42//WJ83AseGc= - dependencies: - strip-ansi "^2.0.0" - wcwidth "^1.0.0" - -columns@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/columns/-/columns-0.8.0.tgz#c272fd81a18704423b2a3842e99d1920a577edd9" - integrity sha1-wnL9gaGHBEI7KjhC6Z0ZIKV37dk= - dependencies: - ansi-state "~1.0.5" - heartbeats "~3.1.0" - split "~0.3.2" - strip-bom "~1.0.0" - wcwidth.js "~1.0.0" - -commander@^2.19.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concurrently@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.1.0.tgz#00d22525d3fcdce7f34cc7f3c9753f90a57d6208" - integrity sha512-jy+xj49pvqeKjc2TAVXRIhrgPG51eBKDZti0kZ41kaWk9iLbyWBjH6KMFpW7peOLkEymD+ZM83Lx6UEy3N/M9g== - dependencies: - chalk "^4.1.0" - date-fns "^2.16.1" - lodash "^4.17.21" - read-pkg "^5.2.0" - rxjs "^6.6.3" - spawn-command "^0.0.2-1" - supports-color "^8.1.0" - tree-kill "^1.2.2" - yargs "^16.2.0" - -convert-source-map@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.0, cross-spawn@^7.0.1: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -date-fns@^2.16.1: - version "2.21.3" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.3.tgz#8f5f6889d7a96bbcc1f0ea50239b397a83357f9b" - integrity sha512-HeYdzCaFflc1i4tGbj7JKMjM4cKGYoyxwcIIkHzNgCkX8xXDNJDZXgDDVchIWpN4eQc3lH37WarduXFZJOtxfw== - -debug@4.3.1, debug@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^4.0.1, diff@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -discontinuous-range@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esm@^3.2.25: - version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" - integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== - -event-transmitter@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/event-transmitter/-/event-transmitter-2.0.0.tgz#7d58aeb72abb47c1e7eab0d7bf78033c0de33493" - integrity sha1-fViutyq7R8Hn6rDXv3gDPA3jNJM= - dependencies: - readable-stream "2.2.3" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0, find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3, glob@^7.1.4: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -heartbeats@~3.1.0: - version "3.1.5" - resolved "https://registry.yarnpkg.com/heartbeats/-/heartbeats-3.1.5.tgz#99be8b2392b9075cc9aebebb5831616bceac160e" - integrity sha1-mb6LI5K5B1zJrr67WDFha86sFg4= - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@~2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-diff@^26.0.0: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== - dependencies: - chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== - dependencies: - argparse "^2.0.1" - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -just-extend@^4.0.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" - integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== - -keypress@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.2.1.tgz#1e80454250018dbad4c3fe94497d6e67b6269c77" - integrity sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc= - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - -log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.0: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mocha-lcov-reporter@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz#469bdef4f8afc9a116056f079df6182d0afb0384" - integrity sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q= - -mocha@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" - integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.6" - growl "1.10.5" - he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -moo@^0.5.0, moo@^0.5.1: - version "0.5.1" - resolved "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multiview@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/multiview/-/multiview-3.0.1.tgz#ecd7cc36b55a3a782a9615fc06b1ef74392cca1b" - integrity sha512-SQhM9HwOw3MUyeR1g0javHbdlQNL7NcMR5Q1aahMMGdOLe80hFid9la3n0B8fgl329Iy+0vvIpIBWu5LAigTqQ== - dependencies: - columns "0.8.0" - event-transmitter "2.0.0" - keypress "0.2.1" - protogram "1.1.3" - protogram-help "1.0.2" - tree-kill "^1.2.2" - unparse-args "1.0.1" - -nanoid@3.1.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== - -nearley@^2.20.1: - version "2.20.1" - resolved "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz" - dependencies: - commander "^2.19.0" - moo "^0.5.0" - railroad-diagrams "^1.0.0" - randexp "0.4.6" - -nise@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" - integrity sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^6.0.0" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pkginfo@~0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" - integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE= - -pretty-format@^26.0.0, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= - -protogram-help@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/protogram-help/-/protogram-help-1.0.2.tgz#fb49cacff85fe80edb3568ac6eac78af0b032a19" - integrity sha1-+0nKz/hf6A7bNWisbqx4rwsDKhk= - dependencies: - columnify "~1.3.2" - pkginfo "~0.3.0" - -protogram@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/protogram/-/protogram-1.1.3.tgz#95f1df709c43310d62c13942baa09b753a688cf1" - integrity sha1-lfHfcJxDMQ1iwTlCuqCbdTpojPE= - dependencies: - subarg "~1.0.0" - unparse-args "~1.0.1" - -railroad-diagrams@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz" - -randexp@0.4.6: - version "0.4.6" - resolved "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz" - dependencies: - discontinuous-range "1.0.0" - ret "~0.1.10" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729" - integrity sha1-nPSUY5hd8BbIrogTCXqSk6mzNyk= - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -resolve@^1.10.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rxjs@^6.6.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - -shell-escape@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/shell-escape/-/shell-escape-0.1.0.tgz#20e996fdd5f0c51be3f3c550119b77723d98e335" - integrity sha1-IOmW/dXwxRvj88VQEZt3cj2Y4zU= - -signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -sinon@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-10.0.0.tgz#52279f97e35646ff73d23207d0307977c9b81430" - integrity sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw== - dependencies: - "@sinonjs/commons" "^1.8.1" - "@sinonjs/fake-timers" "^6.0.1" - "@sinonjs/samsam" "^5.3.1" - diff "^4.0.2" - nise "^4.1.0" - supports-color "^7.1.0" - -source-map-support@^0.5.17: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -spawn-command@^0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" - integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== - -split@~0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= - dependencies: - through "2" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -strip-ansi@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz#df62c1aa94ed2f114e1d0f21fd1d50482b79a60e" - integrity sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4= - dependencies: - ansi-regex "^1.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-bom@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -subarg@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" - integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= - dependencies: - minimist "^1.1.0" - -supervisor@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/supervisor/-/supervisor-0.12.0.tgz" - -supports-color@8.1.1, supports-color@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -through@2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-node@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" - integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== - dependencies: - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -typescript@^4.2.4: - version "4.2.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz" - -uglify-js@^3.13.5: - version "3.13.5" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unparse-args@1.0.1, unparse-args@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unparse-args/-/unparse-args-1.0.1.tgz#85906d556861045806f97533cd325ad100677078" - integrity sha1-hZBtVWhhBFgG+XUzzTJa0QBncHg= - dependencies: - shell-escape "~0.1.0" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-to-istanbul@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -wcwidth.js@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth.js/-/wcwidth.js-1.0.1.tgz#44ad20db7d28dbb0a538604637e905de030f2996" - integrity sha512-LfinnEPQ7qBU4VWQpUsPi2GO3DsMsW/JMPBSi/FdvsutiCFcyQ66qBJIRJ9Lc3zNueiFnhioeJSdqlAkdONO8g== - -wcwidth@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - -which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2, yargs-parser@^20.2.7: - version "20.2.7" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" - integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0, yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yarn@^1.22.10: - version "1.22.10" - resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.10.tgz" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/fake-timers@^7.0.4": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.0.tgz#8f13af27d842cbf51ad4502e05562fe9391d084e" + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + +"@types/chai@^4.2.18": + version "4.2.18" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" + +"@types/debug@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + +"@types/fs-extra@^9.0.11": + version "9.0.11" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.11.tgz#8cc99e103499eab9f347dbc6ca4e99fb8d2c2b87" + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^26.0.23": + version "26.0.23" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + +"@types/lodash@^4.14.169": + version "4.14.170" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" + +"@types/nearley@^2.11.1": + version "2.11.1" + resolved "https://registry.yarnpkg.com/@types/nearley/-/nearley-2.11.1.tgz#6ac3f57c00ca28071a1774ec72d2e45750f21420" + +"@types/node@*", "@types/node@^15.3.0": + version "15.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.0.tgz#f0ddca5a61e52627c9dcb771a6039d44694597bc" + +"@types/sinon@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.0.tgz#eecc3847af03d45ffe53d55aaaaf6ecb28b5e584" + dependencies: + "@sinonjs/fake-timers" "^7.0.4" + +"@types/uglify-js@^3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124" + dependencies: + source-map "^0.6.1" + +"@types/uuid@^8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" + +"@types/yargs-parser@*": + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + +"@types/yargs@^15.0.0": + version "15.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" + dependencies: + "@types/yargs-parser" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + +ansi-regex@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + +ansi-state@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ansi-state/-/ansi-state-1.0.5.tgz#0aeda248409664ac16b589121ac831cd6f721aa7" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +c8@^7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/c8/-/c8-7.7.2.tgz#30ff37b8125d96cab3eb065895a0b68dbc495a0f" + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@istanbuljs/schema" "^0.1.2" + find-up "^5.0.0" + foreground-child "^2.0.0" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-reports "^3.0.2" + rimraf "^3.0.0" + test-exclude "^6.0.0" + v8-to-istanbul "^7.1.0" + yargs "^16.2.0" + yargs-parser "^20.2.7" + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + +chai@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + +columnify@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.3.2.tgz#61bd578a9269ae6fd949ce36fff589f3702c7867" + dependencies: + strip-ansi "^2.0.0" + wcwidth "^1.0.0" + +columns@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/columns/-/columns-0.8.0.tgz#c272fd81a18704423b2a3842e99d1920a577edd9" + dependencies: + ansi-state "~1.0.5" + heartbeats "~3.1.0" + split "~0.3.2" + strip-bom "~1.0.0" + wcwidth.js "~1.0.0" + +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +convert-source-map@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + dependencies: + safe-buffer "~5.1.1" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@4.3.1, debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + dependencies: + type-detect "^4.0.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + +diff@^4.0.1, diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + +event-transmitter@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/event-transmitter/-/event-transmitter-2.0.0.tgz#7d58aeb72abb47c1e7eab0d7bf78033c0de33493" + dependencies: + readable-stream "2.2.3" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + +glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + dependencies: + is-glob "^4.0.1" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.4: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + +heartbeats@~3.1.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/heartbeats/-/heartbeats-3.1.5.tgz#99be8b2392b9075cc9aebebb5831616bceac160e" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-diff@^26.0.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + dependencies: + argparse "^2.0.1" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + +keypress@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.2.1.tgz#1e80454250018dbad4c3fe94497d6e67b6269c77" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + dependencies: + p-locate "^5.0.0" + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + dependencies: + chalk "^4.0.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.0: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + +mocha-lcov-reporter@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz#469bdef4f8afc9a116056f079df6182d0afb0384" + +mocha@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +moo@^0.5.0, moo@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + +multiview@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/multiview/-/multiview-3.0.1.tgz#ecd7cc36b55a3a782a9615fc06b1ef74392cca1b" + dependencies: + columns "0.8.0" + event-transmitter "2.0.0" + keypress "0.2.1" + protogram "1.1.3" + protogram-help "1.0.2" + tree-kill "^1.2.2" + unparse-args "1.0.1" + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + +nearley@^2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + +nise@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + dependencies: + p-limit "^3.0.2" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + dependencies: + isarray "0.0.1" + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + +pkginfo@~0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +protogram-help@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/protogram-help/-/protogram-help-1.0.2.tgz#fb49cacff85fe80edb3568ac6eac78af0b032a19" + dependencies: + columnify "~1.3.2" + pkginfo "~0.3.0" + +protogram@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/protogram/-/protogram-1.1.3.tgz#95f1df709c43310d62c13942baa09b753a688cf1" + dependencies: + subarg "~1.0.0" + unparse-args "~1.0.1" + +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + dependencies: + safe-buffer "^5.1.0" + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + +readable-stream@2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + dependencies: + randombytes "^2.1.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + +shell-escape@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shell-escape/-/shell-escape-0.1.0.tgz#20e996fdd5f0c51be3f3c550119b77723d98e335" + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + +sinon@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-10.0.0.tgz#52279f97e35646ff73d23207d0307977c9b81430" + dependencies: + "@sinonjs/commons" "^1.8.1" + "@sinonjs/fake-timers" "^6.0.1" + "@sinonjs/samsam" "^5.3.1" + diff "^4.0.2" + nise "^4.1.0" + supports-color "^7.1.0" + +source-map-support@^0.5.17: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + +split@~0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +strip-ansi@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz#df62c1aa94ed2f114e1d0f21fd1d50482b79a60e" + dependencies: + ansi-regex "^1.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + dependencies: + ansi-regex "^5.0.0" + +strip-bom@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + +subarg@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + dependencies: + minimist "^1.1.0" + +supervisor@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/supervisor/-/supervisor-0.12.0.tgz#de7e6337015b291851c10f3538c4a7f04917ecc1" + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + dependencies: + has-flag "^4.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +through@2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + dependencies: + is-number "^7.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + +ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + +typescript@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + +uglify-js@^3.13.5: + version "3.13.7" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.7.tgz#25468a3b39b1c875df03f0937b2b7036a93f3fee" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + +unparse-args@1.0.1, unparse-args@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unparse-args/-/unparse-args-1.0.1.tgz#85906d556861045806f97533cd325ad100677078" + dependencies: + shell-escape "~0.1.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + +v8-to-istanbul@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +wcwidth.js@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth.js/-/wcwidth.js-1.0.1.tgz#44ad20db7d28dbb0a538604637e905de030f2996" + +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + dependencies: + defaults "^1.0.3" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + +yargs-parser@^20.2.2, yargs-parser@^20.2.7: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yarn@^1.22.10: + version "1.22.10" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.10.tgz#c99daa06257c80f8fa2c3f1490724e394c26b18c" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 54db1823f4fd79e9447868b195b3ef5c920733c1 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sun, 23 May 2021 22:12:27 -0400 Subject: [PATCH 21/25] update name --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 200534f..21a01cf 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "vogue", + "name": "vogue-runtime", "version": "0.1.0", "main": "index.js", "license": "MIT", From 75f55fccaaec24f7973b5dc7acbc917f104aa41b Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 25 May 2021 00:08:36 -0400 Subject: [PATCH 22/25] Closes #14 Closes #29 Closes #18 --- examples/test/a.v | 11 ++ examples/test/b.v | 11 ++ examples/test/main.v | 1 - package.json | 22 ++- src/Instance.ts | 24 ++- src/System.ts | 248 ++++++++++++++++------------ src/extensions.ts | 11 +- src/minify.ts | 16 -- src/run.ts | 6 +- test/extensions.test.ts | 2 +- test/lexer.test.ts | 2 +- test/lib/System.ts | 22 +++ test/lib/expect.ts | 5 + test/system.test.ts | 12 ++ test/systems/crossStaticLinking/a.v | 11 ++ test/systems/crossStaticLinking/b.v | 11 ++ test/systems/unknownModule/main.v | 5 + test/tsconfig.json | 5 +- yarn.lock | 44 ++++- 19 files changed, 316 insertions(+), 153 deletions(-) create mode 100644 examples/test/a.v create mode 100644 examples/test/b.v delete mode 100644 src/minify.ts create mode 100644 test/lib/System.ts create mode 100644 test/lib/expect.ts create mode 100644 test/system.test.ts create mode 100644 test/systems/crossStaticLinking/a.v create mode 100644 test/systems/crossStaticLinking/b.v create mode 100644 test/systems/unknownModule/main.v diff --git a/examples/test/a.v b/examples/test/a.v new file mode 100644 index 0000000..2d4e526 --- /dev/null +++ b/examples/test/a.v @@ -0,0 +1,11 @@ +static a; + +restore() { + if(typeof b !== 'object') { + throw new Error('Static instance A does not exist!'); + } else b.fun(); +} + +fun() { + console.log('hello from A'); +} \ No newline at end of file diff --git a/examples/test/b.v b/examples/test/b.v new file mode 100644 index 0000000..8bc7b41 --- /dev/null +++ b/examples/test/b.v @@ -0,0 +1,11 @@ +static b; + +restore() { + if(typeof a !== 'object') { + throw new Error('Static instance A does not exist!'); + } else a.fun(); +} + +fun() { + console.log('hello from B'); +} \ No newline at end of file diff --git a/examples/test/main.v b/examples/test/main.v index cd334cf..4fb31b7 100644 --- a/examples/test/main.v +++ b/examples/test/main.v @@ -1,4 +1,3 @@ -singleton; link counter; link window; diff --git a/package.json b/package.json index 21a01cf..fb3b42d 100644 --- a/package.json +++ b/package.json @@ -12,20 +12,17 @@ }, "scripts": { "dev": "multiview [ yarn test:watch ] [ yarn compile:watch ] [ yarn debug:watch ]", - "test": "c8 --all mocha", + "test": "c8 --include src/**/*.ts --reporter lcov --reporter text mocha", "test:watch": "cross-env FORCE_COLOR=true supervisor -t -w src,test,.mocharc.json -n exit --extensions js,ts,node --exec cross-env -- yarn test", - "debug": "cross-env DEBUG=vogue:* FORCE_COLOR=true DEBUG_COLORS=true DEBUG_HIDE_DATE=true node --enable-source-maps --unhandled-rejections=strict out/run.js examples/test", + "debug": "cross-env DEBUG=vogue:* FORCE_COLOR=true DEBUG_COLORS=true DEBUG_HIDE_DATE=true node --enable-source-maps out/run.js examples/test", "debug:watch": "supervisor -t -w out,test/system/**/*.v,lib -n exit --exec yarn -- debug", "compile": "tsc", "compile:watch": "yarn compile --watch --preserveWatchOutput", "postinstall": "yarn compile && cd examples/test && yarn" }, "devDependencies": { - "c8": "^7.7.2", - "cross-env": "^7.0.3", - "multiview": "^3.0.1", - "yarn": "^1.22.10", "@types/chai": "^4.2.18", + "@types/chai-as-promised": "^7.1.4", "@types/debug": "^4.1.5", "@types/fs-extra": "^9.0.11", "@types/jest": "^26.0.23", @@ -35,20 +32,29 @@ "@types/sinon": "^10.0.0", "@types/uglify-js": "^3.13.0", "@types/uuid": "^8.3.0", + "c8": "^7.7.2", "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "cross-env": "^7.0.3", "mocha": "^8.4.0", "mocha-lcov-reporter": "^1.3.0", - "supervisor": "^0.12.0", + "multiview": "^3.0.1", "sinon": "^10.0.0", + "supervisor": "^0.12.0", "ts-node": "^9.1.1", - "typescript": "^4.2.4" + "typescript": "^4.2.4", + "yarn": "^1.22.10" }, "dependencies": { + "@types/rimraf": "^3.0.0", + "@types/tmp": "^0.2.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", "lodash": "^4.17.21", "moo": "^0.5.1", "nearley": "^2.20.1", + "rimraf": "^3.0.2", + "tmp": "^0.2.1", "uglify-js": "^3.13.5", "uuid": "^8.3.2" } diff --git a/src/Instance.ts b/src/Instance.ts index 9ce88dd..e361dff 100644 --- a/src/Instance.ts +++ b/src/Instance.ts @@ -3,7 +3,7 @@ import _ from 'lodash'; const log = debug('vogue:instance'); import vm from 'vm'; import Module, { LinkDescription, Variable } from './Module.js'; -import System from './System.js'; +import { System } from './System.js'; import * as uuid from 'uuid'; /** * @typedef {import('./System.js').default} System @@ -54,9 +54,11 @@ export default class Instance { // TODO request context from system... initialContext.create = this.system.newLink.bind(this.system); initialContext.process = process; - for(const name in this.system.staticLinks) { + + // static links! + for(const [name, link] of this.system.staticLinks) { log('creating context with static link: ' + name); - initialContext[name] = this.system.staticLinks[name]; + initialContext[name] = this.system.staticLinks.get(name); } // local links! @@ -89,9 +91,11 @@ export default class Instance { vm.runInContext(injectedScript, context, {}); } - log('context created! ' + Object.keys(context)); + log('context created!'); + log(Object.keys(context)); // log(context); + this.context = context; return context; }; @@ -107,7 +111,6 @@ export default class Instance { constructor( module: Module, - location: string, parameters: {[name: string]: any}, system: System, options?: { @@ -115,7 +118,7 @@ export default class Instance { } ) { this.module = module; - this.location = location; + this.location = this.module.rootDir; this.system = system; // this.context = this.createContext(); this._id = options?.id ?? uuid.v4(); @@ -124,9 +127,6 @@ export default class Instance { get(target: Instance, prop: string, receiver) { log(`getting ${target.module.name.full}.${prop.toString()}: (${target.module.identifiers[prop]}|${typeof target.context?.[prop]})`); - if(target.context === null) - target.restore(); - const DNEText = `${target.module.name.full}.${prop.toString()} either does not exist, or is not accessible`; if(prop === 'restore') throw new Error(DNEText); if(prop === '__link__') return target._id; @@ -140,11 +140,9 @@ export default class Instance { log('created ' + this); } - restore() { - if(this.context === null) - this.context = this.createContext(); + async restore() { - return this.context?.restore?.(); + return await this.context?.restore?.(); } get link () { diff --git a/src/System.ts b/src/System.ts index b7167e9..788c58e 100644 --- a/src/System.ts +++ b/src/System.ts @@ -5,7 +5,8 @@ import debug from 'debug'; import { lstatSync, readdirSync, readFileSync, writeFileSync } from 'fs'; import { resolve } from 'path'; import { ensureDirSync } from 'fs-extra'; -const log = debug('vogue:system') +import * as uuid from 'uuid'; +const log = debug('vogue:system'); const {get, set} = _; @@ -15,93 +16,157 @@ type ModuleNamespaceMap = { type ModuleName = string; -class System { +export class System { instances: Map = new Map(); + bootInstances: Map = new Map(); + staticInstances: Map = new Map(); + staticLinks: Map = new Map(); + + modules: Module[]; namespace: ModuleNamespaceMap = {}; - staticLinks: { - [key: string]: Link - } = {}; rootDir: string; - constructor(modules: Module[], rootDir: string) { + static async create(modules: Module[], rootDir: string) { + const system = new System(modules, rootDir); + await system.start(); + return system; + } + + async start() { + ensureDirSync(resolve(this.rootDir, '.system')); + + log('System startup, in 5 steps!'); + + // step 1.1: load serialized instances... + log('Step 1.1: reading serialized instances...') + const serializedInstances: SerializedInstance[] = + readdirSync(resolve(this.rootDir, '.system')) + .map(v => resolve(this.rootDir, '.system', v)) + .map(v => JSON.parse(readFileSync(v).toString())); + + // step 1.2: create serialized instances + log('Step 1.2: creating serialized instances...'); + for(const serializedInstance of serializedInstances) + this.createInstance(serializedInstance); + + // TODO again, make links automagically tranform from strings to links when needed at runtime, so this isnt needed... + // step 1.2 addendum: + log('Step 1.2+: linking serialized instances...'); + for(const serializedInstance of serializedInstances) { + const instance = this.getInstanceById(serializedInstance.id); + for(const name in serializedInstance.links) { + const linkId = serializedInstance.links[name] + const linkedInstance = this.getInstanceById(linkId); + const linkedInstanceLink = linkedInstance.link; + instance.setLink(name, linkedInstanceLink); + } + } + + // step 2: validate all modules decalred as static have a static module counterpart + log('Step 2: creating missing static instances...'); + for(const module of this.modules.filter(module => !!module.static)) { + const staticIdentifier = module.static; + const moduleName = module.name.full; + if(!this.staticLinks.has(staticIdentifier)) { + this.createInstance({ + type: moduleName, + links: {}, + members: {}, + id: uuid.v4() + }) + } + } + + // step 3: create missing singleton instances + log('Step 3: creating missing singleton instances...'); + for(const module of this.modules.filter(module => !!module.singleton)) { + let instanceCount = 0; + for(const [,instance] of this.instances) { + if(instance.module.name.full === module.name.full) { + instanceCount ++; + } + } + if(instanceCount === 0) { + this.createInstance({ + type: module.name.full, + links: {}, + members: {}, + id: uuid.v4() + }) + } + } + + // step 4: create context in all instances + log('Step 4: create context in instances...'); + for(const [,instance] of this.instances) { + instance.createContext(); + } + + // step 5: restore all boot modules (static & singleton) + log('Step 5: restore all boot modules...'); + for(const [,instance] of this.bootInstances) { + await instance.restore(); + } + + // log('restoring static instances...'); + // for(const [,instance] of this.instances) { + // if(!!instance.module.static) { + // await instance.restore(); + // } + // } + + // log('restoring boot instances...'); + // for(const [,instance] of this.instances) { + // if(!!instance.module.singleton) { + // await instance.restore(); + // } + // } + + // const bootModules = this.deriveBootModules(); + // this.createStaticInstances(); + + // log('instantiating boot modules...'); + // for(const name of bootModules) { + // log(' ' + name); + // await this.newLink(name); + // } + } + + private constructor(modules: Module[], rootDir: string) { this.rootDir = rootDir; this.modules = modules; this.createNamespace(); - - ensureDirSync(resolve(this.rootDir, '.system')); - - const vault = readdirSync(resolve(this.rootDir, '.system')).map(v => resolve(this.rootDir, '.system', v)); - const serializedInstances: SerializedInstance[] = vault.map((v) => JSON.parse(readFileSync(v).toString())); - - log('injecting serialized instances...'); - for(const serializedInstance of serializedInstances) - this.injectSerializedInstance(serializedInstance); - log('linking serialized instances...'); - for(const serializedInstance of serializedInstances) - this.linkSerializedInstance(serializedInstance); - - log('restoring static instances...'); - for(const [,instance] of this.instances) { - if(!!instance.module.static) { - instance.restore(); - } - } - - log('restoring boot instances...'); - for(const [,instance] of this.instances) { - if(!!instance.module.singleton) { - instance.restore(); - } - } - // this.inject(serializedInstance); - - - if (vault.length !== 0) { - return this; - } - - // TODO future workflow notes - // pull jsons into boots - // filter json boots - // create static / singletons into boots - // boot boots! - - - const bootModules = this.deriveBootModules(); - this.createStaticInstances(); - - log('instantiating boot modules...'); - for(const name of bootModules) { - log(' ' + name); - this.newLink(name); - } } - linkSerializedInstance(serializedInstance: SerializedInstance): void { - const instance = this.getInstanceById(serializedInstance.id); - for(const name in serializedInstance.links) { - const linkId = serializedInstance.links[name] - const linkedInstance = this.getInstanceById(linkId); - const linkedInstanceLink = linkedInstance.link; - instance.setLink(name, linkedInstanceLink); - } - } - - injectSerializedInstance(serializedInstance: SerializedInstance): void { - const instance = new Instance(this.getModule(serializedInstance.type), this.rootDir, {}, this, { + createInstance(serializedInstance: SerializedInstance) { + // create instance + const instance = new Instance(this.getModule(serializedInstance.type), {}, this, { id: serializedInstance.id }); - this.instances.set(instance._id, instance); + // preset members for(const name in serializedInstance.members) { instance.setMember(name, serializedInstance.members[name]); } + // TODO preset links + // TODO consolidate links/members into args + + // add to all isntances + this.instances.set(instance._id, instance); + // if its static, add it to both static instance data structures. if(instance.module.static) { - log('injected static instance ' + instance.module.static + ': ' + instance.module.name.full); - this.staticLinks[instance.module.static] = instance.link; + this.staticLinks.set(instance.module.static, instance.link); + this.staticInstances.set(instance._id, instance); } + + // if it static, or just a singleton, add it to boot modules! + if(instance.module.singleton || instance.module.static) { + this.bootInstances.set(instance._id, instance); + } + + return instance; } getInstanceById(id: string): Instance { @@ -111,23 +176,6 @@ class System { return this.instances.get(id) as Instance; } - createStaticInstances() { - log('deriving static modules...'); - const staticModules = this.modules.filter((module) => { - return !!module.static; - }).map((module) => { - log(' ' + module.name.full); - return module; - }); - - log('instantiating static modules...'); - for(const module of staticModules) { - log(' ' + module.static + ': ' + module.name.full); - this.staticLinks[module.static] = - this.newLink(module.name.full, {}); - } - } - deriveBootModules() { log('deriving boot modules...'); const bootModules = this.modules.filter((module) => { @@ -143,12 +191,10 @@ class System { } createNamespace() { - log('creating namespace map...'); this.namespace = this.modules.reduce((acc, val) => { if(get(acc, val.name.full) instanceof Module) throw new Error('Duplicate module "' + val.name.full + '"'); set(acc, val.name.full, val); - log(' ' + val.name.full); return acc; }, {}); } @@ -164,27 +210,25 @@ class System { } getModule(name: ModuleName): Module { + console.log('GETTING MODULE', name) const module = get(this.namespace, name); if(module instanceof Module) return module; - else throw Error(`${name} is not a module`); + else throw Error(`unknown module ${name}`); } - createInstance(name: ModuleName, args = {}) { - const instance = new Instance(this.getModule(name), this.rootDir, args, this); - this.saveInstance(instance); - return instance; - } - - newLink(name: ModuleName, args = {}) { - const instance = this.createInstance(name, args); - const link = instance.link; - instance.restore(); - return link; + async newLink(name: ModuleName, args = {}) { + const instance = this.createInstance({ + type: name, + links: args, + members: {}, + id: uuid.v4() + }); + instance.createContext(); + await instance.restore(); + return instance.link; } } -export default System; - // class SerializedInstanceInjector { // system: System; // serializedInstances: SerializedInstance[]; diff --git a/src/extensions.ts b/src/extensions.ts index c1422e4..bd3d8ac 100644 --- a/src/extensions.ts +++ b/src/extensions.ts @@ -5,7 +5,10 @@ Object.defineProperty(Array.prototype, 'empty', { } }); -// in theory we dont need this anymore... with strict promise rejections... -// process.on('unhandledRejection', (reason: Error, p) => { -// console.log(reason.stack ?? reason.name + '\n\nStack trace unavailable...'); -// }); \ No newline at end of file +// ignored because there seems to be no good way to test this. +// would love to find one though... +/* c8 ignore start */ +process.on('unhandledRejection', (reason: Error, p) => { + console.log(reason.stack ?? reason.name + '\n\nStack trace unavailable...'); +}); +/* c8 ignore end */ \ No newline at end of file diff --git a/src/minify.ts b/src/minify.ts deleted file mode 100644 index d64f379..0000000 --- a/src/minify.ts +++ /dev/null @@ -1,16 +0,0 @@ - -// import uglify from 'uglify-js'; - -// export default (code: string): string => { -// return uglify.minify(code, { -// compress: { -// dead_code: true, -// global_defs: { -// DEBUG: false -// } -// }, -// sourceMap: { -// content: 'inline' -// } -// }).code; -// } \ No newline at end of file diff --git a/src/run.ts b/src/run.ts index 5de9ebb..190cdcc 100644 --- a/src/run.ts +++ b/src/run.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env node --enable-source-maps --unhandled-rejections=strict +#!/usr/bin/env node --enable-source-maps import debug from 'debug'; const log = debug('vogue:cli'); const systemLocation = resolve(process.argv[2]); @@ -8,7 +8,7 @@ import { readdirSync, lstatSync } from 'fs'; import _ from 'lodash'; import Module from './Module.js'; -import System from './System.js'; +import {System} from './System.js'; import './extensions.js'; import { fileURLToPath } from 'url'; @@ -31,7 +31,7 @@ const standardLibrary = resolve(fileURLToPath(dirname(import.meta.url)), '..', ' log('parsing modules...'); const modules = await Promise.all(fullpaths.map(loc => Module.create(loc, systemLocation))); - const sys = new System(modules, systemLocation); + const sys = await System.create(modules, systemLocation); })(); function walkdirSync(root: string, filter: ((path: string) => boolean) = () => true): string[] { diff --git a/test/extensions.test.ts b/test/extensions.test.ts index 6f193f6..752a873 100644 --- a/test/extensions.test.ts +++ b/test/extensions.test.ts @@ -1,4 +1,4 @@ -import { expect } from 'chai'; +import { expect } from './lib/expect.js'; import '../src/extensions.ts'; describe('extensions', () => { diff --git a/test/lexer.test.ts b/test/lexer.test.ts index 98d6805..403a6ad 100644 --- a/test/lexer.test.ts +++ b/test/lexer.test.ts @@ -1,5 +1,5 @@ import { createAst } from '../src/createAst.js'; -import { expect } from 'chai'; +import { expect } from './lib/expect.js'; import * as ModuleFiles from './lib/ModuleFiles.js' describe('Lexer', () => { diff --git a/test/lib/System.ts b/test/lib/System.ts new file mode 100644 index 0000000..3285e74 --- /dev/null +++ b/test/lib/System.ts @@ -0,0 +1,22 @@ +import {System} from '../../src/System.js'; +import * as tmp from 'tmp'; +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { createAst } from '../../src/createAst.js'; +import { readdirSync } from 'fs'; +import Module from '../../src/Module.js'; + +const systemsPath = resolve(fileURLToPath(dirname(import.meta.url)), '..', 'systems'); + +export async function createSystem(systemName: string) { + const { name: tmpDir } = tmp.dirSync(); + + const modulesPath = resolve(systemsPath, systemName); + const modules = await Promise.all(readdirSync(modulesPath) + .map(v => resolve(modulesPath, v)) + .map(v => Module.create(v, modulesPath))); + + const system = await System.create(modules, tmpDir); + + return system; +} \ No newline at end of file diff --git a/test/lib/expect.ts b/test/lib/expect.ts new file mode 100644 index 0000000..a8f8f7b --- /dev/null +++ b/test/lib/expect.ts @@ -0,0 +1,5 @@ +import * as chai from 'chai'; +import cap from 'chai-as-promised'; + +chai.use(cap); +export const {expect} = chai; \ No newline at end of file diff --git a/test/system.test.ts b/test/system.test.ts new file mode 100644 index 0000000..74f3464 --- /dev/null +++ b/test/system.test.ts @@ -0,0 +1,12 @@ +import { createSystem } from './lib/System.js'; +import { expect } from './lib/expect.js' + +describe('system', () => { + it('cross linked static instances', (done) => { + expect(createSystem('crossStaticLinking')).to.eventually.be.fulfilled.notify(done); + }); + + it('non-existant module retrieval throws', (done) => { + expect(createSystem('unknownModule')).to.eventually.be.rejected.notify(done); + }) +}); \ No newline at end of file diff --git a/test/systems/crossStaticLinking/a.v b/test/systems/crossStaticLinking/a.v new file mode 100644 index 0000000..0d310aa --- /dev/null +++ b/test/systems/crossStaticLinking/a.v @@ -0,0 +1,11 @@ +static a; + +restore() { + if(typeof b !== 'object') { + throw new Error('Static instance A does not exist!'); + } else b.fun(); +} + +fun() { + +} \ No newline at end of file diff --git a/test/systems/crossStaticLinking/b.v b/test/systems/crossStaticLinking/b.v new file mode 100644 index 0000000..0301d00 --- /dev/null +++ b/test/systems/crossStaticLinking/b.v @@ -0,0 +1,11 @@ +static b; + +restore() { + if(typeof a !== 'object') { + throw new Error('Static instance A does not exist!'); + } else a.fun(); +} + +fun() { + +} \ No newline at end of file diff --git a/test/systems/unknownModule/main.v b/test/systems/unknownModule/main.v new file mode 100644 index 0000000..e4c7ec5 --- /dev/null +++ b/test/systems/unknownModule/main.v @@ -0,0 +1,5 @@ +singleton; + +async restore { + await create('this.module.doesnt.exist'); +} \ No newline at end of file diff --git a/test/tsconfig.json b/test/tsconfig.json index 055efbf..45501cb 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,8 +1,9 @@ { "compilerOptions": { - "module": "ES6", + "module": "esnext", "moduleResolution": "node", - "target": "es2020" + "target": "es2020", + "allowSyntheticDefaultImports": true }, "include": [ "**/*.ts" diff --git a/yarn.lock b/yarn.lock index 48b1f2c..df18114 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,7 +50,13 @@ version "0.7.1" resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" -"@types/chai@^4.2.18": +"@types/chai-as-promised@^7.1.4": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.2.18": version "4.2.18" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" @@ -64,6 +70,13 @@ dependencies: "@types/node" "*" +"@types/glob@*": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" @@ -91,6 +104,10 @@ version "4.14.170" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" +"@types/minimatch@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + "@types/nearley@^2.11.1": version "2.11.1" resolved "https://registry.yarnpkg.com/@types/nearley/-/nearley-2.11.1.tgz#6ac3f57c00ca28071a1774ec72d2e45750f21420" @@ -99,12 +116,23 @@ version "15.6.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.0.tgz#f0ddca5a61e52627c9dcb771a6039d44694597bc" +"@types/rimraf@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.0.tgz#b9d03f090ece263671898d57bb7bb007023ac19f" + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/sinon@^10.0.0": version "10.0.0" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.0.tgz#eecc3847af03d45ffe53d55aaaaf6ecb28b5e584" dependencies: "@sinonjs/fake-timers" "^7.0.4" +"@types/tmp@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.0.tgz#e3f52b4d7397eaa9193592ef3fdd44dc0af4298c" + "@types/uglify-js@^3.13.0": version "3.13.0" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124" @@ -228,6 +256,12 @@ camelcase@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + dependencies: + check-error "^1.0.2" + chai@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" @@ -859,7 +893,7 @@ ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" dependencies: @@ -1015,6 +1049,12 @@ through@2: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + dependencies: + rimraf "^3.0.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" From 38056e0036b6e0e6092819ab25ef782db8fd4a8f Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 25 May 2021 00:09:29 -0400 Subject: [PATCH 23/25] cleanup --- src/System.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/System.ts b/src/System.ts index 788c58e..82911ea 100644 --- a/src/System.ts +++ b/src/System.ts @@ -210,7 +210,6 @@ export class System { } getModule(name: ModuleName): Module { - console.log('GETTING MODULE', name) const module = get(this.namespace, name); if(module instanceof Module) return module; else throw Error(`unknown module ${name}`); From 42ab49759bf4f3fa9c19b7d42e2ec688ad23461b Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 25 May 2021 00:10:35 -0400 Subject: [PATCH 24/25] update version for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb3b42d..6289719 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vogue-runtime", - "version": "0.1.0", + "version": "0.2.0", "main": "index.js", "license": "MIT", "type": "module", From bc20d53cdb92382e238cc2c518765916bc51549e Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 25 May 2021 14:06:42 -0400 Subject: [PATCH 25/25] coverage uploading? new docs... --- .travis.yml | 4 +- docs/banner.png | Bin 0 -> 273676 bytes syntax.md => docs/syntax.md | 25 ++++++++- package.json | 8 ++- readme.md | 57 +++++++++++++++++++++ src/System.ts | 2 +- yarn.lock | 98 +++++++++++++++++++++++++++++++++++- 7 files changed, 186 insertions(+), 8 deletions(-) create mode 100644 docs/banner.png rename syntax.md => docs/syntax.md (65%) create mode 100644 readme.md diff --git a/.travis.yml b/.travis.yml index bc37bc4..a64880c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,6 @@ os: - windows - linux - osx -env: YARN_GPG=no \ No newline at end of file +env: YARN_GPG=no + +script: yarn test:ci \ No newline at end of file diff --git a/docs/banner.png b/docs/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..243a54e3b09a750cccf6fd209b01f0305b0819d5 GIT binary patch literal 273676 zcmeFacUaSB_dgz`g{R6;i-58e9H%m|@3I2-_{Dd|VdKLU@o6|M5-(VSyJmcUGKUt}0sK8*^VLK@%KZ8I2 z;-IeU1cR|wLjP>5wtsC7gRQ>&{jACjccaNZLa~9B%Tdq0Y(H5CA7=ikh3xm_L{`yu z)QO7U-G1GV7OeIC^{#c?i8JMYJT0qy{)^6|U;eyq>hyDs_Ab&6Q)HKyQ{=;jk1rN^ zZsxtXb~`QaP9v%Dja%aiHDL^Q^JU@t{WA(TZz|vP>+)7oW&nrz{&n(ad)>b6-~SZ+ zIXFQD^@AT*m~-X+>jyu-o z!2VH!|L00jKT0G`h_ZjdPkxx_HwwXL@ja`ai1K-0!+JkfxO{ZCZIy~%ns;Bo%A5hU znCY`Udr7fFM7x3d2>0Bs4j$Iol|Hiu>3*Nv2s0P{@5{R&aqDojQQQ>8cR%)^L1FdP zxV-k>o&z>~Z~cY)@m%c+fAC#&n#y=A$$7PO_+L`PDj6O>DMm_F#3cGGz4X}Y*S+n# zPkhSZ$8pT2LIvf2_vRhnBdNwq(1-Yq9q52QO1{d*?KPq+pm6j`VJ#j!AV4JHX{l_6ahUz9 zOfcVaX1y0_+x<9LM&7g@%#dY=qnBgUvUW4w&YpAO{%|v8+X^=}L$vpWBhYg^IZ0k4MhglF02`HC%q2_GkHuWx`B?y@)Fd z*oU>YS;HZgiUmNld}Z5VPask1vFh<)2elzVI{r5VsWl$MqW9Al5x%bA7OPLNg_}OT zHJrU%uxAJDy(FWUk7~$B}yKOhB913Q)xz(z@Oaf}Icia&<_>&^^JZA*R}#@RpdJ zDc-7l_?XIrMi{m1(Fm{8*1NX| zXr`ox?JOI$tarE;hy$mm^b^c=N+ebP=__}q@@PKv-S9W;@RKJvQ!cdMdXbcN<3$wy z=eiU9rdlVjg)hS}(J6K9JSi9EbJpH!&T?Mv!-aEi9!YYIKX)i9z4bx>+f%pW{P9PI zl>*lz)1|LH`FwQemIK0WKG=rRfS-0lHV?NRM76D!FVsgjm4WNZsV!<7YMeHRRqX1m z%0DJ)E?y;taFMLo4eMm^N6pAh@2M2(HP;et(bW>Z7M@n7E{5G1`2;$lHZ>+GQF!b5Zj1xH z9*a@v=+$5nw#3+n1fOL-@4c`<$RXARO!XB>m9+Mjb`DSC`7b<}DyZ)|vWgg+FnuTp z%Q9mWIVHN(f3`nyc z8}qdGc8C1hi*6YWjp;N^eVc?|8Fpog^1HD2I7qM+yMkjH!(j5}%>oPE(;CC=|M9Z( z*h<|bTs9sJeUY@c>T0?v>NnAhf{N^-QJldyUbuVdLgKg4G5>&GIR9o3)qGs&#NMsW z>6V)jMycdvVq($9;p_z%XGIkscA5mT!i zuq%J6peBtM8BakH`O%XP*@&%O=VT@P+p~cV&aItJI{2N&-^4B{e9EOQQ+A~m(wnWK zWdE|V(Dib3lu5(10w-jSX$#5y($)5*$__hF$yA_8X%H4Ue3*}nZPQIPc?dhB%qW7E zuPwox^As}3Cw>OV zxDon~@Sqz=UhXsbqv|*RN^F>a_~bj-@k&%jW|Qb?Y3-=6iPHo2E{O(x37;GDuu`6X zRk2y;>>%=xR0dLA>%D#eRf{w%n6-xmh^JhY@5 zxGvjQ0ci$wiwZ?wqrVq?AyF}|6!qCf=v3w%Sv8L>2q8BP1EGPd*ct-PP{GZ5l@@v2 zCRwkdaTDhmbK9O_C5RH*-LwZ%G@`JG;tDD?XUg*@n5P8r`Eun93TWDqyNc@)pzHkK zYU7qBY}>XPAtO(+6Af2ELT>z#VdgF7u69o37-K_NSzPZku1$HyiH zsze+uc5-noFY+)Y32~;|zd8WIDP45-j0n{(W8nA#-i`QQEvyBi$w||BApqS`5U217 zau#=V@k9p?&~l(@ChYK28)ByaJ|KUt z;Fcu^BRI7RZU@#>T;^r`1@_paS-`KZ|I+z4*9zZmx*X^UneHga-rkTZN>u-MrkV14 z8+j`Pe(MFeMAV>9qM_1pGossbwXUM&SY5e02`lbRd*ajc2L~!oZu311l9h?i8pED+ zUk_}Y9w306<{&MZIww~bbnZBscF;|6-R)o8sv$@DK4Qkw)yshJV$Bv{VC|zf9NXTZuZV=5&LWKq`T5~BYG~9N|TfF zy_zQL*?kF$of_w}K}_5Hl4*=c?dc1|CBa|4OgsA`xr47Zr2St2P~pG-@i>Pj93d1M7ES8feF4fDxRbCc0P0d^zI zC9#>sMx$-Zpfl-i&bjFE&iq?~;T*Xab>mQp|G5nx3MC_=e>>Hyk;c3((&%XRND?2u z;I*#a@hg9Y5!j3qFuBFZnAp@F9}hd1oiOJ5XXieA=$}0g;sTuOer)}RHB*0-$2tDe z{Vf`OP(3^)716MkZ*iX=JOafWdJ4Jr_lpA1?HMg}WN!;LZTR?!uK0IO1yR4V^edui z@B&VZTHmFMx`8zr>D2d9{=!CjRH76-4ZdW7L-NB|L1*QL88w8s;e?<^%mo!Z-5Y$v ze5$gm?~>uB2)dq7(bET@bR!`29qTuO9Q5RVjxEBx^XPBt%rv#Ef|}KD6&5kq44c$j zl<%qeFxI5hcBcj(J&Fla2`GpPbIly@dv*@i8Q$eRWymnUkcf+o_dFAVf582$7JpbR z>mb|R2EotSxmVMQ9Kw=18yHUOQj4pzMtAclFcppNp4aI*^rqw zz1252zl*oY(Qc}5QYiN9>^h_D=u`ANGkb99%9jyR>TDPR;RwaCz(2Y6d%%^HiSAC^ ztFGO}<+$OZw&tpKxUzCdd#{0k(*F127~XQ9=?J1zDj8N$0aY9gDySrx;w^;++d>OC z-;e5I#UM#eP$^w>752Ak@@WCzdGpIRf7&1(n^m4D#&2iOr0iJMKYT$-Cp*2Tsmb)S zX_~~IC40%DeX`_Mg=x3;)=-ns)okxp%{m+l*+&F6`A`MLzCaF9LESvo+jU@PI>i~( zoJ@WXkKY8f;iRRF=wI%&yKQUy42b{o6mG~Xxg3i9m9$E4JbydH=YhsH$U!sJsj+oe zY8u!}7k&9M;=%kI&wX%;3`uFusIdG`#DdD~kj6x^Ip$zEtYWbrU3`E1f%FUAtvOFs zK(z4xzaVzXC7{sq+u^`}`R=HChMku#4Cm$Udx(8v6;qmD>V=t<&J9mUIBmWg<_fuM zk$zt|JpgS@Iu88$zl>q`Eo?%!oC22RMU=2=oFOD9)Y@N8+&B0TD`AxwgS+F2MAuH` zA8&CP9-_ET6GS+^qeU;cR4?>)FBhVJL|GIETCz zVVigs@=o8yvo~?ZeXK{w4Y$oJZNRCF_51kaoe~Y0ACxu^FXH+AcdK%!m4v`<)dTev zowbyM0?B5Z_S5}V2y6;^AL`cPnh~&jQ2VW==bH-_kjmlFK6|2zRShJzh^ykPLV2;s zU)3|06ZQK-+wXLmGG};u%(A_#Z|a559rYL9UO@wnn^wg=K~LG&TrZRaLKPf;{d#=~ zilwjR2vG4`pblNH@Sv0&$`!e=F-ghvk7zY#C%??HZTLQf5GE(`pG-<8hx37u8rof? z*$7Okxfhi2Kr#h;duHAm*wb*tF(t{ws>N--*&xCVj@UEG*IhUVCH`qp(Fhmm_kZTB}X^_pJSuZDCuT4 zfIopk8gPP2bg9bsJy+IpH8?D$b+{dGyv?^Px`D}^scLYA>SlG0?KNI)>|d-)YZho=S|IdiV1Q@3gRuAxx$_mF;3p=3b0YeUB$d&o=YgBmAQ${q zP+rV+XI~Hbv+H%{>!n@8?~61W?1gDR!(M|J!`|l7Y&x6d@KeCT0THcoIPgW1XOKyq zZTDkyM}Iqxdk9cDhX)-qYi?Z!ZI*qx?{7fNvzI+hIAv?cFxv3sbz+p((l*!|Vq}}h zd!!Mp#Hd~e4l4C*^Wd1bN?+oi3=283q*)OYS{TxL)@w?GRByA24t?}2o!?naUr5WVS&z5*J+ zdp(KzhMR#J^WPRlo8+{`>R>mHkXh`0T62kM?tXDEp;C42WBAR#UG2Awdkt#Z03M){ za)r-i*Rg~V3l=C@rGprt zW}wH?%~?8B<2ZIH1^!#u;7Kh)m3tdZ#u>nQ$7lJJF0O?Pwo~8E2+B=*SOGZAjh7C7 z{{fT$?`VCoLOtcX#py1vY_-x>`x(sh5KK`RW+$xq5y*1KKU3!|>5xqW+bJ*7$sDsJ z9jE!+{{o=BYEZq|Ho{}f$%pn;?_qgZ00uKV z8LKVb@TWMr&&`s``g%7{Xn^|%P!!$w;=#iCp4CotDEdo=4GhTENQOPDZegA6=DlOQ z_`G}}1JTFiE-VT`kY6lbW@w=*+=6hRNVCszwVWp`xGw=1#H zK5hE$nSRRjZ1q`p!m5KoMFwRhHpi){ct%q2Qr?EibdxjC8yfbrntr!^f?67SHf?R)P8HFBe=pgOQi- znCwp)8vOk9!O+1uoroy~_h24gZbt**(2yeq{VP`)`fqV#Xrn$I;|oM$zf18do4b+C z1)lgswE}4z=@-9euK@l&Eg#w*fKbdXp2FuHaV)KJL>J~~!tKimVm$IMLAOBOlWo6h zE?)?;gwQWJ;2PoX<8y3ox^7`Qz}TQn-dnWY$$7QcyC1Ju-SW}VeQCvI@z{*`DUhFt zTW8;=iAlI=Ae!+_<>N~NmA^WA+;dhZ?pZtdC)IcvwC0-mam;(rbfn}q*dexU!c%>Kok8hvJ?v=6bkc&y{Dz@Y9q8$(!6b*&6!ERF#$0s$cIntO(vDyNj1#wh&WMs>JwFz9HY%CdI<>OR%m+d|En1{9h5jEM=!zWiu8^04WZbIipa z(;}-4Ss8|2#1hodfOW;yl6!}+NOgy_q`^4HxT=A3)xSh65$r|%6Zqm|ml*L=)7`!A zKe{ORi|#kj3Y0b~wD&daUG!;cxq!m4^RbkBjXy{E%g2v4wqXgb%!Y*1LQZxCRUTgB zgLNgi(bU19s2Hf@@hZ$*DSm{Newu)bh6G087?7b_~KKvlliG0n2l?8QbcirTEzG2&q^(edVOP%Pc1tZAT879wsehM30Pg`ZAJ3IFH-Yn2C99Z zU(8XC#~CQ`G*WPpes(cc1AmU}^51T}M{HS<$R%)hN@UdzvHEOpkRFS+0-|R0l?p<= zxnGalv9U^guBC_B(EK;8%Dquzqou1?N)_Xa)hhiHyvC0DBMpZT_N5MPpIaLlJNMEw z2K!8I0)@?W`gEtplsT$rVkK)Nqloflq_1?Qm`cI#=bTYdMlS~xR}Iv5vNpy0+*x91 zF41GT89cQ=aL9~c;`F4nOn;)|QmL4C-m%?d??cp-%2qoP5`BP+DIR~?u)CxBD2_aD z!uEn%8^u{o`AFz(3^)Owjd5G@X(lV@#G1`k8^>T59}u)tho&Cq8LU=f5~`&bZvote zJugfJ72y7_u&^Nym30L{v z>NAJchR+i^?D`1HCFPT&X_pNv!K*`}}SXG4^ zpdtTXIeEhY5<$m_`BDz&oUc-Px=-8vkBCNEL<;Pzw*hN9QFOpK$OdOH@Y zY@71vdcj3O)LV-giqn|YG5gXhmg-io-r?9q{ckEdI~JPUlq_*_$C1cy>&dF>OY#59{Llj)g__`D&fI<+P4S(_?`9qA)oubQ30 z6v|?KAivt!<{r;&dSJpcoULq0tS%ulPme{%mWsHoFYj5#Z9aex!{l~KIr8)>_A}}< z1<<}^vJL4lbV8N)O;gCsAN>b2|Mf>^PKB#)2~LA$g**|BH1Y#CxnYAd41@!6OOhM{M0Yx2M9rc~;{Q$Rx8|{uV)AfWI;t2Li0r!a{Ki&;Jjz<%{73RE&MOJZZ@^q zmQT@`7(ylf=qRiuy~tO_<21ypn?)MC^f#%cHAuUayLZWR;yp0~cltXQoOzVl{YP-p@;px0_?b ztoBcykKmHR#z&rkh|FY!;X+Tw} za-k~6RFd(dgM3{@X@TlHyFLkuD11~HR7Q{%y7G=RHeD~BeTU}?I;fV+s+&razAs{K z6L^}>ZVnIH3)~uf#*{key+}6CdMTEsUPO5hsZ(KQ_K0+Bi99db{hi(g)RIvRNv6aCsNy@f0n8S}o(MlG_LJ(@F1$ zWd*0a+7wle9HR26?TO^sC`;+sc@OG@_$gNPK?$w`HQ<2|p!f2|U4UzzDc zAUK)=2d%?IXeKc5R(aR_B3J4_yY|xEGC7Y2#@g8|(x0x~+v5?guB%CzJb^OHD}-#K z$lQZsMR>q$R%qfSzX;-5e{ywJ`#kZ|&tpjOR2sj{-61t&TjV9Froe5nROKbCRQ=q6 z#OE+AX1zZ-Li=;mljXiP?EXC$;k+a7iOqNs)Jppy*ag7`DW!_*wHpjJ;IP0g{Ln{N z?k+lgbreY>m}aRl7m#WI)ZdN}VH3I{z-ZhrGjD>jM_56OwtI&X4JoRcU5LQkM|&Sk zzI{Jq52>&{M$#*#_C|o?)j(q(GuMpTywPd4n8*CBv9fX2RnN^IiGx~Ji=2>19VIb8lL&N6Tv{;5{|5%(SOKtw`7fD*G7`QT~ zu-(w^nt8KZerSzR6|S$oMY(rn!n99*mY4~5O1ugXU@V7WNdp^N`6()>~Xpv`bb8sHgX=@-VxzSR-{=*PAM)XiMb;gcLAZFUGzT+ zQRX(l*#DLvf|?z_=WA}k`{>34Xb9_Ovk8THcCCkvc;bu2c-yD^{Rvqh&&$RtKh7=p zU&wu^sCZ4C`PK3g4r$+h=Rh-iDJdQZO8nsq;;sS#@=Nt_8X7lnHgq?`@5a=rf>)Bk zC{M}+H;QnV`Ak{iazG2dv$5s3#d-A;y7$zTHBT3j>N5HJU3~fo9afw%Hl3*&N_XGo zrFp7#;2W5Q`Z-J80sBiYB89m%nuYwVTTa|0 zo;5%OzM61YUu{Fsik;RbuiwtI#igpMH%8|GZ{v>pL|eX?zXA}mjSjCnutdUYY! zVOGsJuFn=dWz#WBR-jE=>V3Fyx~o>4^@_Y7hpcrMcLJSd0lGA6G?gE7f1r+f#)_nx zGSn@E?`oTg+SJefY90`r^nuRtJMc}-D^mD)OrQD`$U=gt`HVU<+MIe~;-T+FU75V#^sA~fxh#L?imPGh zy6&CPKZW6ZQ z%8}ABx-S5oW5?ccF&jbjc(U;^a?xP&suyTJkFOSEj>sDeRCA4tJ>y5-u2_BRyUl`p z_}UrU0B+?KyjG^6<_jh-`mLD-(2>b`5mVOTaSw>ExlWe_VRUmx-qz+|Dwn(e%Z+8i$MKVX z>EKWyXCXy|a*!Hoqg2r>dFHa)fsR;QwBjc^Wp+H)Z0EV4`6w#mQM9Uf^KcsuVYA{V zx9>c&E}(JiG=o|t?oj9yopQ19#T)Px?;*k`C1qnwxel)3h^8>@`SvasSvn)k_Gmx1 z0TtVJFJOSh#<=>dXJa3NHl4kqv$tC90VbB7pl~RWiJ9%aM^ewJ=IWuH6LnF;Q2vVOYvQKme(n&WQ`UX z&lXEpVKU3*7kf}D@ffNWuj(VNFc1bgDuFz&F#l9~bX}ZUFVvBW-8ylJ_TE0OCL{+v zEme*oE>GuKHu*@yC_%5?NH+-)-s|`rOrcy!yE(e@DbtsV{NjZ?z@Y3bY#*L93Jq`I z^?D3(n09zfj~Oevp6oslltzyUQUdAbKMPcr*njE!=;ACfiL5crHx`iRL`u{tqL!47 zGV5PTl(xhAw%`o@GZM!KYxGMnnN zUl)0&dXI%UT}S(e1En$YB`v-2!CdH0h$17Wf)?lK@|!^VMWF5-(Pq&%*T<~9H(hRM z7*+5}oAD?h&9fe!6A0(6(|eFRck5n`2I9;6ouA}@Rw{X+i@LfhQto6lfKUa+(7S)Q z^Ol)(;%6_*NtxD|IuQr1bUm-a;UIUByLW6hFA{^^ zVANX{*;|xz0z@=;fVXRQ-9Z$AY^F#Tr)!G|s^OEEt?^%J{IsFd0Y(hDAa}l5+yCY4 zI{TX5hS)@uhuCTmU5j3o{D@cht%A9hJX`vW>?*=CSg0fNX#LomSFQ_ zl^A)^TuAAQP;xC_K&cdWUy2@4X5ZU`l#k`c3wd365h8GIdZ`~1hcoDlfAl8PMw!-v zm)nzQ<2n~pz&Yy%(&cM-+X!xD%DYhG0;!lnZWyzkxiVT>fljd7XhHp$st5^jgLK?` z0O~+}qi}p}2-0T^=p;FnZ{qW1i1N{tN1K4z2Hvbkii&8?pZ6cTg8v){S}4ICrZsp< zJ+_3~R8c+>xX4pl`f1p#bD;~V$Z~n-$xag$M|BG*%F}{!!}kW}a#nJPrA>#mfZR$` zN?M;yQ|Yp+2nq`E4Y@a-RY|=+ZJWLH3_H2}AeVh6WramI7?3idEVWFgD7=YENep76 zG%|@K^j0^T+nv>`-EsDVmxW6me1We$#;}fVy>tOrKUj*bWY({bdB9_zwXFhX1`(7~ z@hnZZ|5_uheEr7ITmTet=zPCfjvPP?4#vxA>1?9pLF~w_5$ErW%A1LG-vkDWUY;ge z=6^}V=`-H|UdXn3&xplZn7MuU#4cS=e8Wtz+m(J$fbB;YGR5M$_=!u4IeBOE%{v9y zYW#)YAIytxM}M_jU}29JTDZm7`OWix%``Ti=glOf&lg5M*}JYwxm@{$rSdFYv%AL$ zpt&V(p4~?dhuFR;X97>5&kH1!{U-TH+`kP52eE$Bf0^~U{^)1&_vx&GIlH;HEx z0P$MOdrbD?PHs(~lv*=K)s!O=0Cl#8ZSElh%JgdRtwO`AtTq>Xf#%XvcD9%9LiF7OW-7UA)z zuWDvkmv0qO4KOf*bnYF^M|sS6AW@*HfM|Z93fDkSd+ENT(|zJsWpZ-Y{pF=UTvy6n z%@k3&P`KhAyZG_o(~|t`$dZ({FpTq@%Zr#iP<=rRQFRr5(jX^?>IuzA$=y(?{u2yv z!QV_iQHFxTR}R1r39D@I4d`G;6!+N$vIXq>-uhxfJM$b>uJYLoQ zT35m#|1#W;UFhoT8pE)1P%OP{qh4L^E8wIe;H1~VkSMdeEA`-9`RdCf%3}U##eDDF z`!Z6}IZWreg|5B8ggC9*MsVrL>;US>d_UOCTHM^xOvEi`%}3qab1t{{6{o#2h6`@+ z(pDs#R~Bb3``{EP8=*M7_}3Xh{YW8CTgAC~g$%buW2NIqK_v<$In`+5Vf5$es4{s^$+|M$yu167(I~ms?Y4kx8NRzke_X2Gur? z0N3_K5F1?nztswdrUTa5WJ+q^Um8G zNOS0p(#sL~YnaRJVcMR$-1hO`VV_K!1%|RoA8^F`3Y!K3{_gVB_!XojzGsnt^OKv{ zCL2r$`Y79^_hx=)@P)b=m1<;y#TfdCz`AWuHYV94l4;v6V91N64{#SX^7m&%`xqSq+H$yigEpG7!-&=R7e2YEywi+_1@sGrj=s~-b2|9Mz6Qu%rYh?7CITejrvQly zc0R=F^HjzVCO>ZGh~GLXZta-Btk;X$jvH5cRWA=LQjy$@Ek>9* zk9FhqID0UwlJKX5u2(W}j*g|8$|!yXqx@MguO@>C&6qXYFF+vyPJW_pAFia`kHgI= z_;J2$z0)}Dd?;fKcHuU`DWyj5gY82C#2v^jHtyBLpk*%qh3MtO_$+2Qg-HxZ9_UZv zD_bm^FUNE@4736s%v%+d*OgDtuv`~tT_Z`XJ9zkcFILUwxKmNy1NQmK2*mPzvQp34 zX_n9ZIL~SA(NYQP-7@Zgu+f_B$FY;&GD+r6deMWwj~385s0{NuR5X3MK%PEbQ22i9 z9e~~f+~2k@xx%ej^Vn`xJJW|P7wxJ1Q%rXO%2&eh*z|Q>*}**w$FqLVz)U4ovJ{O^ zKzP&0gKetuj4@MJm~q7%B)_mH{HK;o?vJRsEg;hhFw|2>H-^vQ7JyKjt_z?im)Ha~t=W^G=g#Dm!; zV{KmhrwlM1yoq|}x6ixT^xlkffzWP0y9}3o8SbDhp2H=uyXSR}Zz;>Ua(n`35j9^q zw%Q@#4P{Y3hbw3iIN#&gFX3G5i@p5bw#(a8Fr=sw)!#$;FXi_*jmk8Y4-FyePP$+y zE5iO#E__Gi2NrCvGbb0%Wq|ad0@Mkd3^@E#+|q%RPX@@(ro5^yGY0aO>iyvYOzJbI zP-bI*>#?uVg-p_&jFkz!!&kW6?Tr|n1--Y`ibj27#SyOV-=0^d{n-&?X^O+lCul}> z?qvTh(89`WmYJ6PQTpaL`h}yAL zUmhsK_b|lfKS~#b^7}{fWGD!5X-Xo<=~&py34h@X>ga%H1QGcqoAktxS(n*i3*;_cJ@`->Ty78Jk zko zg8s%n%TudPh?LsPjKXj|W&_GH-hG99B$;(6C_jh!vu%WzYU|U-#t0wr*E1jHJ}P#J zb3ira?W2u>btPO`g|{UgW@ks?aj|Wkg`rbE>izMlIaV>$6`d%m*ZkuK_Ic8gu$j9R z_*dXAhA2Tp)>f+W(xKt!E`KS~H%@hX3eR0j#g-Jv37TR|!Wn#Qqv4v;)vc8JfSBIP zE1l5`4Ot)0+s&wGK8csuy?6rD#>buAsUhvs63^TlNX<+%OT^3C%gRIEU+l*UVybL# z0WmzQ-BETAYeFqV&caSwhu^!ox;<`BS|KCr+k&CvGbT4xCn0Wok#h$)j@1ze9f4qfQwad}iShQX_9cX|(QL=ZAXpH@ zMmb|{IEE@YJBp_X`TvalQjPaCsN*XGbYP#Ui#*C!QEpLxEeOlA&#;I>m(Vh2qS&aE z=Z?ASL9+G&CB(7Mf(7NSzLm~q+?HMa3!}=IFA176R!?=uO;EA1gF@-OUU;R@4=y<4!l=#!ZAk zW8MjU6hRHq&FcxdjPHJum#F~l-EA*0zhIFVLZ(*?{Ej;Ba=1G0pstbKovhXZv}bymw*t6GqFrH zL8UW=9wpqK85Up^;VYcfDTke@nvs8)(F@uhx|pP%8dIBErvK$Uue#%=AMtce$A#i$sbN+tW8)#bIJHA3uw5aag5HO*rbxdSG{@V zE<#=PeG4qQwxv@|qnT3DM_KzPQY+m$%pP|4({sf0k*osaS&@5;_$q-E)7PX3wVh+s zkP9KdFyjSWCnYo*;nM?#HI1w4Lo@uvI!oZ4gi4Mu-8xal{Nlc7V*^9xiC)i#aQ!Z+ zkT_FzRgSPY@-SWp=}NLzGv$VlB8K+8icLRE2at}@XyKY2Zt-_k%F#uk^tQjWJVvzb zI56z@Z-VkBhwS^W)AGdHbD~{A2`!{FWD6R~JvS{=L+FPn~?Rhe*naa+NwB8AtP*oPzQqhmKQv)m2 zTN9ru&+ogxS$=3a<{L)Ea&6@^yTgtG)shC)o?%u5A^TIo)w^oxKpL zSxl=*CX`+-TN)>YjE;_sB#GFS1; z_0v=ztSU#-R|V8(E2=Fo;fwwQ6zP+{rB$8L-(nqM4ge)rL%x;oYjff#Lh z@0p)Z%UziNQk7YLwd;VWp2yIAUFMld#Y6Ueqb`#|`ksgVIWnfhG?=A5Ej$XcIuW`P z&7K2y!iI)U)8S2XRc2Gn{96n!4vH>)c+c)>>L(8FpM24v^W%Qs zc;JVN3;GWtb~XGT7%)%T@@1Du-ivz6G<{_`WJZyGiF4|D;${Dz7wCp34Pye*Sxb ziU(wtudac{Eoy;JUR@d_Kn%Lf(R%&7$zXn(M>RQ-0V0UCL>^9{khHDFw3gh)o?3?H z6on>1Ax^=Xy(48wNfFaNk0d|NV}>)0Q5(}TEfnW>^@v^EDY8m@#8=8{n~|jIqQIcaj_@PHh?v2U?oN*uDn`wp^Ilcn~sRYEx6hHs! zu8c3Cn)UXQ1dk)_c}_Om&QEeQ-t4P7ccLi`KJx*A`nBs`6o0YI^g$IhK;#t{nwg0T z+n-HEgXZJes|AUP@iw6$D0w-h%fvab=A=VwsoEYfdLaUPvd_+rk6Z27z&%2hD7)^( zaDgR{k?>?Sm-ypK){ayc6Gi>kcMmvK=Q%w3dLJn@?K56EpvVI~%IU5;m*QOI6=NdT z1Af0*Hvzz_gAD@{PR2{hUi|xf>&!0Pp8%QMw0Pv&=8ok0l908ORSndWwD^@YU2J|{F0CtdQ+VphG%eJZ6cD7(ThYmgZ1VEI(sTS@B^Gl|R zm8^oY7D*WZ1O0Q9D506L%4*ewxhYH46Bn2%Z!OhoX!2hD(`i&^_OY-?X>l>Hp2nCD zvsFy6Q=%U8&q}TiT1`Vq>D35YTNkN~8gE^e&=3Oh^z)MSlVwQRnFT&);(|$2=I&OZ z(7*X$AC>(Q^1n9G zn%1q!-fUo|97y&eP{EE5Tl$%dCkZ8=fq`Ogy{e83+pk7;l7Jc%wkFq93)>&-YUf`S z>><~Pt$Mfu+(|9q8#CG)Yu?s260WcOBk@Gb*_3mB%jtY$sygE6H3rX2UIDd>(mg@529P%g zLnd5|pXCHu$O4o6x6WH}7bYuabWLt*06jY>Hvu+%4S9&i26S*VFeLk`$m3 zX^4&Xt!99|{@uF)m>fuZy_(YD)t{#y#$G!=7eAlQC~=OUyCY_9SH{E4%!>1Ny6>K0 z9aAijhRDx&(*uKt%E)t+^G^NVhy@2uSILKkea}+(&>bZ;A8f#W6EWI;ebkco9q~(U zPfZ%260H2|HP*PgyBH&7U#7T~Q2nliWSCs4KjNO-N?IXc7u-t*^ zvwtX#R8nf^r)FXo7M~O*#*2X!E=`~oIMy#i-wn6HM?C(2YgUB$wlVh>%MV~R;p>CF z24FXu&r!vek40@$0|;V+E+rk9SL9z)!VIWwH^oF|F1MEI;!1U`!dOa3tx373aD4-k zD<0Gp(_7t1b!sIMhIKKQe0JS=ASueo_yiQ2#sFVz^nc58>a`OnGUH4islJk$_gek6 z=j6qmsmYf{_hZWUh29Mk=eNqtfOkCyTJSs>_-I$cY;Hgeyln9;CRTG%;<8h@!dTq4 z*C-WKs~s_<>ngPCjJ_alorYAi!j!+T;cTF+)d1ozudU;R))0JMl(J=EXM9t5O3tX) zCiQq4x18Y|Iq1D=hm^wP6)T@lX4R`N592#FIST|5(=K+FOz1+9qN6}fewAN7*>fyW zti7P^*^>sJyN@A;Cs>97QZS48WjwCSUeLY|$(t%8Z5-Z@2BP>9H zK1X#*j9Wa=2M`^R(0J|0FfDqLlXiCar#2(p*C-uhx7v^4p=P~{(k_sfuJFJ}6Kr(Z z6hXyw=_L&Vh{G90T@wqLskTmM_eAiWrWh-iP!D*(TtPkUD(0ol{@pfNABU~G>i#F$ z<9DG6#<4h09XBhlR-8~lLEwEz$ik!+r6Fmu(Saely~Am)7>*hGmFUOSJlm+8h_jWd zv`MyqWR|Avs5rGRSB5n#6JC&yVA0oPE5P~ORvJI35(_rWg>|6o>eNV!!OjlU$?Nic zk>egl)*^O1jj&gwXdA=K27;!(=83wa@zgGD%k)g%mv$L~EqWya^80SdWxZv3WI2X3 z4@SG31y!F3o!jC1x>NEbK=m#btbU$xl`!yVTAY(hj9=aDs|vEi%0SL;VaQO{gUlK+ z!0Xeuy=D-)UI=Yk`pQ~|_6@FWl-#mj3V`j`ts0i-TMfPiCz#+9p8)wspxwt?bs+E* zxM9m`1hoO$rkM>E#sPiLcau>qjJ(XR9%I*}E~}XaPiX~2w6RzS0p@!Q7^Ms{xkRVI z!8)Q%!(yp{LoAI7vOus0$L+6i>bsAQ*$MHn{H@}-Z5894EU~wzh6UugU&ZFp(Wu*2 zt(E24L1kf$jno>BMWq)KpBzQv4t0U{hTX zXJ68MmXW36ci{;BzYj;yx)reEIgPNYZhl{+cMaOR78F{-|4%V*Km=VXA z)$R<@Ob*pDcHIY^1+9^jho_56ke)`dWVu`-F@xT=k&cQAlk-Zi4T#kPyuayIc+;$m zD1ZG4XdzNtul&DeNb{xx&XdIZ-VwQv0X@t1D48}dC1sm2C}aWhLq(bU#)6F*a5jAa zE|}fCCGzuy$!pB1N?Q4mblL`$bzHG^NxPtoy*yzX&mljKu2lD_#w`hMKj;gruSteB zd~AWGHkLr{h}udWRif`!{#t4Lf2@6XT$9yKPkNs%NyY-74H?*gf@EZUSKy2$q<=8xvq`<7MBELi|hpe(`J)Q-04&z@S` zTPpqnO$*Q)32Vh#&cBkEK@xC1+0+k~&RFgCoBva&{gp6%t09o$`xaI>jq!Sd8o4&i z>7NP4Chgub@ah%LbPr#yUO${_kMcu`YK#0`NAHs>w}htlO1r6zjoA*>(}N$%;V z5#4Py9_+QU=|YNKF@3mBypbUjg?026Wkyyjr1-cUcPlcg=nXy$XLPLol z`{1Tq6i~VYa_9oWFHhy0j$%bhyUwolz3F^XTZX{rYpiYn1uQl~tP8u;`j^`@6@9&E zvN;2$6Rs|GrIs$k6qH9|)92|XlJ(33a^0SerXl;l3wA55ech{6UMgX;P7-fghns8| zCa1G|Ep4F1wPuhyv81YZ-Z0@lIXwC$F3^{;a`~lCX4oWMb2O3 z$*0k{9Yz-0jKTIm4@5KkIJMxjUlM9WruUf zx#D?C~rh$Ih90u zYKEe6h^8w;pp!C=YAkvJ68wsg=o!-vV!FN-&&h7R9OK$Q<{6}*xOTT-bn?y?N;~)XFW#$~{w%NB(0J2eJo=o(Hz5jQ7c$LxXgCC&i8`d&hd%TGR@=lTr5qKycU2k)AWeQdv# zjVSP0fW%vY5a7b*gOENGq&@0B9joC6j_!@8M{yRT=36aM%@!;g)=%qarR_;tJo zRZ%7opUl>tD))1Db2?DL2D%x&jckg6Ec_3(BBCOifNa{YyZ5PKquB>*=(!t-K;40y9=6l z?}GXoPKq6vdTW@bJh*dzW4Q(3f=yU)>jk0sH)5h@OXOxdL8yf<*>&_eKNZ0${>zanD!nK)5H#J44Bp+wR9P}3?S!;QY)Z@NUpU8^RR+TyE|WZCl6XZ!2d6pRjVWZsrD z!hG9H6ip-@QmC_UwR}6$g$~E3T`)WJqzq8uIU}?!CO@^;e$CY(G5H_rliPO${337l zSHUolu0wNXKc}NW_3#%gp?lbgy}58I)IPYZdw`wY8`eRn)kaGeVmEP+FcS4Raw~R4 zi{3hbKg|Y(pKSw?5hlW-0$1zFs*Vh0O-$s92xcz03=~^2q!K`jJ1#CyhuXa|6bfNw zf475WIj*M50=;(oQ@)3ix95_p(td5VzRPv%hjoB02t5Qv^ll^osoIoLF^3nj)Gh?+ z(zkPAd$$FsZ@Hh*4*07QU)ZGHZ()%!!{d7CbT2-j#~wc;OYaK9`$ zF9>9s*OUPHK6@9j;|^dxlf}nQX%COdI1dz}DIICtN579si;Bkg2}k8Vqn6uLo5$3>_jFqf z@P_|Etkp3eyWa<`>L91Bzqrg{2TNx3)bJF&PApmznO9I>zJ|}tNSPlfAv_Md z`}II=Up1Gwk9w~ApqrUBI;SRE&}(vh9>FnDp`k9O8n2P^hIden9wq5izo}it?kVe ziFM9eF5eUf{igG623XYEU-8Dx&ed*O*>pMT*04ncI{C+)v8pl=`OwEA|8$KdZ!&;! z&p_$aM&8P()cOIKBVY+>eA#f3Q`N^F>>r7lJ!d%4m3mZ;RCLxpG5CEE@%r(Lg}RC7 zrcoU4coUD-2!D1wsNKQ{zS?{LJ;FdB0|p^+`;Tytgs<0FNMMUT8^_%lysbE{p`u($Ru3BUA5TDD9V$7GT8J!8sj>?U6( zhrZ&}s)Om2gy*vS7mY6d8RzSNNc!DzDk$|4Fs)ZbN)2@5s7xHvOx(0M87tNKrCa!^ zSrW%aUBUJe z(QQ3yGs9i+Y0=(EjmN0rwvX*C$qNs1M;&OLdy*n0_a3|0%dVXj#)T`4=}X#wzOWH- z{7W9Kj);2Q#9r>hexsZv$rFY76Qu0DusCTN&FdmyW!sjh=$Uizg>Y)J$rao2;P*5m z-uouH(!iEp>UheV3~eE_wUBWiuxSIEuCle%zpK#1xT)VgBmrDHbUhWc_Fns+%LpqLZH3>aZIO97HLah;@V}DkN;+3gR1~ zzX$riA}5&7vfwgf_!d5byG{7Op<~(Q3ezL+al9W>M{Dro0G;(I(tCyw=9RlA-RwBj zz%6G-%kxs38#-)DU$q?fggiS6msqbz*Z2nnqWgWD8b$;n9OK`eUC7#-KS+j4 zR*mNA9imlssB)nPhMEc&zb4qUia96^~aPcs12i!!VnL=Od9$1zT z6~6(g-=|RJ;Ci*bB6&4+!K8%kaUWjV$BZ$lVwuklfyN(7WXvm_8fH-N*aaVvEcSCh==z1 z7_8e7zzDqmOy*zK0zLC^zgNO*oh6Hh(gLiz!)9*U24zHjUqSEvEBgeQ8d=c|-Pse@ zFljLnQxzfiUmfm`<4txvtb6eHbzIq7R4W#@JEH%FYF9Hp4pvgPEEPE+ReTGww3z<$ z$UQl>#Nu|%TkqbiR&O~+P7oOwkDo52+XLY`bc~>1Bpy?{D#JCuq2^ncE_>Tn-@D{x zOS4U8>-Y7+vMw;?y-H`hq`g5EH5Y*X|pbC0O&yp1=9Dx=I~v8uUmq z)Yd*c2;`sf2Qji7nHOizg4-gqbvY9$GU&UMX+Ls8F zCx*YNrP_y)2;>*KZp|tm*UVZVIpFfSF&nehB?p70f~MOW$v7@+IeUwTz(;MrR{4?n zBR|pLPn-tcN=#3g`-O$lcejShg?#Z(!vl}*k2~=Ias@^iAN~de9Jh*U-8S1N$KyUe zc@wc=#VycmJk)3Fm77hoL9$sA1W(2MHXWx6__L18MGEY#5rcV|u@x{QBN4O- zCpA_OO{Zmrlk#b*<2UCr97T&@uwwA=RE?5$_kRW0%MdK9ZAEl$2ML5j{hxS~&pOlu zKPy_>_D1&L$(_>>tv@_h!fw&Y2JYxT7=IBo*|w%9rA2p&sjWZqKw#4~S-)xZqRHZT z%C42Z!J_rL$wVE#9*ts7s2y~5Gy7#kwq#K#3)kRq#D zT$WD4zkWLJ3q<@$px5(N;g*q=*pJ7|h*Eh!vJl2r^p7Z&4ZI0gMx4sqkw6^um0u&L zpFU^*?+1V;xa7L#w#D%82|nkm<=-y9EE>>4yVBRvPqYYTo0GV%EL|8Lx>NoS+r9@H zmCs3qih?Z^o!y0W#$1fj(oqCZ&N+N_S-4l@#N=&1VSf0Gz298G=de6@uFD!H^I0ZO0dW#po2~b)0#k6p z0>R?=$*Q}F${|vA$9Wh_DJ%;ppS^odtoezy|9=rmdDMN5zkfm*KxDA61OK`7=SM4r z*4daj)Y}hcsIf=Jq*@C!mG?&WI@dp1?j(((lqc z&|=(GxoLI6N|q5;(EtEhIdaV?88ImLUx3*yR}XNm4nnaE$VQ<20$A*JT<-d-5B(dO z$vH4yWt2sv=8W2&4vrwqk8B;|!q@5t>elrGRt zkwq9aE~shVX={qvz?Mj_l{zv(F~e;dhLIsmrWfo0Nml!!j@1`t4Nt z3Zg4_RX13X?JI|9i;W@QJbHXKz2hnp(|@HiuJ(-TH9vlVxieZSMOy1v5lL~1i(4K^ z+qqy0g^Qc>T0hZ9tg&xr{eZPjXsk-2auv|hD8Nse3YgwGjL9n%JFMWiQA^IZw#W`O zd26}JQV?}*PHfek)}p5rcaJb|w=X-Kp}&w9_M{W6pSe-8658Sa$yxuG_6@GxpKv~uQ+39a%+&;m-rPw6fFlpYpMi5$`cuuEz$4jq)*Oc=_YvIc^w(V6v zBRU%o3m4v%rLr^cHVDy5ftQyxJSRwte40PQp{ZFF&f~YXZ3VFjY0jRHzsHncSYie$ zHU~|){8Csl?TZ@_H&(H$$Z__ZysGFDPG)hlY?ZH1(p!8SF+2<9nkIdxi&BK z8lPlr&-?h)E?cP?%~gkF=1nFucxI$kz#Npdf>Uwc?9j&?SCzsjD7A)ogR?bQL5L#y zVJ5FePCPh_Q2Fy{2j7Ko`=3~(KeMAFYRcT(=JPl3du|sd#aowIO&rIPG3MarruCSk zi9U*~)%i{Xy}r$P!OCChuFsBucY}T?_F(RaP3E$CtJM2udx}Dvv&ZKKJhiu#dzw6Z zRZ~G%nsBWH@@-BL$v` zal|4d7lzm_1%w>-rJYdu8rS|-rg%6{uQ;!DSj#`GG-;gnz4j;l<6Rw>V>_X|*SNaN zf!rbD7~Zz>^oT07K8fH;{mHZ4hSHBey}Ti+QQGuCpv^Kn~W_d#WF7It@@a&h(IT0vXq!)2`+n1+VSb#gt&j;_b zKYW(9PrHWPmt>mSuVSp?<#s>BBgO3U@DYxr-a@Mh3Nf5#UDeIw7?6&BFzy;MSfJiGl~doi#jDLgS_b)B2pD(ow4kSFXJ-R%TR<9aoSF=XYovS8{fl* zK_)@ZD+^EB6Nw+!z4X-p2c)_G+ywz^pL4eg9GfinQSq;BC6g+R>CsYIV!Kk2`0RTA z6?lfgqsX1GHIeY;J5*0~#V+m}h^NZ-pjyBDg2QIg{NskxdMozi{PYlK6-MI8n{EaF z=b4c!-4jEI>+!x>6JJHgZgqKL(c}q`b76mnoP*QsWY2_|kcDWk&Y-f)s`3R@b)$ck;BqH_PNeogY|LaSVQ4nhd(IiFz0%^|YLyv7`Q|Bo z;PP=NZo4@hQl^s*nH;nt#<`>KQYZ7E&fwbCJj&1;JLM`>vhc=*eq}w{CN^qPqTl3} zExWaQ#}ZzWO@gRDawqPIq0N_SN$GX14kvoemJu!XRBCywBr)Yt87`NY;UTzyqsrigL$ugsUPm?+ot^l_Aj`NLebOyZlhsHjth#mWWz1$MLU>&p1rj&10 z^In#@8=)rW!|Z%sPnFxE{GYv9uHNeEAP==e_*%~?Ni}F7>bn!B&I{O&x&9+IfFVxa zrbW-rOWpgC^=-4?Kho!rXMYspfKRvkHwo(Z<7_tvk*~yMUobM1SvgZt+UdWG2^HF{fP zsIYUt1b5rHFmv?<+TV_$zQbgM$@Zf#Td^>I3YPJR6nSBhF01D39$N*ViAIyJ&wZX9 zFmq~_BXOmg`N!`*{Nl$~P|zLFh!~j&le#D-MRAFZaRe;%4L?24Pi*RlL%JKQW4_ZS zl-bk)yeBfv>1~dti;OPVLf;geA=S%%Qi4(P(~*5%lUfl|`jm_GcSMHW9xR~E!EeA| z1t816b_~DUre~z*>P3hbs#zx88zZ&*$fRjV3U9N`97Qr}ceja25c1u2t#tLdoaB=| z!TYl~^1EBxj{1LFI_&N93{&TAPQ9(4>fVhZ(}25z4@H%l%Qe{@_{mAM_A|z1CM8`x zm4NFH=Jjq(So1SkE9k0>OLU#e4KnO(23&gy$fkSxUPABT62(O@WfY!XwdS0C8|OMF zs&xrn@4srv@1vRjnjB`p=WSa+)zHy@_I4!4CNr_n*N}?WEC#h7spl+7pW+n8_L^{E zQHwp@kJ~T9P7zd5UNiVGT#%|nZ~OQ8mxVv8A)q+K4e~Y+2}KEhK6>Z6$@$S4$hp+7@t{m(dZ+yN5xoHpUhZ@O~D}G zYpN#-6+=Shk5~9cC(_G9#}@>J16yU%seY4|ufwFY=&wqM5g%Kd`&iz-5>0)#iQL0X z#h;vFXHBDm?BpeiI(V zCI`iObe=IWq-76G-xH*K!}j#EP=Sp5rAK@E53qyED^MB-3TodOtL-D7cyiu#yKMGL z3jCb``mG4_yKPjwoysx$&U7BNr}d~iDF7(-=ZeRx^Ovs-tUY*k-YnZzZ9t0o;3eW? zYRH>{#NiT4B-Yw@s=PyWZJ|Ks8H?A{MG~!^J4rkVml}B>H#4Vr^SM$WTphO(8_};k z0GwAoXCrYk#LMXe&ILp+vIxa^DBd+3k1^#jyvNUh-c;_hwW!^ac#Mv3>k~!sL3}z) zAH2*2&v_XgC=wQ|-KzHB`d2M+o0x}=g!=aa(-M{49csg7wV&J!sKG#x0@162rE*Z% zw}krZt%cxK|Z=gh2k{?&aKSpw#Ec6$YYS zaIwaDZA5II(xna+zr!e8;m7rMQ_d?lY{2>$yy(Mqh}q>;o0dm>oz`5U%$SQ^0Wo6? z*nQ2(#q=5l-Hv4{4Z8PpwgSv)+3BWoq!{{qTAc#s@s-auUXBT$_ zHk+E>RT@fCC9qu%?aO}5Ja1!t-?*76=kn2x>GF1Rn?1XRr^3Z_OVWf7mN+~1g1ka? zSqwS%T#QVVTEL4KHKZlB(A|(sTiH~alekrQ%t|`Uxj_u&qNi~ErJWt~br~-H7Gs}a zV@X1IbDCb$W^1~f#z3X1)I)j>mNy63qgg(SRMxL5s+fDPoQ6HQ3yy+BzfbYDhiKp0 zWAN@D2>(CLoFkk!>1Z{e)1k`2FFa)M5S5PD_utHii1qWK;xT_?q`O^<3wrlNzn(g= zma^W_oPW+jbil=coOv&$z?|Es)}6W37jPPT+aFCsl!c|}^yqy+Y+SdHxJ*omoY-_c zH0rx)rFVrs9NP3N8())eN~Yb%xzN(+Mnkz`_+cd-2h6G`9*q}z^X)qxcb^;vjDgHe zkYOAh!g;4kvG+b*7T>S#&wJ0<68-TZy#FHeM><#>BPcB(!8?FXzpmwo;GzHDCt)mM zCN&Zi1x`2{8+A#$D)nWBdlBi#L*K^KNty2ut7c^xZ+BSlV9L9EP>n=bt)HHFMxLV& z4=p~1Sn`NvU5G1%T*HHbJT~8HHuhi!cS*rgGHZu_XR~2$=318>zsK>Ftd?l@5~wBw zFoY=?S2&Zca7J8X9=;97&y2Oz=uw^`jkv6FP;-|J1DY6BfZ2!gC{~uOF4XkX79W@4 zk4I=#4Io**F{ofS6+%xW$6f69YFwJ$R zqNoAV+Y6zA`QwhF6Ebcmlndc&N|~D*=i^W>tg2K8G=pOXfNh{eq2tl%lS|iYco#B; z_G|Zi9K|z?YmeP~+r&z2P<~_1U(*U0r1;T7RQSWdg&obigIh&eDP1>bDqCc6g6i~lOB`WsiwIGFH*X^YId@jHZ$#w)}{R^Cwe zn!H(YH|OTdAn2u>r>w{6xI5Z^F4kz&&z>L(GicaPRb(nsOZFQdDONv$YY`S_hoot>`*E=8y=zKU@^wqIqSA0%DU zbE4cZ{o_6iZ3ot2>A{~i8(UBRW5q>Y=0BG%pjsX%Y^*``u%8_B@9*X6OGiX5#C5+I z7%O5Rb)u$av`tO)n)$KF#%eTTrfikP}F zA1c|b&zJ2Zzoam7PU|*`QqL$Qx%J&#R0de0y~YC>jTHq{xs5+e9D}m^2{y_xeKr2| zLnLGgjcO;cr^UjY;TDg5PZ^dlndM8TR|L10bvi=O{%WQ2uMkU_L#n)3@5N8xfLdAp zEFu3NJW5D*-(NIgwqFYqr_TKBHphL$#j5yyvmeNY+-&lU?-va5Zi(tek0N3snvS>;%*Y;Yrr$c;qt+7@i(Q+Z7Ei{dL^{zr z<%PBw5>sj17iS#kmFONQ^avI4`t#C8m91sC>)W$6G8>3Z8clsbu$+u=PBp2WC|XF2gt zW|7I}AjO?B)|)Ye2SzcJM#G>s{fuvC+P{6VEe zegv_nyS;Y_oyGBj=@w)8s%A7ih3$s;1Jl&Av{CX2b2$5&hCtEyg7s_>?~6280Thjp zdbzZ(ckE}cFxniaip)Ny2KVR^<&CVG0$B!GkuSU;QG56mGe#V0*)|r~q~J>!IG&MxUZ@#f>M-<4_2NKst-=ky1VJx7Bm(4JXEq ze+9CW+b0DwEA4oaRuu!aD2rF`%fgo(0`YaprH^A^+v#2_kpVDrS(r*KN>fnQsUCT{BDNi|0W*$$J5iT zUu*(mvLcI)ka!PJb?WF85*Sl|)fb~mr$*^$*fn9V#g=2%^&aJj1!iJZT=2+x5@oUQ zAtv3rfVRHFy7P|3l$@hy40C%{jT5Z~NZ;FSr>4a*-j09uoadh_Jz#+6h@du7A zV?7pF&~^jbBQpO-rcWiM`$BhJx5o)V?GqyRlk%ek2PTxA<4*bNAr^tx>j^V1vV{+z z)l$pXMKRks4J_+beXyzM-c{25pfT3RM_g)T(!`2TGX2f6>JG!q_D3*$Q7DmJxcO_e zkD7ONza8eM1D}%@G-WKx7Zg#+p37%o*Ebu+l=1LmUiOIsbsE|a;^8ybSZ^{O<(G-^rKAZOh$9!~MoFtTV8)xtl=5*F&c@iU9-Bc{%xL4-lmv&c$x_u=6d4bnNKk`$ z5Zf4M4txj`ye9b|+Q5-bv!IXb*^Eb_*M4)W1#C%JtdB6iG?!K@Wnq~@38Jha?=s?~ zVX&+OM)oh*CplZ3oa^eyzEO&GW_H@hvIA`8N|^^;T&AG(gsJP1Loju$+vM`XegBo| z0rWh7?-In?Jc>Q*^M|q7CNkJWM9IMd=o5NG;S^qtT&y(z>MuDzOf9-24%)JK6hQa!QUJW1a03`OKZCu-RWy%0MMKdAB5Su&SW z@P)wBRfE=J%jq6p;Gc3HOtO)-^^p8TzYAn#;%t$mX!NRP=Q|APMh}L#Dr}TpHCi2> zx}d$_Huqc!gX1m>HOoBExcVU(nazTjh&D!Mh_UB%dsFsxCzS-dj?gYd%sbOw%_NhL z93jo3O!d+Qj6}6~mUEF}(M=RFSFGDPuYlWX{-YE{RAXNZRtkaN+~je;96PW+;o-YU zYyoV~>elKq@z{H(z9dmnzsIsJ<7#@~JejHcVYh&DVymHQ0IR27Iqp7gA+zwEuMifH zwgn@BB?a^1t9_-h%oQdOL6k0JW_QE|@h>ASu3Huj;Ax6&rUe1lsl(%sR0>&}C%^e1bjN$Z3+ z+5Qe6ymon`aJj|jv!z@}Gn6K|tP0M}Hby~uWlb8}keZtJgatoYxK0bDWPQ2yhNMl2 zdbBiSmHZm1>0S(S2ds9c=B5BW;eCw*OhaN#Vf{e7_~eokfoq~LjC~zfNFZ!=x(H>_ zT#Z_gcz|Rmb7j>OQ|E}#^^Yl|(;0u`a&b3pw-MufCf2j~*2W5A^Zq5t*mgvc)B;Px zMiL+7K1sx3#$I~1mpQ9fmb|1L99b}mlp)9RIkz51tXF2a@WR>_`O8aP|Aj40jYaI? zmIq?xl!9e%v<~rYO=scE5o&9+=pP4`bP2QjQ6_MBRi9#86~h@{zO}`|wn9BG93hk9 zIouI6+NsGF1rNuBSY2T*a8(P3OS{bvgRs_Q!HOX(Fptl!gLyDyfq*EZ;`e0{;ywDP z)xe`98tp4$mhI=Ta#zH()u2_xDi|?U+~mVBuEnlM)DbiaN_%)c&<_Y^tl_A^CbQ4v zd98Ub3=#rLbizj|7 zi`4T2u!kb-8K3=^3ZkmI7PTMZ1V|T1e6oyBhap73$u<~#Xdf|Hw_+4~9;3T|tE^;v z^FE`6Ak_t(a^r(%U~xu*Qudp6SmX3e|JlS=%p|^~b=eR(_#jEb4IfQ&cxP70rmb8V zm@2b(_ZnTH!?iYM;!3A3XX0RyLtjZpq8%9aZQ5psDz&kts>Hf56+`97*XUv@{`n=% z3qB0@XG;|onDRbjA0dT6EN`);bxpD<{nI0VMrl1g(WIFpBht#HMCY=piaBlZ3!vMz z;KF%ZFVtYh1P)fV=G8cZz1JcoO0g{oQVr;$JlbP%C03`1(DH@+@LkPH?5pEReGP+s zszmgX#XJx01R2LR_y`>Dn>*zt)_h$Q@#@jd2CW8lr#j;I0@d13dnsP0R)hS|QlD1T z6|)Qafm+$uxqTR%bTNi;UW07*uv(TH!qxmE)L0BfL>vw$^{WsI;JOEMV_F_c#Dem5 zMJ;q-LF6wPG^B9;g)A2Y`-q>gAGu*$_v5^tN^^rT3zgPDpOQD2dm@hK?S-WhDu0AEaXK$%O$)BwH5K*F2{3PX_{9DB!e??tl?Q;iD}hOWqf*YZP*9 zk@eq9I=SmOmX0q`rp4X1s6_@`*ix{IiS$GSf=vJPN|dx9GG--dv@~Yd>-y(JL3qUn zUD^3dW~Vmt<1eb-WhYqqZl6)ZLy~3}mYnFoz9x}Gnx)L{mBSn8jk$+x_7&3&b(8y+ z;V&Ta`2v`{s6KTVLgDJa?y6z)^ZoO72VETK6@9~4Dt!Cvgz4i@X3RMdI9KSJ>|$`r zprKrE8bX~Y8=l?0i*W}Z5rv#wU}3n*cx2|j8Qkl;S9nau-{_sOBwmy~>VJz_Xu8-(oX_?>P4=~A(pVM$@jT$PF_N4|< zDi&GwgGi%#-xv?hfcf1ZR!khw3eKclL@PXXIxlN=&k^Wqt)MCzM@Rh%+qDO?as>e z>(;(Mu#U;3HLv&@vx`AiNpQgbf-R)y%T%NaiW9?50nN;LOj(L9-1n;EIZ86m{#qR5*UkA2F35ffyi z4=v2hFcw!nrb!+evP8e>a+LyL`{WHsRR1{95LY8JyH+VlHyRL*rJ6Eser{8zsGVy$ zB759I;DK$RPf?^_*2E6WxKY@!;y{$j`TQT??qgU(UoaMd~k8}wn z;h$_0Lj44zJ@DCUu~Y|OOq^xMlZ)F%w?>w93v0+yS*HRUXR?Y;BD`mj6VY1&duW=$ z$wXt_X>s!e>Dl!= zN6Tk?rH6Te4INiw6Wb(>GP>l$u&co6W3`vG=#UJsnfFp3Z2hhK@;=M>+YghA;yZQz zU|BsSSIj$9eBdXjwu6xZgLOK9o;Ozyc1b*;Jw7-BeX@N7P4as{S4IiKkF!dFPG8n~ zEP}e#@KRSPm?PL(k(2o?cJZ_5AMtE(XHyA;t7?S!L2M zC2}QO;saIND&z*w9XPwu#>nMAEbnjWrh9~NG^qk7YY3N&8z(rnIY_$RcEe|Hh=O}f zmR*xe6-^I!J>^vEN_q#ygN^K@=(NmT^=`&^- z&9;%BhglW$E+(TH&;$sR4dz&EoiGzRXPK#a%3GVYXo&_!y`isLfMc;{@m z&|b^SQlHjEzhQR&k(Nw(v)l?ALRyH7T|lub!~u|thP2kL1{Dli+12{g{N6K$`*52Z zlG)YZnaeX#@A4%A_x611K_9%hM;dMPnW8LLi$Y; zvJ7}XQUX<)<7N2t=^8C^Gkn-UQ(q7WcaO^`_m8Uh_iFTEM3)no zb}7U3&xKO)TDz4B?g?xRPwNV!>cIq3F#Ri)dYmEyzT;cdqExHUl=#E?V{CA8Qj*L!GQ2K1TL zg>mG}%=+QBh0`ZWojw=)h*O%+b#zpDWE7XBowA<9_y^uuC46hn&7_)pxw(XNB_p#g z3&>?2KZ;-PkDj#^@ED130a<;dfds{tB&A{HFTO$wG#AmSx-@7W_Dg4+Mtnj z90dEcs+5M=RHjFfmxw+3oK+TIbwKal_mDWcyOFJv*S1>SriVmZ=HzKh7xMKpQw~>+>*TIwYgOOL3CuXC`v|K zi7`b5KT6Jbxv-nIZn%$YW~C$mId2odduMd39?SmpS`-qVaOw~GmU2y*cr<>^HQ*tI zc9yWdQcN|{5n+h&{m)L4I`7LZkru<)L;U z)y_fNX7R?Y#V#Cs3~dC@LTsJt6y4(|EWLlxANNWG#_X>hrtNKB=#WYl$E(4)dr@V&ukI5^&8A!9SHblD&ZOj z?2Hf~ouwx;triV znl4&B-Rz8CFd_sB+}1wDaRw9czWSJokp0}b?O(dgKdAjwhyOwymcF{BhYLbca4+j? zc#>1i&hLet^f6$Qea0uf#g}8f#|CYvx?1VOt2N8s49$Z=P4EVmHe=V0#n4;DVUQom zZ(kcM5Dfw-FwisqDj@8N(Y*|Wg?oW!gV%~6MgbIWL7{B-v8k5)d*iO=U`4}VZg~?y zlskSpf9@GaxJccT`5;L+${a{(L%q1o{n?q0pHBG$Zc#gP$O%?41oGJ);QSeXwB>Ej zcmCdDvpp*HKTrJ*z82nf^<@&}BiZpC3`mdgDgNe2>DeD(QL}*~c~TtKL;>WA-oCl(Q+tEG$@z{>uym_8o4V z6if82ofMmBq|w<;z|RHYS00yTTc+bSGWs{~YqYhQvPVUwe|6har!Qr6FY}Bl^*mjD zU9?s(-D>{?OBF*~t*F!`F_m%05G!P$xr-&|OWsdL3|;U4_0yBg7oZjUKE%6R!GoA; zBd$5l3wJO8HdoK%xp)Y+S|J&F?iQ{fStW&3sKYkt{Dn+UTa)(Z9AZN+f-^YX5#Dd# znTc7a7ik3}zMc62>rLeiRjiclW^&djz+85WNME1oElJ`^iM*Jb=^h7q*Fl#dG~=gn z5%bI-YO}{B3`yC|esS-}JfrdFZ|)cC&;x=E$}FDP5UgGQmG6_@!mJb})wZk#T}1vl z*pqb7a*@wNu7u`fq1n=X)~zAm2iBpXt>HbR$KZF?p9t&S{_jTl<;_X3iikTD)OGkt zw^DheEQ3>w)9s;#bNsC2Fk}i=n_7S9v>#tFE=}HfdRX2%!+xGiZ=`vXsc?MwRcDx> zTH6paZADLCm*IrG5byHV;m_O0$eHdTqJ&V8=}q}I<{1*C%JdKhV=ddL8&eK3RAmUn z>wRhWerum_n!Rx6F@zL;=zT@Vy=Rup#p)C_Sah==-?T7`Bue1DIGksPqqP_+OHRM6 z1#VN5~2QDN=%C&T@^!ivW=%1Fs7G0xKu&*Oy`@l5*{M^B6#7q^s(sFw{GqBAg~yDZwe#8CxQ^${IQb8qr~lndE=+%yBIPED zinq*8;$f>>SIE7ctfVkx#AHwtjOH8U%_kgbP0S@JG&T9NOg-OV_k@_uaUlx0jk?|2AyxXF)~Ei*whKvKsTFVpa{-!N2&!P*L# zPki|9jMq6g@U1nV(50OQ#u482z^Pih3YEGtA5Hq$bO|ZD96R0;>n?fICTdR>6;RRd zIk}JzVS6)(FlJ`hBUn=Gi+efrGVEw#Lndmu*COL$IF~*Cu zd=mD};-kLw__^MaXQQgV@U1c>dUy(K*%ciVTR}EebtSF(w3tw#`~|dt~vDR zpNjnG@DzV#wfqa2!4*B5>N}yypmEVj))fH1tVji!J4Wr2NHLe1%PBy^wSLSU_npe16L zYJh5+gA1*iXV$BjMqm3tjRy6ieC{6LKzGX+8|avuz(YQ&vcczrf>u=TJ{Y!RS8wyI zOJJk^il(I6;*>aoKBA@6DdYojH*wNJV!8vXQbuh6zMq}9JQT)H#rKf%ZNYdhfPM}m z5dJ)WY(Mv(KaY8nXPeTM>gA=e9Khywx4TVmVWU2?ckIwNM4%4u3C$4h4(f|(NV>de zfj{|vgB7`6n%lf74mN6P5+s zw)dH$!R{1M^||I~!w_(~-oG0>hkkBRaXvcDev_6kFP8e}`Mf_q!47{ZiZlEG1#j^n zG@7KP4^(T5oLDWgbXn_vC4t<{WA8Ox`Tf1N%F)t!5Qxc~rm2flV=$3H&!Ul@=~w{w zC&!ub*fU2ri;jIqdgvbwvADIgS_HQVNsc9sjcFfaTYp++e{r<~u1Q~3<4Yj;adM?Fm$_Ll?C|d`jI3|U|8#aA z?@`pBAJNhwzXXZF!fl4#K9IjI*dJ&JyU`4swV82WoLs>djCps$_o@GodCf+7j6d92#gI(24$n*snTs?G1z{J5 z&s&k+W5*lb)_B>Jit7a`puCp)zPw3v8ow~GUcIGPl?;6OH9s5vyAJ&Rd7-*S=TXz~ z*qCXX1<*@_x7jSxyE}Zz$gXeUG?*@h>3adE{iywj@3wFWG(iouCqPZ(!~Dgd{Y_+P zU!m6abo;i_%zxKg{h0+cPo{pO?a zEKVrf9gmW+RM>NM-70$^*3w~|s-Q|GX=FFt>(Xh_YVoPh z*I8h;Ozh!7l~3XrU#P<)&HB771Ln(%QMi}0#NaicHnpTEIdVL#rJfQ_lX>j^xMcJ+I5<|bWJ>FVj^pk@I zPk!`|?-jrV4srgiXEr1olr=K`98Z8%P_?t)qU#Gvcz^Qq9X?EOPHqQfIShYL9`>AA zA2uV}7!&0c@>IO=+&=B&9F_GDHZaC(gR8{Hu7-@Nwy243s-;XS+G!xL{{K38`}vL~ zWtXk1wJ8r}>bg5FgNS})CsQJ5fnxb=U;1kB>P9EeiKKDq{zudbxEB6xLlVcg-btuX zvD3aU|LjV#HZk|W{KF9OUh57LpleV`g$2nu)wwwZQ-vP6_k%CIjs~w## zT|T`54>ZuN8L;_vE{+4Fev`F_^!3c(KAPvCC8sYiWn8+mp9NCN$uY^;1I6=GCZA;) zgtagI0c2w&Ur&jBuFkmGhciGXyd-Fgj_qTt1%89a` z(}D=ChX`$wWk}K<%ARFJlC0VHA)%%QE)C*crnxGr#veGg{8+ ze4fwu_dNcnKhBA|=Y3!A>v~r zRLu<4&4*@vlU%i9=F4uGUo*P?gI5EXwjAWvlfbV0uQ#$?A6=~U4~ldGD|_-}kF(G2 zqpTumot(_Ed?l#e_s)Xn?d7TjdDMUUC*H-l=Lh(i?`cCKa)*%OGv6!ytDdo1v86wo z)I#|q!K)n`;K#^N8Ur=<7ehLN7DXGQebh#X;Fa90b^dd$#9v^d4}NWxybyw>d;){O z4h`;DziT-Q=DTP&Lm2qc>dnU3$HK795tNH?b>*Ono}Dh9+uDpgI6N0sxK$+_5tIRN zCR^JX>V5DG%6IOS9lE6b?sV!Q>TiE*LT`um2b1}0)0AMwH_FevR$yc7tta;ca6gyG zQxIFc6=9 z^gAMU#7|UH$5Q^LMa7-tTg?vqRTI^)K4q zW?W6eR*7~(h9j-D9oGB{voe`>Upnx08T>xGiM=NUa-4BfNz?T9!{l>{^=hQVx>#)V z1kj!V?pC^I8AmVhvG|8pqK023@51L_dIv%7W!w9s04eqx%^u)AkmVV0RAPsnw$lj>v7wx8!r3- z5?w#P5H9e-O$cAWQSumP2u9S>o4mBBzdi5xWvj9tJ?r0!b8B0{sfb984Gi04c$7Bg z&kGlDug(k0$Tbu$##6@tP2#E;RC5YrK7e1rTwcfcapFFLflEbeP(sim*g85H@xG~a z-ZDT28Q^MjsVSqbuTi#icFP$pto#j*Q*wh1;?!nSG%^BX^zh{E^nzwwhPm4{M}@-J zE89UmsL6hR@V;;GliqwKdIcJw7r~c?6FvA%VOVn5tw7lMf%a-?R)?F?#|)IO5MOIy zr1|P&D)W;o&M@y@?)vK8gDb%k+g?utlsWjwW}f?psM2UtuEaeq(|oO&nd08`OP1D*X6HTzsdTq+7ba3xt_f*iZ{;>NyG%{Rz>giN#!#{y5H zespH?;EF(xT~l#1!-i&iXFeP`1DBDPbOd6Bp5mG~T))f!#_7XagG5Ir=aq2Vrs@gM zY(%9t=v$*~%~th3uxi-xxg{$xU@#qDo-2WRb#roM8g^6~ay<$QDhLFhzgW~awbrL> zx;>3x?@wZkveEz1y9SgLk>#L+N>K=XP|qJ8FDhddYEvoELo1~99Gg^Tz6`zh_X=kF z1t?P1N6yMY7mD^SeZ%)4Sp*9qP%k3KxO5@b(L!m&Ql*LiQotSqvG9 zAedlRacWGpi^n4$#+vrte6?>^3H1FNB;pQk6&_|e?A97%0-phVspvNV4LT$7q#ulu zK1xC0tWl92@IPNFHE%g{p*KI;) z+p3hR0?&hLSF)ZW^iMKtGA{8Goh)L4DT3~=!%k3%`Z1djqTyFTsLb6cJ62b>dtFA^ zPY!4_sOwA}z-6zL)o;uXUtN-G*-*vCZz?3OKTDd8;73_mrNrKn8m!AtR^}w;*JriG zeu9JZ0zWmjFYrtMTYY_zx!je{gL9 zmPv2P?IX?(a`0YRw6IRTUodn(4~!wnSNiAJcV6aVPbJ^!j(PP!YA72$HURGVArVBF)$)Yc{r$U+|v16Y5JMirE=!V`=W=bzX4Q& z)_*FV_*T#2d|kVSrlLWrX{OyE#ib;lOZh4A(}I~9vErQEERN;&+B#addf-QmOg`7yT-*hJDv zv*!uGnd`L}sn+{i&dnoUCy?bda{|QCLBLy4nD!?|NwkCg9ZoN~y@!exK^Uk{%`C&Clw?-Rab;Gk0N_(CgK%zR{=e8k))dzhbP!K{UcvbovX;bWf% z{D0g1+1$2KGMMw^R?D4W;lw}r;nqQwHp)8|XjrkO-aLmi;ic2rP8R(z$tA$K!tJ{W z*o)Zbdm$UujcX@%Ew$L(RWYQDqv{&o&q<|Gt9g}F(v7@?1=>|A>g-e`bmgS`N|aBZMUfs?TC?UI5VFkyDMg8Qar0|!qv@8malQK z7hCHEg?6HmiRj0D>Z4~#0v#4X)o-`DCcCcbdYZZx)lM>Cb`YC#fl*ou*ix9Qt^4Ht zU)(yuu{*nW!X7sJ>bh36xgLq03Vj8pngCwPs<>c*(6%#D&$I-+Nj=KUj|Ca&edouL zr-6>m;ZZSwst*wyM@^F0Di?N76l+~F9*Q00JxU&-BKgG33gxY zA)6q!4b1Xor1@p==~r>xIG%JfFTGZ)WbN_iRbf`WPufe8a~7*B`pVF~G(K=bAbd|a zg|{>Slo8eneZoK#Qn)+8KShdM&#@R*adCWhlL&`SZ;8l3Ti@Wi@|)1FKOrx-M|o~Q z7vsxzmOfG^vL>4k=7(#~?WhoO++#be?0?yd1@)FRb-f#@3s)Vg10ECjxrpI%Zv=1W za?#}S1mHP8DUJ{DbDUD{X`&4_sa`GOmeFelZq-YE!n`u2Y@|YB!$hTU;64SFe7mMf$9`2M0N(uI-qqX-xC7RKxf##H8oD7^vNHP9lCMm=F6YDNg8z5-@2kK2nTR>!-tBwQ*EvejVD{Dt42V)6; zakWCGFx1RQR)P-2O(!VaTb`-i+^xt@)&@Z_B)O(|OgR*K|FpoMFIedd3|a^OGVknV znfLCCl3q`3TOyf5_@AyyJo*yEGPCN};?wNOJ*kn~=@YjUhOzL9gAC0!9eNO8zpRZn zmN0zLiBCHPY~0{lqkfao#cbQYUSE8p`xj)i$swlhvX$M z<{_@~%=w730rpsaN(kp93H#JZB}jdDMcSzg4EY_d>4cd$_bh)g?JV&VKLPo7Rl5G&zXgImBNR-gunz65TnDt_JiH>@~;! z(|_c@@zjBpjy=xz5*d$}tQG2B{b03@rT9zcFdSO>96IUk?Z#n$g4%gr6sk}v+PVmO z6o7#%`EY1viI5Uv^=cc%=WzR&FN>ckB32PGQ@m% zcfMmVCzz9+;WqQbMPj}R_bBe|d?)EwU4YZv+o1bX3`wqFz0Gkj&tzEx-MdJ`OB`Ry z4Qw@8AuUh>S78%c+p2yAd#Z@R~0)_it1*020N;Y0=Lu00LIU^ zxU8KCOZE=vJ&7$=HrR#8f(Qv+&y-tIe0O>8>h{i66;>BhiYA=l!AZI1Pn_})Ri4-E z(4BZQUaR`OIar6;6eMBXWb5eiwHt1e15>8YDklk72Y4W(;=*@eWn(aV5ya-94Z~hlef<&uBli* zRLRWRVR7lsEz$h5m+ydq@B5-Q!3Vp-s(!1w%Kywj!_IOv@_ImWGD>N1HH$Y^~o zm5qN4IJ3^PswL@#5X4AX1AhB3x`wn?R zltLsh$J`STXooap3!71E&9EQW-;;P6bFu05S>>ix7dd}?yz-52weeng@ z9Y9`yhsn+}-v5OEFYVN3hFz`8 z{R}`Xps#%m8XV9rZ_GDexeD@YTQQ`Sk=wf%&&S*a%Q}w9FnCTDrc)H$Sy0*fP+N~7 za#zcw#ada{C9$85^65B_|4?ylKAWQh-NP5Z1r z-aFB&KAJ8P{@%CJQBRps^lMYoLB=Do+Q8GrwIsk`SckQ?HRi9BUUn2TgXF(FXrXjvO?1{@N_Q}0!Chr-KoEq;<$9hZyLt>?` z4dDyYSsnSLJw-c!p+MgRnWt^JXr?%cR5EknQ6_}Ver+pe$JVN z=(8Qqm0Xbh=pD#~S&(Vnp|PYlIjzycsGXZ$^h(@RBvQqGN{{jy6Um=&V`etm4P_z- zD3fXPf3|WqCVLkHXSz$h?7NE0mowry2IjU|-``5rj%nMyd*HU`Q(v#*tHDD|Y5OFp z9C#kU)T0tK-GNH6fY28Gi4pdGP8=!GEU<_De56*O$ND(ZLuI`UnJoW!_Zdcca?82s zC(eYaBncMTc@sH*1AHQ)yN*SmsUH|_-C~!Xfdo6h1+4cWWwD`rPe~3R$~)pE9ri?{ zZ*2u;yK?YmUS|AP(~iLaSuxY?ZQA2R=3Z?E?P#$fxp^SLYhQGTIo&9Cv{{M7!yfim zY3td$YNA*A?E2hJcX;>7lHzw1H&09e*P>ym@yn^iRm`Zw$h(!VOgIw4nzN6%rtb}? z!B?ns+x@!=OG--u^o$Lo{hy!?huG?oIw=~SxSpvw{FDspQxK& zO$jns^$@%**>iKGu8i=MK!{uvNI*?@*tL|TuDPzg!;D3AE!E2>GzJC!CC`~!Qi0>{ zTz%i5>zRu&Ch-bHjbpQPwR%@A20tKH;C|f)eCh!>4mNKr=zMFvk3R_2 z3~nBA?+Yiky;^jl9Ui?7NYG?>k~}JolW+2LSk`b;lJooRREX-Nr956h63elE=91@n z++(qaI4AC_{fk#9AJ(iq+EEK;^<6z8rnTIq!HHd%H6Nm|qf6W=PQaR*?tLYfzdYjI zlmBQ>=`L~i0?%O|eoSr&u+o7}NSC&D!dc0VQb70&;-hq9M$Q@s4|g+7N;($FuHAD| zisIZH&Mb^?bC?}`N-VVklM~S)8Ek~==k{d1(nXS;T-aQMN|wFb{brMOyX0<;r`O?P zcK^1lKGLT(37tJr-GT`W=?}Cx19#5otw3*JXCVo8c0<@)3YmM(nV_vP)TObm?-)Mo zk;6ZgQ}Y!C-*)=;$*vI#jqxd*r;ox3ZhvqF5NO1n&>larDtMcHmeYa2!2nZ~2Umqk z=X9X}%75~nK+EtwoH+-xOW)vvR|AmG8auaUa&%ODTI%9jT}gRYnQPGk7DT3Ucl<zOQ&Uk3&zt$KNBxJWxz&T9PcQ&X*;JDQ2cyOGaej*uk`f(i^6plk!$$ zl^@P1%ad=wca8zU`d$S=zx|ETL%eQNz!|Y!$;t~~`<7VFpw4*Q(F8-6J#-MEKex}bJ1^z zwKJsiwehBi(R9D+(qw18lRl+U0mW+%cv$oi-n=3o<4#a!g7R`0O6T-lPfjUrmpD1R zLhd=`mPV{>Y_FhXvE8&*SzNKlXyn?ZtO}0-zCA&>&kqr_eWCZ3<~auClU<4xyLQic zUw5-QWq-YTbUzO1VTt$A>O_yfNe*f>$5dh}E~lTgzus*NKYI%$Gwz~VOc7eY=3ouo zkW6iMA0F9N0QGS3YE*sSOrv|U9QGciXTBhk)Bi~ns@Jy9t!h5Ef<+*Ol9No3vGnll zC+~?JUhgU+ST|qe4OMtNN|1v>>2^ZKsA&}lyO$Gcq)#e3tyqTr<|t1(EAASyCn%tx1B!& zsSQoM3IxjSib0j)Zd=X!^Y;R}@sld_`e=vbn_X)we?V2;QOuE~LK5unVos*E9ljhQ zh^=W#1CQU;*xmi|!2qAs`guLN)C3igAfDG;d3jon&+#dAZH!<;uQ@+8Q(R6GOx#mA z=@^CH91dW&PV0M3<`IKIv!E!bQeWKn2uuUK-8$HFxG$V^-fVpwa!))wSV@r6oo(cq{4jW+wpL&#=R(mf^FR7R3j}bRtWaxgo?KO9VH^f+$MW6X ztJu!#lVBaHN^paTytet(k?h%_d2=C1__gnO;9Y@9X(8zlM!)tol@L4YqVVb|^+vfa zv+>*+|6%JA|G`R@Mt2L_D-P0a4h4s?T9E=OdW5KXQvF;xX&-uakNiqWy}Otb`2b#Z zQFKisu=62~GzqBfx#QOePdVzbN3)xVyb*Ex(Q|7>)mvcDM=ws%Sz}uHFbB7V6|T@^ z8h{Tl`L22>6#h_x!w}O=6FG(x)$_lbrn>3a6~=<*<0vy_JrpkhT4xW9N2RaawG){YMK^d^Zj2B& zyWLE00|jS9#2%&qicr5t9FXWd4KeeuUUNd$oneCw9}~#?*tvD7uxXUTpx@g-ux*jp zx@K+c9P!>euw5}ACqARoAAL{td1|)QXQtjt$jX+dDvnfGk}|_Z(nS-dvZH6MmLn9Z zAB;v=j zuDdQ*^2*vHng2;{S5zUJevzuBmStmRXR*^ds=JX%Of09~0Q2oAWF zE3HZBN8Ra}nZnOvtrgyMTQ&{NsLbB%DsGBHta!+sWTKuAOCXP*bz$fVp$a6eClBA* z(FuPf!30URT(+8vxhq-?h50Ua-5KcB|F|z%>Vpte6UyZ&CZr2psJfDync!HA4=Y_w zzao#1UOB)Hor@dr-)73Xwe090k!Pn9hC)n|?NovrUgtVAp?2|rnBLVJBeP_0_^$k- z?cvPoQ^W^EW})|iBhP?}k!u%&F}^%L7kPO#5$LvJ+VH#b($AwyR-(i-q~@y%(4ZZhXR9I)CGnHa71D|bDlMnFmHE0LU6h{ZkYXnA2gKVlMXIB zC(Q-kj7yN+0JCIwjj`cz1E%`DY4Jw0B{5ZJJGBO?ge^P>q(b?z*;rtd(DFXiA0aA( zrkrA|iF01H!%OU}%?Jd?_<2k(uqPN*&^H*CssOD5+Ml6R)g8NU&Hav`O3AzxW8&!Y zlux_ehlw2Q)wTY0U0L!6Vn_9#7wXLSsu&RZ>-#a{y|YM+)QX%ZMhD#SMy;^?Ywy0%u&*3IZ7- zf6lrSzwd4A4zDmTTiL~v#9EmXZvSG4P`y>N!4#Mo-dEr5{Ri=J>dhy zQUg^yBw_~!3^&h;=dJqhdf}bNHZ9)Tt-pm|@>bkJ1ft&&+~#WXO`xZJJANz`|9t-D zV{GWfzA)EG@D>*=!dPw-vN@7VX8mWPx6Di#Bl)tr@LTX2Q+-^tj#2Y5&OF$43b{6% zAope?DWz!+&(W?ZB@pe=es;>d15_@rT67p@^S&kRzN=7V$wmNCY~W=*DrxG64HMP= z=KFyDQ_34XdFn?-J>c!_N=M$c!5RZP#BRjJiRk{5tTCqYWKc$gbb(<_{BMTZ74ddYVyp^#$3WoRzQ7rR=OKvw1g!>AYApF{z7toMrU3K2WIcbI_0cWo z2f*DZkP%aMMHl!O+r@7Xs&8|3scRqp#&1e~KCFWE6+|!o9<-_*zSQ~N;R$s^4W?`9 z;cHuH6*Hzl$FjzVy3y?3B9Xl`9Vx%Em9+X5blXMU9>@u~qKJd303O=cnC?d7>HM@I z6?$fV>C$%fnvm-}+gJ$t*R!R5Mi^CQzq^+K z4Lx_s(2Xg_e9pRVPq$lxW_L{d=EH7$&b?{)I>UCd1)4()F6iAS#a) zz~+xCD6T-BZth&o|Mw}t#)6s%=*du@)7|-qxVM`U1Qx;B7ufT_Q+DwTyv7dq z`wqSX5F-HmeeQ^4eM)CJd5yr=jVskr%KWsS&NIl^Y#=D4?m%frN}8qQ?>O@Eg_~!} zkE(^+*svRbBR{{fjRV|-mP*Pjdfx3Q?Gri5iHQJAgzKcmQQ?A9o+v^+U&Kt0Q&#OT zW@Qdgoym+j7OU2&<~b|r8cVlYVQKTA86zKoPg-62mdRHba}ILh`j@Dof7)l$vKpaC zL#oO2hLbYD@M?;-jM6IBDUd7wm3CN1OOp_&;#o;+uJY-L=KQQLq--A_0DdBy*W*uc2RuqR^k3jmcVQ58HBo|GoY87`8vE zZNUdXM-oN4))Yg$>RTrzl%1vy)BpG#Or3en7GfbsTSd7ewVpGQ<)ks!*V(JM~*D*>HgZn`yUh+NiWV#do`DyKpUajmfWl6Cn;{Z1rl002k^52ndff{i!k<*FniFB&^>rsA0oEHtQ4DP!Zct!4G${E~&A{Zj^m>;?n|>Sjo1 z0$T_Xou(dy*_s4Hm%|J53(!Uiyjk{Tvn8~*ptRIuv0_KD6HYJ0XGY>eoNr-LM9)2^s9`5i2p#1`!lq*eM=h8ZIpwy>qG_O5yC?a>)D_kpTbAN)GVW=#i{2 z!&mEzluTl{Sf7;I#>VVm4+{X^$5oI%oVfyDGHI{InJeHL?p0Nao^sBG4m@2eGBT2r zd;Cutv5QX0(0*4pD2#;wLM1a8^Bi#DlT=R-=rN@ndMJR+kI;A zZipR5PU_a9?XgSpb9F#X%3}U`*NxNx=Pfw}&3xZWnHgfdYE|?yNH)6?xR$0hvq~dE z()Cb3a0{q^o>~Mm|K!%DA9mI*NjX`m<9)fa>LDa=l+@(S?nRC1Yo4UJn)RIQ?klLC z*4n9Xd;Np37|0A!b8%bQeyTqvbQeS6q5o?~W{`dpU?{I+zUtmR5scl?;`H#5fxBHZ zQk%hbo&zZd#1u2p&#=#osnvU%$Zr;SpH^T{Kf8`i+#@#RL>cpp>Ut&eek8~Fsfm>F zP)GbXxd3gOWTNECDu*wY506O6XpZh;83AD+KoSy;(rosP?6W_8_=w$)rxe<7fkx(j zBjUjplnVB>AgDku-3L#mjWGVe(`sR!mp*wEjLa(R$&Ou1$u4^YPtgllS*LuB`Q}5b zh4QJhK{IIHKeu`U`TYLQc~;Cfdszl=ExHfQ=TuF)Mc$Il|UK$-^_ zJ>tzx8XJ&Rf8Ly6=vFjv?aQypUloN}$O3Z zU-ytRa1i`p=;za4fu%EOd0F!Gt5?flF1nJ~cVhY}(+^4wHikwok&ZRDM44wHw5>BI ziYYjbuvP)5(3F_;SMxSkTkua;K7Auaf7nOQ7s!=Fn-80!MER3#XLtp^CQ~a9NLk4o zWhe;~&liKF7*kW9H=aEAOu8O5_WA#&_JBbFkVtw}NYxXotMXddhR}@#yS>wwbGjinSMd<>e}u)2VMaN4f_{meVLS&1G#F{t*Id4X5iln5tYo^Uk248 z9Y66+xCQVz5c$;5tr%^Je`Fq@p3!e;h&uVBZk@1Bqd5DhVdQi;teI|D=EIP@-&Awy z+|G=8&5gW~&|eD_c`z&7G%hvQc~)mFW7qhzr0VD8F?Fhe_Pn(E4?9&ZDW}K5APc5& z27>f^Ti;Ztu8-z-5=Su^i(??SES$?sMc_Oe>?3fN(D@`AB@Tu7<$(+LS7F4UvpGnQ z$NbT$cq4`tBrsloz-v#9^`uW03NY@&P9^HJ3QNqSM3ZHFOuf!z4#v%#*8KjS){2QW zSRb=R&cX8(F=gTYFDpJ>~2s)|8%AAO^Ge&f7f1OWy~_r=+Tlcb1GIj(&r z72VSHNSWxd7w7Vv=lD>B+5#H`U8X^PwH+Y2u^ zv-`QnVH^TCEUWH0UdaFL;$iHY(NnKqfz!W`f8UcOhRtb@2>7{B_rE3QVTvPP);J*B z{iH*q(-f#gn6KBNOPoIKLjDHcCiJ82XNo15WjlM@2!8nFgP=6sUYccF`^qGEAu$|S z;=O*ub|YRM#6`fU4W;nXe36dDiw8UZW!U=9w!@bIR|z7_Qd4&~oVtPD0~k-MEh0?@ zl?SN<&&PT9nK9%#OTQPpJ)VQ2<*}y^+LQ&hmfAx9h&%5@eRrKb>}lg_n*kxD_mt{M zhA*Jfpf-Ge)s}8#@x6U?-)G{%t|dh&Zd7*ku#@*{hf{3e5to5R*gbnpdE2*>tw(|H!Y}n`+ z!8Lip+87yvDp~5@)`;|e28^3*V+&l0YRSM<%;-MP-9Nu6VCc>in!SsmhP-(tu6YZY z9LM!`uTI$50opo*No-0B1OcD>*~9KUR-!kfaa;VvxQ47LcWrOa%UWK29pz@A>L-lnr`g5qG`__Yx9>jerYm_6nAPw^ zxzA3aEwan!b3FkACEDbcRJ3ika;6X1Q5I{pUk6tOED;oSgsXZhWTR22nV~Q`*;i5fz z?zeCQPQ9lhv301>-92fQD32I}M!<+5*@UYd<6n!Df3r}+3DXAM{89z{xX6~nGY?)$ zfLz7DhmS!n58px)zxn-dgb}?22|GWe3DV-n;`XM(x4_OHbZLr}kr$@^bqNv56XSF8 z}Rh;11Z??T9w%?#JTkfyw_i@&KWY~4M7e4T+;?QEKSe_eXoOtUHdhg ziTN>()pw}1?v|*f_@_lHLyjJfaGj0j_u;N`9@Zhywy*vRTKZ$ZbTFkU4m5_;FRx9u z;w-{Y;OERz$!i1u?RR4EzSE9icuprVIJ zPX!<{X|bU455j-yT%Zu7EwEFim!sEvjc&Ph)^NVU`rBjFuKKIm z!tVwn^FC^?4zxezZ`IZB8gM*(C|5#W45d$N9YD|ULv?|M01HvutlIogxeDNqBHjp> zmAb)q3XEGFgRlBRhF2~_jS&Pi(gd=}HQ1xx+6Yr{qaOcZL@HJ8r&aElze2Z!B2@I03&PRlvd=<(qMp+XcxezG z-2SZRuggGY3pzv?4`^SSZMcGkjH|;~^fO)WQFEaGe*{MjPH!qLu-yG&wBZE}ZMBmI zULjdq{|e`mm$upvjhlElD>i$r544@Dt{m2I^c&U)iMS8(#LsD%(`Iu95R{5nqrG%=9w6a*ScAwa5|xyl9t`57FRGg5#ia;?!x zE?bmKTlxHqROF3EK9m)%qQO0PaTgE~dlDN&{q3R==R{9J&D!y#hEUd=o2Dg8d?*BwvectlSPgHKT#nf4j^(35Nk}x*BglAA&Xricm{RAAV>m ztPg9;TC0DD2z{ZnvQTIp~j)k@;GI!L;+fxS?P|I~@s<|oBuG~)j1tDRPRPlMl~{S#e^O{HQ|8JWo>jfP_uf4qUb z)V;xn1DF4!AUnpm8z9F}i%Dnw%K2~mL_Dqvk{2U9mN)U^np}s>D!EY6P<40N1_mW6w;4fJpvv`56?7BniC$y#1b(j6RXl_da@H^Nf zZ39O4jWx?Z_az&2UfN7$p0(ITAuD_@&}jykwI*lyyshIqoC!Y#3_8FH=4M|x!dVIM?Y}(lK-MFa=sCmY5!vCo4oK9!Do$dnSXJ~x+2*7C8#5$ zJz89@sbtwszUm)uGDv$N5nXr$x(dEalaF|;k%h5Qx4QPfm`;r zO%00V&~E#^Vo_rzl`?FVlWO{!tiKXRIo0lV2nJ&W0a3jFSECOd8Q2SZVt|Ss$POQh z?sUkiCUOfgB+tBFovyXd%cm}1A`!u`ZvGu^lIwmNH<_&Qk~HLw51 zBRh;8C1{X-^M#Lwvd1(7)s?E5=>)0|<6#I)aEh4*M}-NR&DpYAc_3Tx6eavMqrzsG zV=3^k7M_fK$uEksllpsRAr*W1uTA%$pgU$*ObBI^5;58OQLMgX(%(%v9y-Gr{vAHU zUTitTbBFlu(F)DO#Vd(dK&D2bx4e+*$aAG!6`IA)Kfsl5PL|bC8Jqn?jg0I3kKD_{ zPd!ljz8wX40l;n>XbYbo5faTT?i^>sw0OU;bmjS;$5r;e$Tc*Mr*Vj0d#T&>B8%?*26uK{V_2$ri(0N~$;mP~B z$zKHtJ_SLnB3Dow+0?uk0AT8=4sV%=SQqY^}tws$ci7(9Mksw8{P3@$DWuv35?TtZoK|(*?&TztK;^s>vaxq@*oh~zcomsZ}iKoYw<(-f5 zCfnPz8o#(D*1m{d6J^w~h-D$DEJ;cf-;a5f=8@H8EH%Ezt`$EUeedImwB{0WnPcZ> z|0quI4VLmt5JYQ;Vp%hS?AM~CuC4&eKJ(XfX4%_!F6$xQ@rop;l;U^gCtQZOujbcq zg=7r!BU$wZ?Ww~UmVpvOU_F6gVit2N%pLX0;A3p(VJ_q_GUJ{}JMP|+cjL{%SR~Fv zGSgDE23I1A@^)SmrwpohYJ!tLhZ@T*t!jP68v6JB(YKY{%Y38n$&GaW%0}9#OQJumAG74pf}YbN&;X zQ>1UFH+cwO{kPc%+Cw~(j}wdsMkD2Rx1Y4wMJE$1*-Es5BP_c_=ntFBw<+`MZ@1vS zoB@^&TZLPz28CIX6_@|5;DDicOL+A((>JV;DyVw9L5%sw4exBqok6cRPb$R8o+R(+ zYA`(;;yeFvlb|#+CG~2L_PdnaAerhL=UwJcX71G;oe>7^SRWrabkylnVzTDA6*)H< zS_27M)qRzt!T&@4(9^h z#_oLL&EO#5D6<^Q3OPT%<wRP$sIF>Bx)2!+uP1!4LBoiX!sx3c9v_9z(SKT{Tv%F)RU9-(2_v((X}j-5Pm z+sc>5m*9=h9JR;34pthjz{C+&H2M^2RJCh9S} zi>7Cfh8};_v-NOGWFh0(iL!JASE91T847KrR{o3K%zp)zK)33AfPB!V zGX})pP}hYP+yRARdD_^EHSJZmKw)_GRjTu7>0N$?ssSjB@B`p@vLRknKLJX%AJ$|) z8o#a|W_WiiFt?7v#@d2G+S(>dk0?*1=^p%S>pcocPPCDSK@OSv5N{ImZU0;37QM=? z7$W((p|G4kY)#Gf-DzMq1>@%C%N3))8xQJ-ml-x7*B_uoh_CXUD?`7dhv4{G`I9Dd zAioXzI(inp!UU!8-b|Hp5I3cwQepWxfnW)##V^RyqaH_KY5T!BR_)!vYC;E?N<-8F zw)e(--=8U$vsBquX98UImz+A|{N-R}z3(x*Qdc*@rY3vW9gp_r8$iqm6I0fpO^&ZE z#~%PIIO7&=USy2eC-<76gl?^hmacd)LAnp%4+rO)XZFHj; z`CA=&3+Qn6*e@CmXrnkC2@->yBdQ~M;;9}@n~olZkQ!>+p62rZP!wv3N9P1+&yqVG zvF?-5&*cO>wPt$1yoIdUUMk$`JOeCbR)8N1^@vsqPhG0I3EubrF&A?qGZ88mJ1ZqV z(rGC48E3;i$?nZ&*u@)D&qbY5wIB&@meU+?R=hTPrj-MIR7$;X55T-o`y0i*dx^n^ zLJd5UOFqKhLbf%36&&`giS3C7-i0*p7@5xCZ~YVGQLQ;L&-F1q2aM>&b7oQE#@d=Z z86S;v-`3G5MjmV^)uoXJebB#2Vd;mf38eP=Zfg$<+n9pN4@YIrMndiqu<`TN_cv89 z#6GHgvU6Du<2nBN@{y^R(E#(cwDe@uL21x?7vd9f%?M0It@d83ik5zScxs+%DPasF3 z_xtw1atcg5d8&LZ|#TkD3297pq0b(}QUDN3Yk^^M`A?R2R z9;O(p*hpO)z%B~DU?lv$_Mumv^JB+wb!dtzY3v^D3Bz~? zxG09MMFmnP*6xWEyH8M^Cf~Ye562qh|kadWH?-riZy$$VM8v z;nFzG3-fv-aT^FjEqggr?WP0IWxd*fLGQ6`1_C~uCkmJD!eyuQcCqdFQa-KrZTa=j zf7(o!8q^q=UBXspg3M%FFl?xPfV=?xCL?S!f)@ji&_E4p-v@nkKeZ8bGn5D6XngbM z$E#@X-$CC3H7lD9;r4kFRD2P*LvN{wDXjh5s12c58{6J*lKAH@yP1P@OxcmnwM>Z3 zw1>?*20d$w0&9$i>t`FOl#^(e7p#EWYrmCKkuy5NV;k(Q4=~`aycl&mYp5gnR}Q_@ z6*}{c_4!_g+&kY`o9&NyHpph*tWdcYu+lqBeX%&c8 zoP1{o8j0!Dn#C)7bL9>-#c2tIAHRF-{gt2&#R_|YWRw57gkbR#`DIdmqOt10O8be= zD~In>{kLcRcQX+{()iZ(mVvi(>FVd=?Hr@F*RW$FU!E}&4u$MIEnj@zJogcaMgE8>K~|K!CEPPA$u)5I~| zP ze|+;dNP{+-1DD-x-$soy6`Y^~TPN9qTmskPW{?tri=pNYT*;aaD#9E19RVSuV8!m3 zUj6FDdRx#HCg3IcPgfmKeg7wSf^F8+m=Wl}8mcZ`_)9iT{}HDG;|G01 zPHWfbyRqu(WZm5xbDZH|DA|xWQZiAZs1fys5}!RepWT#wMf;1I2K%wwf4~aDuWFsf zZBB9pj!_CTsy?S#9{^oGp9CbcQ}oL{4Sok{g30-+RCr?M-RHTNAWk@0s+1O#CDGxI z0fsiU;lxc(TEOBJ@Yoi!$of;OavxEfLkT(2WXfFi0gD{120bYzHvJdarWCloGd@Ml z()u@Oi7n2&YS{)DPR$pN>Pk$ zsz8+*zg;vv?NLq`%JvD=c#XJl*E90$8lEi^X<&ePL8LU;^Y7%}f47jU(Cu|z3Enc< zE!AyyX=EM4{TOJ}nM^P;Ym?0U2VCz%K0Jw7!P4_lsC;qjF1=o@Naf;ya z)$koV;0UDqvIdjFn#TBy&d|Ihn(Ytm&XMM19yN&Ns$wRqnM~k zwu!8WyFl<9Hh;0E0d$4@r>MF@2_iK<=tat`r55IM_?;Jx7^G3`zVjj+k;Cg!?&de& z`)$5!IAnCOV`%v^uppU4a}9Pg;r6YH@w9L|?Xw*?C2q?ldf#JJGT85NzfGT8Jk}Ip z#2Q6blfQfa2(ue22;EY>#FM4nk*>#EZfC(LI@amhWHjKpOEa;_1D=%_a*1gvE@HDf4vdPmr_AB4QTUR z7?t3VW^rc~ULLf_t`Z|Hp{{a(?%(1st%jY)#~nb(f~oTCge9sZWKbRFIMGZjXSF1_ zuGG~mCsbs3ZI#;oz)wiZr#ejv|3s0;A7~8v3h909!Ao1^Ug}@zc`T*zU z2#zieoeqBBv(7U?6Vmw-DN3krek86~uagDV3|(bXP+T4tH7;-ZKgZ=|jKOHh(H-9( zHj!;!ys?Ct(_UF@c`(_{*qSnd7*s1vdut%2#u4M@x~yRUo;dqd0B@-)S`d5il zKKRPdlIm;3DMw6+4{-{F97eU@hco1kAW9!mn zueVnGjZNQqpVp>WOZ>!iovFz&`CS3}N*5Nm3Y_P1qNDv-nA5@@9^8DN%2lfbtCHhu!q=ha(I}oVCNX*6?U?#}Z}>9~+%Y%( zD32KarsQ{lwW%nDUHO5Gr=T)mER`WM`5< zL4Vfa#&nFUxDTh@TDTj|dn|=X)NeZ0cLoQ6*4K7*(9BwZ3fmjLn>cWolrp_E$YI^j zq)mI!uyJVHa<228u#UW*r-pA)s@uET`P_b)cDLU*!Qe(9Ls^OK<`K`_sds3FJ&((- z`Jq5qa(XBy3xe=LuFhhpfGK^9>NNmTT4`Bw4>zvEx1Dvsx#B(Hl{o6O?EX1-y^)G; zVy6?3lOJ#YeZS!_B<363R_xAfnBEw=7^#Rt)~B#0X~zdfqr{6&10DE<)#U^{Fp(fx z94WqK13fGAS?<|mYv4Ic`iT39Ph#BUIG>Ole(wk!=`in?Y7e*Y?sq5bz^k5)3@3C_ zZiz!B!`StGwUz!+*VknMW>L`Y$AK_`7c$8nw&2@LNNDQIEH%#e$HN`xJk+K+xbpxX zh;wa)tE;o9?V5aJjFREB52xg+)F~g%#UAq}BXG$Llo&u2M%^S8Rl}CO2`7?;;*-@> zYP4?TCm%)j(EHvdG@A6DXf0l_Ou0)EU{j1J(FnvydS`EKOn^hd%4#0TEii_Z_(}1DX2<;#t+Q1vg03CboNd$Qvu`F{y3V^! zoOq?!{#5KnqFQ99+wOARfOK?6W))sP(RL)v>3AmKznjAHz#jMwIG16}kx3GZda zjQq+d;a0r@GdR!W#1k=#1P|*~eaJ8c9qn!g=(hQ8%Nk+(Ri?eK;j>Ckpok#}WNs#l zCt3|z@|c}#y~jSH_(Pp=pcYSZ^lJMAMq`YHT7_$oy^|l>@F}Lo6Roni!KU~@^n6}hwIO+9!E;rsA)ZWI@-y%MoOa^V8hEa*#)PMblfiq8YLXpXJD@#U9yxgPP)3DKM?2Y!kYk9Zk6I%6vL3otOaT|QC?3T}%-)BeVE zt?HP{b+RipcKZsb1-C4>q*@zXM!`b>FRO`1(aE>T=onDlZ+83Y`|Mri{j3$jYK6d< z^+9@3sKw_Z)e&EkaiR92cG!1;O2w&#ZsI(t+6WOs#}2i=&9LLQz~eP*GMX<`=OD2S z2{Bt8cLyoWkBYOjR|+KY`;2~JHE`%##ClmixOjoWK&3>TvTr;o6XmEik^oOjkU-70 zfHIs|rdL|!JX&|oIw~D$BetABY}0s5t9VS4u{`+;h%UGP|7d&fc&h*Ye_W{}dlZs= zQYu?nAz4w0rU==Tz4u7M5t$)7EtPo)AuD@}tZcHfvW{^ae$UrA$LPAczSs4+KA)dI z^1i*B9v<_4zds&N=`!%RCW^n;-9+eZx+R8jYQgGVXMY*8s{_2#Tz=I)G%V`}GRH{Y zGv1gWxIS3Rw(~Zch-$2mb#9aWzzxxAgT>plGel%}8z!QOP9Dom?i{sG7|7VlO)hmm zW4FR>rOoH&zQXLr>KV?E1$u?*%^%l)F94GH_7AdqKgAqG$nG^*j!Fj{oSjPIIY`^{ zy1{*`hjsA_9zG{{bWNDG;Qdt8l1PlClxXgY5{2}Bzx0SUd!q59>4ykL!P5^il3O1v z67?8)KgUWl@jz{Wuz^zmt{nh(T4=Fd8A}WqpV%Yv+89DI@B}t^{2I~R2PV8s0gr{Z zwc+iJL)~`|O8tZhtJWMF*!-wHM0vA|EF&&o@Ousj`jPV`an6ltx7@?v9fRO@X?030 zk+HVWff=$BEP^>S!LeT;vz_$isyeMZG2Ep+#qfJ%A+57lND{pJ*i!2#b>W+BGIS%- zZ}BSi(!<{KQE_f<^B-X4uc?|Pu1gWM*qV>ll~%sQKo+yprZhEmpK6)+A|iAN21GsN9KY`Vx>)KemYZ41`2_%gLZc>ijOY-v-P{O-?nCW2E`U@SP(1MVLso=3cX^$!mY@0>+gBtS8DFunP0Z}}_Z zbY+Hkt`w9jkAib1yt1!s4oM`^ueI2}{Q$!Fj&G9g*^R*^x$^4S1osH_7I5Td@#%EM{(CbZ=F@zPAe__L%Yz-({wJ; zt&YQ*BNPO(KuPuFmwSsIWjm4efde88#o#UO3f$2!7ngwwd&*soopc~1_OsE>H9Aqp z&RMiGWKb&T4#=l5pkOvV;>62`N-|xk;w}1hH+fzE7{3d&jKgYN?x#0n@^kzJb3(TE z4^PJN2>blie1Bd!#R9fhHPvZ1gQNG0sJ4e)XkP?Z*yM=Ek2nS}PLie9=nwm94c3Ugb8;b*ntwM!mV7Mc4vg1#HUWeq z&%A#P>FMboTo>}0lbdW~7c=>@fSg$%Y$g)g@-`X@(_#X)5X?oMiIyS%5GZi)1 zk&h4%gl#mVf31w4F6ek@?LM_o64fVK5}&`IK;@3eME@SFB&hVMv?nCHb>LAb6vaLi z_sIH%h>*$HH|j%%c)*LgAW)$Teb|@IU2#Q+!<2#_2NA?N%|_B*6$DM_rM3Ae@YYsr ztg-eo+l1TwY1z9j`j(#U8Ok{`UfJ;XU}c#>Xz() z#Mro03*fdn+0+*-%&7~CWkgh8r=7i{Ts#}}!Po2+0pA51=ZUZ;_a4}K5GE%94h-4$ z^esyPD*Xd$-^-ji54Trd`DsMCB;!$K-}FDjxNW2-OCJvE<+#qCw?anjUs-O6B$13< zc`((Gv@-8HLuClwwf&qy@7!f(`RiTcmL%{3S;kLl)3(#J>v}DE9`2O)$oeD+0}Rib z?Xe~Sfm$K-qV2-Bh-18ef1>ae>3*&MgPYYc03w@v_a|hVs!_Q(%-b%<-peCb|K8WGiwj5D+Y*HzUv= zHMa`H-&G&YQj6>?(FeD0{m=M)v>i*k!)qt%M`!AMt$urtUe#{Jma=o)@MQ#K#_{*A z6zX=>34$k&YY#-5NOqP?t}X$3zj|oA|7?*{pX;wA&h?*;&%yXt?YkBd3{&l@D}GdOJsgKrejunMs zr~ab3a1?m?|6bPM`yzk$`so_BCjBxX>%*VbhMxDBf$~N) z4AT0XT5;2wocOxg^KN`>>yiquhXo*;Qk17=O-^o$-2n6sMHdcH9Rm z=+3m3ylj-k#|1eID^ZoC@G1PI>=`fptBGfT{vs zN;S7dNeSQJZ}!<<0mojf=bq7EUCGfF35Qe}_~XeO*_Ivr*USpW@D|j(Me<1cp#)J; z92PUQTU9-xvo@=(jNjz7CdcdWpqwd84y1L#WAfC@e1TS@Si$0-@3TEEJZkkf@gtzL z+;+&-ZMlHB-|0O(I0XU!O50ZAWaY0haIM|h?{>XZ?A>iW(*+{r+Ffqw#G`$W$$FYNYzAMB44S$qRrnZwPAN>SX4JWS+HYkH)8y$MYs?>l0Im+iF)wSilAEL;{P z+m4f|^(ukmTptJgDDKR&!dnSvf*LtUu`$hYnd_XZD1^MUDCPK4J>AR9icc42$JPesIlTvAw&^-T~WF#SjD_SyVD|a${ z(epJCpC=UHlg2OJqFA990k`!i2Bx8$_%wNcg^^5+DR!+?p8S46&J{~S`aXScaK;EL z%VBBbnIQCb;3UmS5sGjL_yYbr;=n+SO!GC`~2lX7cu}pDmdm9T}4A=bfDwgn3 z&bQ1;^O)qCJqI_MP+JoLhk+{7&cn*YM%Lce3e`T_%l`W3Phex8U&aJ%k@4@dS~tIN z&B#KJpJU}#SSnud^*#xaqFIr53LoPVF`R+zAkOX6zw5WT-?>LlZ+T{6UK;oi_#NPZ zqB_;{DpPLcW{dHDE=(~@HF$=JCjNuXMB|E*N>lLxqjXnGNxNIYYd;iJ-{F_ru+L#v zj99xXo}VSHALvhlo(aUV;~bvHGozvX6uhvx3}z$#7|Q+lU$E<_1T|nq@X(zNAL^ax z-hSXk@8W-SeFDeQMM6pQ?nX>Io~RmTJn+a&ncn%S9k@M!+m(j=^eA)e!2K}_Xq!7R zd#;h9Rz5IFN<{2t9~9T}Km4FmE6^z)NG9RnGwa%CsYH3_8ykxm0=&9(KlPQD}(dc^kJmdK^AGdFkEX{~*Z5Jb9eLJy!q|E{u@d}irA z0;N5*{Nh7UV&_SUUCRGYq8(DK5D=s$ZbrCth4|9_JZ#tRfORdJ@d@Z~6aSV7KS?{g z%~el7rDLF)GkmUwPX0@6iL6`OcofF}8RuY!M-@CSGzCr{E@w)by$6;|$ap2)d92v3 z3|qs&OI`;fpN@c%cJ4}ChbMX~+cDYP=4X5K?}$ZRrTCo zn~^vk9cff{k?>}o>s`K^bHDEBA(4%r-#T9)Xyv?EkUmcqaP6wjgwJf`0hl-WJE8h1 zr{SQ6=dWJPrq+pW9iEq>cHT;#dUvM%=ZD4Sz_gE9%1;|GOP_TgWW5flrdKd?S5ydc z`yHgGz(9T_@~zuM`ta?1vDq`WEU}{!CztnM_Swjcq&lp6sP=(_g!;-!3PG~QYY!8q znPP3YDoNPkSxM_ToMFr^Is!U|RO-6^j53(nWrOjq=NhLMndRmF_?SNT;D&F;THQ0} zK(*5x{;ty6sggj(jyTZjCZL0$Kj09U#=vkk_ddswrExnrMBm6zSO z^5U@KttQ>E4SnEo{i=?DKn4vy8j^M0%Y&Lttfo}pQxLt}e%%>%qtv4`hfFCi58rR0 z7x!h?r}t=_@H?@O%kRl>FB_L10+Gr;znRmK5U*) z|E<}omv$+oByRdtGda<%ChEn)4*jnr?9oWzC3!O6y9EpTm#Zt0lh;C1($|#c9T>=d z=jSxM{l!}NHP^P{QG|4st;y2}>3dE;jkV7NkH9r@b@&sf2&^33eFHCNF6)Z+&rPt%g6#IVYhOH|4I}(qPwpx$sL#WG(gL{S2x*pA8hwzm3!1^3j4GFvj!+dQpzA|L z%|MsSdK{)~=!Sep1x{XnXIDr1Qf>d_pC)7juBd0@QFf5a?*&p%kqtN^Kq~6Jjox*0CpviqzDxU+yJc*PFq9vb7AQmD|ryVco!>aTZwl;YrATUysQFj|RTp zu^zSMXpP*k@^DEx=l~o8d~cu7$_VPsJnvrg+$^chUAPr0V8zN*m);qQ)G?J6wl+cC zDDX;h(@0LVAXA|Y0N-t?)DzHeDzN>j<*7N%>pjI7>H|z^{ca;Og$(BM*7iq}Is=Dz z#}U23+rG4|{KK>>Z6o1*qke>K8p6I)+0wdGvRPj{6US_#HKd#rtTP*W+C2|n{)9;% zmdn?gNzct_NVoW93VqiYkou&0faetSF@MjnZ7G}?agH8Zc4%!$On6lFDXq*Ou`DO| zxb3BUZ9viBegVC=Asn*@-I1sej#M@p#0Y5>k@tTQ$(K@((2!sqR$0z~R`>IFy&$4{ zc{fw3!qn>{d;Qw{mu5VR&y|II1mQe`oU%9I?)pLX`dM(h9xA0I6?S$ey1#$~n2?z3 ziNRP04cC*U@te`H1Hc=HfHyX3Ek+N|2olw+Sn_1|5}bsB8Rsg{*R7u3!Xt$qmh0?H zF`v|pon9wnAk7u#5MOF(04^=RAGSaD3RO1kIieB0_iM&@gQXsjU<`0 zE%L4Gvh-2;sr$`jxxpX%PBXw?QCJx*$mMM?{{8lFpP|w(Mp;RaJ@kfE75_9OhZOm} z=N_5#nrtAI%|BLTo1H;|AEytF)Vx40!=aFV^4LR-Ml@=%`j{N}G;%QXqM9p$fy?*6 z*B`QBpXrw>gLG@Ue6-JEgFc6DV0 zRtms)$ijx6>>l`R?tqpix0KH3f~idT-00)@aBe+JRvw8gLzU~5*0G%g-|rhQRpoqN z=Z`e#4}xdJOi2W+&K#Gm7Cr!_4<$ABKkX-HAP0hZL#$-*afEDxng9n?2TNE*(Mvv* zp0&aBr?Ho&msA=#bVft2$1xg=?s)3#K}>#L4X7z(!=huL@DLxwoC|*xAuFRx4hNnH z{RxN~r;YlpLZ?D-r#PX{%!m0tHB=}NIo>Z)`96(rZQLb)99pI!!v9<=O+Zckm~*0~BtBI99D%}Q01MF3Z*A+h;Eg-cEUU`y3U zFrKFwPw2JIX%`Bp(5yTzR&!OPQKcg07$mI{ukHxkt}al}Usv-+P;>ck=mLlA?a|-k zmcSn&-%WbSN(Tx!v5yb}SE}IftY~sSC!{Qw9#k{(b1F#K<2J1{VN(m**Bl}`CwgSH zvpFB6niZ=woh_b^}XsyIv}F?e@tHAi)0%ESY1 zwRzG`68Z8(mNn}tD{mPVt&M2~L*FdAh1IX-C02Hi%U;kh=d#lgCJWw5uXF>w5ViWv zugbRu#(&{MKw#j8%ma%9i$_HxqHTD_j$h{j&B&gQtjEATv)-5Jd>!>U4CO~xSMcK@ z*D_H-BeSAyJ4GI78r?v`Lcu2|X~>23s-Cigeh25T`bPyFhB^bWSzyZ7HawLH`f1Sf zEbwh5nv_ZlU9VdH{p(%>ktwmjWj-jO8=#F?iTHl5a7^gNWP`eGja(O*_hoknbtW?X z!k8&QgRVkf4~DY4bPd#O%!lEIrFV!7Q;Uq;G%Z8^L)^m_BOOOT+5k4+veK+BRZ`z4 zB_>?9Ji*hZQQo$&(Mh>fs+ak)0aScXOw(}h(mTa1;F8l^dDY>KGl#)<;HMw6c8C{4 zV>8nw;+}Bp*qDJFhV202=u~6(m+harMKgAxlys~>* zq_$r`zcK_QKt;$qy8;F=?s!W*yy#k2#LVuL|ked?}vj1QxGxo;%u%FXe`^5 z_N!7r4tW%L6Z#Y2@UPGPIuDP@nqiJ=sa#5BhDvYi%$n4eeU>>Yzov!E;`%AH$AMZB z?ZnZKhqHr+Cla^xvR=EzS!(=#VSK~#EerNbnsHUU+HUm@3T=hA8lAoOHMvEa`$m(K zlefZ%QPhzCd;x{*b$rj}P{3gcPeDB?F;#a~Aw*Kl^oE~-PewD8{3>d-OR`HtD)Wr< zc19lh8+KIdw(^t6ORq0K-XUr$643*W79h#DEQDCsOca&~-a$+B|U#P=MeU15kn zJ`TN=4j8UmK6toMuXd+e*C4d{i>WluLcXYYYQnD)5h1gk0-u0Z$J#O&{J7mcLTw|y z9ziYqkq)-7(tIX9@Yg763$u<@2DK>~SwKZG4Ujb_s} z(YM-ED%ErMMVg(x2$DHRb`Yv0d~Wl$7kj|5CXOPfxtYoyL#ucPw{)>25G(+4)YS}@W%mkR6gmwUXpu{N13WG1U1Nb2lnE!UBU zNlQ*il&m4pu{EoL`Y>DzDW`h%bKkq}5G1aGQ86S`jAwYPfcKfH!WcjVfr$PyEmkOd z)14?87HBHKYPKbN-s)#xVyo53+L59> z`lDmHo-XzKP@zV9qKKz=fl@m)Xhl#4L~r*E4<`c`uHb|w&zYA*kW<>Cq2TSBwhiTX z=+*MbxMS9>HTI>mYSs(HF4UpYwX6_G51me_exqKYSwjiTv$xfDVwY2;=plnze-B)l z`@`iB2!of>0j;d4$HcoijsDhg{bV5`t+OsB*zOrSeQ;RwO$6llL7$q7-*!q3m9Pl6=F79>9F~iV-{f5V9R-9pwywo>+B3uK{uq zC{3S=sS-pOlKXv8$VF`R4FHu>^ecGTIDn=j$n|3xYIPH3vrH+eS4{`Cq9Kvz&N-9) z{*sMrJ`pvUnV6&4;WAG~&;al3XY(Tesej?10u7+W0ncv-aKl+*Iq63tzyDPOji2~H zxxF+eThtrW2%4(yuufH1V^;aEg&TJdn`LMu=WQU}VcStu@z!x8S;m_#9v)lX$pHAg*tDC?Vmxp4y7}$K~m0N8RJ$Du~~}m{iUkFH2Q4} z0pzAQsqGX6^~!s@LkBY1D&CElZM)$&lw;YfoF+CtZrxlJR};4p(K`*r8^O~(tkgWYh|F% zkT-d{ez8y(H*PsVP=k7ZYqdK=pni7n$?0A{13wlufLXi&X}_<;!&vBxvH_J*Io*ni zWjAt!RFKZhT(SB*^W)Q(ocd#H19P5$ZwUfHM%oihjjt&$RV!X?9)LN+LH+>F{SN_1 z_8i7j_aL*=jtx8iy9x+l+YbD=uruTC1qXl|LXgW7sUZ7De{GCQ_I)}97nHkPUetwT zz%`!sv|$gLw=Rfv3!^nT3Oc;$x-WQdS2h1I-$S)7TO0J@?pQ45E^?d#+a7?TX>}~? zly1>Vc01civW+q}6?{>8(gI6L`Ng z?Wodxx$D?wJ|`D!N?a()5pZymu6mqCUMuHKXUJ?8gv|^_Wk0C>GxFOSpjv?)I3lSS z4xxVHyHBXI*zm~6=1OjE8iIviaanqEJ@+rA>hqa88UCMdNmTA=}Fv>5r1cKaRH@G3bdCS@wl`nca zF{Qi_7zvujWM(~Q9@e~iQVr6RqdwMdzzIIn-up4st-x?$T{8=$CuWxiRS>qKF>oZv zAM|4?=L~N6npR6zmMxTbPo{lP<)a4co^>X}yx=@E&L*X{>u(q$9E(t4 zeW>W=7Qz6pTMQ{6Xoi1Afl_$aqw7LZ`~DuPkcO^JzraVp6LfUC^zwUVcx}7CpofCE z8Iag$n;bxSuFBZ6gzQ7tB5TVQH1mp_XQ9*t4e9_Y3RwoWx|Af5KFwo$xusMVol!9Hkz zm>Y^M#YLavi&%r<8~IEd#Zyh>SvG&n@t|kT1hfB8us*Yn=_LSf;s#gzoP{rux(C5u z^e|1rE#bJ3?Wgd4emZ&J_HeR47{?Mza?bQeNO|*vx5VC zdZ_B?>R8mk!_2(o>d(uZ2aHp^^a|@W(>Hagr}MaR16j0CkU(rA5l3o?r*#%jg{|m7 zZY+Lytg%6v*1QU=%vn*jy!cpzp=))6<@U&iW?MW;5gK1rr(q0XYn4@p1i-+0>ZVyT|e!$ zp|_K1VNDw9W?99@=hi+IbA}JCcSo62M?XSmnO>#t%yUygOIckc)bg8{(~cWtny*<> zRf)@8epJ}-d~O}(Iid2&vUXKd^vCK2_{)$1Sy9w&u4RSJ0qqHL;{DDe{*BFz>9NM8 z=0(-ZeJ*XXmC@bfaIUEch4f-NwdyE3vPzFdq@E!9w%}TS5^?|ck*PL~3ztd;x?Im^ zEuO|`-rFsMZ=SJA+{Ew_TE^t3t^4KhTAa>}Lr=VRX}gb%#-y9gqjC)E^9NjHdZG|y z10^rqk68P4UOyKO_4Q?>3TpocwGs=HAU`MQI)hwwM0ho3|B^E2Krh9Xc z*%XE~Zlw)Ta^Cqz<_P>B1r40cpk(OV&lI)iy4$#L@j-pY*G^-|LyvuNy7ySGnHg#x z@X=2ldhNuV;PU=uTvt|8ryIKu_tU0&yM~mLEASb5YN-6&x$uj>NT7@LRpcl&&6f|8 z^-@kw3l7nT4VPjlyT7kcTth{Q-GP;?MO$dMi4d5-`%zrCHP8coW7+jf)S=R?FXgR$ z&Q3@eEyI^ViahuD|1jcfle=uVTdkwD?y~C(Xf!u%+3NwwQ3d{O6>xnX_0XII@a~XN zO~{)&DD!EvwKvxe5SrzwST3h{q<=KV_NdAw<83~^Wc8=M%-Oc{zdPQh(N{j(5ePNK zV^(guxm!z4_V+_{%R(yC+EfnfFzVqWAA*gjIHi_2E0Mrm^?mePz^K)yKQ6Uhy|}%K zWQz>GFRW=~+<%#X`<;$ubI-@jr>sBMQ??ZJs!V* z|NI`QSKnFRt7HWlBpr;_SWaPHPrI*!lrTE zgO|w&vLG1GmHUgN1ul=(E9rwCG~PY@Com5|`<}BrS-aROs7H8~1dn4Wf+p|_9-9H} zz|h8&r}khJZ4pMmS!>laMJ_hA+4w~~;&t9u{ed1s^gfX;Tuz*hi}~2cEL%`P4|{EA z5k9g$X#eSgrv8J$=)gMkg}Y3=QgLzp3toNCDzP=qP5S(kaYfiL$QwGDs%TrW+$3mL z;}B1Nr^aA#*%;XOSS0s|<4n=PejnDJ_0eCfOv`SY8WezEvpRD&nO>GMda-KI3)=wD zgm!?+XHfA2!bB@Ts2L2eZ{*W0mZb;mT9=x-c8Z8n#lie^?%-VA53*8yt1VkYNle;v z&G{nP!(VC_JL}CdHj_?loPQXpQTJt|Pd5DiriGkbMF6m>l!g=wqxE@^Tyi@P)dIwG6G}_g}+TNVVODm^8CxH6nlUAaqbB?&9!9Nk}i-dKyO=f z@?5G6{Ksn4kFIoe&<3ySU1NvEKL7SoUZG@Tv37Q$ylIk$b^1jRmRZ|J_OTnCpmNvS zRPNHKdtwSKIEO_wNbA{l;^6R}k&;ZOpCUhWe>K;sO9Thp6|3Dsc-@L#i*Jtl=E1== z^1~HE@fS(0Art}NI+dVvGB}7N--pK-5s0PZgPY?Jg#b}uWC8Vyo!o*dm!@Nm?i%*; z{Q5{Zv!O%DW|x6>G^nnh(?pgIU%pPR-kUY56kVAyU`k|PtlH5&aFy7Xdw9->Ldnvc ztVCIl{r<-6r*uRO+k=)@t9r&)IjB&tsIjI+l9m`Pm4`tfG#19%JFWms8%o>6o=j5& z|HM4)*TSQvZh!HVkztwCmG`6?3c`+V1=v?vQT&SE2XY@}XrDLseq_X?kKZUpPQ zW?IO^fDU*ngtZkh-xJ+h^aZ;p-xKvF`KbQ=Qmo=)MU~J5jc-w1UL}Uhhg<8bRX}_z zb!bE-1u??^7P~4el(s_n07rI6XXQ>qE_f_MO1N8NOfEVv?}!HP^EH>XX1)k#0~B?h zc9mx$W^2j!6`W^daOl@uw1gjbhv&2T))m%-L808NS4OgQma+W>A9J6jUgoNd>?uY+ z^5uD2!w<|J_~T5mm7HmD%=H$Pv&3p*5Rjz@2xo}s!!dk#*sGd<+vfuS&<*i?c>ZMv z?nWTGpj<(&A}U#w6ZgAQ)!*e_qDM5J?iWmZZU4e!la%FGB#!!cthj~Gjv2GioZ|TH zi=m6DfP<1k702K@3gqNtXU>eEikt6rwz$^!%?LW=8)5tNYI*|#i?vDXqU(HL^yI;qf(B`U&aC}Vv7a?K(uHbsm)L{Gmy)OUdz8qH-`wB=L}IEc`JnG>Q= z^r@`$b;fyi%ibH(qc7B8mJ661!K1A?-Bh9*jvHIWzUYU8uWDMABLpbbD>6u8z>R2( zUy6ucB<&)UF*bkYp2!Vt&C-70-y zt_(ELP5OI$I3CK4c||h~Z#1Zmk->8O^2?78%zJBp%?O=;(NCItf#XH^+?rid(yJ_* z{*`x@!y#vwOYx+Ik;mjOpgVG0UZs3(aW@{FK-yPGrOv#EB{LgSEAD~aJGyPDXl#xbru2V?GNPMgF>iXND zCrGe$;6NRT=Zao%-Y(Y^rr9Y$XjQC)PO^m)qBfiF zc+0COTMFrv7}lD-td4ry-eKRP5(LctvBWdU1vysWSWz`rgI7;L(9zwv%@!@6`@Ltl z<_gdsrRy*=q&UWuKI?RCnfWapF#MWyzPt;EV@hYM^oDOEz<^8IhWIIrTI_hyd2%~T z2wsAc#2t@P)6|vQTOqTNuexmJa}-hv;930zot1;tliX=(JXV8f%1NO(E?7@TL8s4s zqyzf%F-G#mBcZ>+RQuJWICDRPc-orDUuG^G9*GBj_b5+x`DzGm+Y6L~e;J(5X%CA?^K?6W;)ELuIAUH=vi;;Lt;6cDB&Gd|`MGR_lQZ-^=yZ>#KS zi-o6*U=q1d5#!#ARg1F5UGoPaKKhOBx$ywx>BNt}v;tyx7+5OpsJaK9)Y18~#lvcA zLrY7Mhj(=l>SE9U3yu1ni3o%pW#KW1Jpf$Qd}WM`!Dyx}9aM#PF(a~Svzp;(!2lv# zbG@==;u~{;AZey9d;4*s>$D8S9l~AinbN&5mMrqxdb&EBWb%H@yiMcnXm0TBJolA- zkUc*`beH}BHWT-Pi9E90VK~UvA!=Z) zcDQ2Nc3$8!y%zQh8@)#XQfp;?_qEVFPo~b3G0kW#eim$2%gkZF+8VI5e|?_x@HAgf za-LwBa0R5MpqE)kuE;t*RLfHIp6P8u=|f?TrB^6UaJ(K{6v1+X73oscee}ZyF8b0qI-F<-ZZzF4M!q9kaeOC5nZdi`*BEV%rSlD7;a=!9a{p7HB2Z|y`l## zrLA?)}jTv*;czg_x9i4o|R}j{D^{t zD^RcdhP}SjM7@codB6sufGE0uxm>gEv*^z(sBEKq@DsUPeX_?K3g9lTS`S7xUg{>mX(B-z%Xy6R z>lwf~XkYsan}AaR;PqvIX#EEw><>{!s$@kVEhtVLoEur^V?#QFCcG+jq!}2P^2a+?9~HAwBjTtk~pV-UMQa*3$i_d*RFU! z5j?hfEO1CnGvz+p2Y{Mk{1G*!AP0k(7zqFZGSP@orGIiv)$*y}I~nXh+S;0l=kGZe zMQW(_udt@03T+fLLg>2sLJz*vzI$n^kW$IvIje)R<(lsJp*OndHMCH}Ejc}C$jup) z6Fswh*hBKKbl@JW9pb6IGI!0ojS~Xd)C;5@B)ozw3K5K;`Fe^_RB&PVRFlpen)-WL z9ZW_B`^b~S;#y(uS>(*PFkjPj8RsM=542hc$hci{z;Wxuh7tY?G`Nh0Bxk5;Tk7ch zJ-P&wH@k}cuyaFpyp-5G`WpwsHZhdAnE+6I-6wfKpw|dKK58R&pE0wOY0Q*nj==s%lON>+O*%m!p}5a=Vzrv#LykRV`y&>z7nB zeqRcJrNvBYso_WEa&h$W*hFDxmgDm|`@P6XH)t||%p zdPUM)E*#IWonAjo9op_Adl9E}Nfr$9kxSPbH{jrMbKiwi{ZDn8sw|5zX8rouc|D6Y z`8ac(fZCn)9E%oqv=&V(HTk_Gp&_77tCB!2_%}xXzYXDay=s1tuN#D!NUDPJ6;)T) zA+DxXfc#_FCanf4y{F|FW8p1^`-f_|lip^}ts6jm$D5IIX_2xf^%|%$ONu%*8k3OA zQmd17Iv!O#uQuKFnCwUst4orZ2YSMX7H1JbThoW`N%e+HlJ6C-cJ^sQNK0aWoerj0 z;u+34f7lqIZm2SW_=QFY>d?x}fJ}qRV=@po4#1e2Bf#$=*m}3RDB2VSnNFoBoIF-_ zf-9vf%P`904X@Uzr#wA^TNfTyPrpVeo&pW|>+cei&1e6j$JvqVU{yO9AHbjKQ2l%L z*-5yd6@aHr9<*L|XprCLOizk$jbA;C(NkFOSeHLzmMD$qYfiR_C%)*X;v_O=J?+qh z9gk{%PJ_z)$vwbqkdWx3>8~;}K~g)n$qKV;j0p;FG^9K{9j6>jnx2J2TS4u z!Q;@3qv_Glh#OMg&!c*xL@Ke`yW#QP>DQ?t>p9~R`huusf2VTZuVL}G@a-y`SSBG4 zFflv*B3XxNFa!iBWw4u=mNiQX0iR;%&n(dBYF0Ctw%L-@Y-`fGC#S1Vu_ z^2_uiCrCe$DPVcq6^dts8E?H1i+C;@g!FSuclI)DtgaE?f9Y1g)Nv#s9h#pZatKV( zvx6Y2j%s;&3Z;JPV>5*27OY10RChEWH$@>)I8fBX;e_6RO@NROz@{o8ZRxhrq#e6) zNG!gTMV(c7^R_QL7@kEot=65)aieM3pz5BCk{d}pU|(3h zSpqAYD526E{Y;D3yG#(C^@ft^JuI9hy8qXunvsCxo#*O$09K?FC6X}|V43j#KkY`PE-`j~s3<3Av|A~zl zbavaA@Q%$4zH~K9gi_4JxF1p10(09v9Y+N@3FIOn`0|c`icqA(dG%iag}Xv+ESd|c zPJluMh>bIWB6d6&2xE0daXT&lM42NHHKH3m?v?oq*{O?VD3T1viLjjj;mxrPU^owc*KiA`-Hj7sQKlm>d*w$N>*~Y|BcswBhGVQ@1e%*$LAv zvQI9^`RWxnV+DBIq6!!&NBHWsQy&n4+BeL)BbUb$Dy{lgwJPH0i53CYD;sV;e7+iP|!G<#_pd)5fAUs8-^=2@k|| zvg4gWHaSsNN^bpI#Z%QHTcgfg__%||Mf}%r2)Ps@O07Oe2<$<9PbBa(Bw4Cij_8!} z+>){P2=!1R(iqOSJc-jv)TpFITth%dNV^0MzkXT1+5Mv(Qd_$XC&z6?CA5o)JGw{qGVFzR_ z^7nM;iT|dF`=3v-`*pFMn(A%j=;(|ZeP9cvYD(RT6XvCLQbjR z8rtr-a*sA{U2aH{2V{SNRZjhSK*la}4rCVmM|{fG^(+?Zq^{Y=pT3f?!Ot!a__ZI0 zXI%lV^+bpM&|Xz5ewg1KIe5U<5hP=^vgqrm;ufCGSiD$UmviHkMZNlJT!nS2}8sf6BY|AB5Z<+BlWD1{b7 z-J|l;S1pc<&svsj+y&Z@X8B$af=ZxaL@8OWl|iU3Xh+41*%({c7&*6=jKi5n{ea3# z7%0KFQ%QFCTv3sz2wGFFmE7oMi%w9YqN}UNhK#*AN8c~A7Wl6E)XVpU{}N$!VSSs5 zX;)AnzO)#KMOnCIiVC1Le?AS>_I8P&R%d|PY0!fJQ4dyU=+foz2oH(wn9D$u$%Eqa z`wA{U&O+nFr;5xy52->Qe2RZsa}h8|sbr|HDu0oaZ?8-IOSBlPVck`Z;ki@Lgh2!= z_{%podN4o{(c&WZbtr;)F%!JT*V zo_RJ!bD|WG8NwJjCd`krVZF7XpG&G_)2sg5I=mBFwvH1D&2K4{wwZXSW~ysX zOa~PPoE}g~wny zbB17BBe0Y914$uY+g~UShm&S9!>Ijz&67bngDe+F;rfje+E4ro^A4>iVtZ4(J)lL< ze=Fj&pzY*_)6{(EuD+kCe*vqPyw-YABJ^Nne|n}ER(Ba~p0)LMVp%PJ{{#UyYJ**U zXet|mb53#&xVj1*QI>NvWZf_krxVCCh`GWW__tK#?Cy<%$8uc5RhqhOKnveXsqcrFLm7MVp7Krm}u74(0ZW8Pm&H$ z-kfYcDPA{jV!XH$jfxJYjCF!!$_CROGde=0OTfcKV741_fRLNs00@y#n4SJmh$XNw zzAHHFniMWRd%6h-(?U1x&R0Y+)8L`evY_Vx^?h^Jj7Sc`Kfq80Pw_J+0!%%FcIs(J z&#>c82i_*`drEe=$B{aes|)t{Q-~AzuYTZ6Wcyu*AZOaUhPjsv|CitocKZXU%<*yh z=g}8u&Q&js+i>IzgoLey<-6<#4jR_y#y|K2z!_@Sh z5x4yZi3(Gci-D+>UzB>%x1OzSEZ;H#k7!oh*j#Kpgqg@Ud9dMt7sTLNSE@oFZiKhK zW~8`7s2r?h`PN#T1IVv0R0H=~7kf>16hIkxr4vxr?CV*>&0|#Rl4jx;Ar%Q%2Ni_9 zZx=?mAjR~!CjwDXh0>7wNs{Zu#*Xmp6oSSZIJ z)huU&wWiXq*qf5wVnP7x*tHTby9ew&>xHMET6-;XNNdkiF#5|9Q-@lCqL}reWbo`y zQeT|r)Iu$Elc;_}ZJg{i@Mjy}SQg-ou= zHpne#h=?ZO0uX{j&P^9hmJQEzkJH4ZOS@8iWC(4)Ie__vEio}tw_Ygt5~|$Y#u<0) z1!vTk3Y3$3qE|@TO2YLB(U93lNKMUf98B6xNcuzUe?ej^@w!(0X6r6Afv*AoZi_I{ z1yC-vTRA14)mWyQ{Um2O-)DS)0xDqH^97%tm3>R2UE#gNKmhlXHTZWc%p+Y<-zWe~ zjn5^3q9K1kGYNHG=@}}%=ZS`K`Cm0PNv}5PQP%UT&3DR&fl#jTceNxJt|@Si>$48_ zJrVHJp*(3=$@!>gn498z`uCh?^{=8WU9MYRXCuvgMzT}+mcE*==z|dw*sW&M_Ta;V zD)d+JY{5=TA*YFCm4m}&kbMUqHoip!()LJDQHS1n1@;)uYy>=Mq5M}O6D(M} zA~&JUWCQwlJ5`a|`qmcvn|b3$zJ-Xu$JSB#F4abIMxUG!2rDpXk5n{mK(e!c8Hsn? zl1Bc+q6n3ZOLB7Sb|xr+FCpXSmP)g_PBpnJE?;vJnknUxh&*e8L7 z9t+15Ix@=znzdz_O{sO-(Knp z7dvE#J2dSsbl>8$T60h2QNF!(67GIp82#d%2mkx(ZBKkgqv5%@ko9^a z)7>RS{Mq>26>Q%QXijeF@-X?w`SaK39h{ZQRz$~-GimGeUxLK=SsmT6EUh7x-}HO- z?Gd|y!Mhg>-eA6R>f_5gx?6_+YQTLn=LC=ZP?a|*1$DsJJKhR9MY6le{3mbpq^O1Z zf4+4D@X7m;`;?~Rd?7X-N+mawy%!9YdUF#)(22)K)_Eae*p=~*ndaF}1!~*eWR^9% zc{7{=9BtVz>&gcRxrZa}&JV$~hlS~7CSrR0&?BFJF6N10zgF@(P2Si02I2eqR&|!& zoj5w-TD*P&TaoK1^(s{sWrxxA86it6xK8xJ=h^^g8lu2w=c`e zLpi#9p?xl_kaZ8N!$E*ryzqurm4G_5DRUr#9e!8GRp%l5{45+^1k|pz^=pBE{{8dd zh#J@gUqL}XqMkASqc8zFQm`k2@%LT!U>UfRBw6PL&@Y~BhbG{@E_%~d>Xpy<&bVT` zw5D^&Oo~X|0>RfkcEq~{2 zXSB&FZDN%a>Ar!9eWB@+du*Y|*2NULZmYVjlnG^-D7eib8mt>28g~xDfG+SGe3Njx z>l*Adn8Y)6GQKSELl8 zI~*s$i6CgWAsTJVWmM^tP;Y1a0A(@oCEehaeJ)=y=Iy9j9;FPz)Q_14>f3PI5Ovb> zj0%gs74BH6pI4!?K!RG{g2@?0cR^P3B`Bw>*D2kooh-2ujmv~~z3M#3)tRJnFSFyC zS7=y*2OR7*?y{GHhaKp-eiqOsxcJ}g)5;?@7K@Gc-2%%(-k5YU>iqpZgjY$YXTcyI z0>Tt%kFP-MTF}%mr_nCN`C_*l zKjkdn)sBDA^@@9jUOU>1Yo$n17bVTPxO^_W76}@*@NrSUUDeAh=t9PysuK1C6)0&l z4~B&%vH~yqtg$)wKtOtpe=bLInjFiIbS-nzAV8x=*6@r{wfxXZlwVjq-qkRr&4(ln|5SgAo66E)<4#op=fXb@aS@Gg_JPxZ)kZ4&ZKNNW% zCh4ho3E(!wvkN&ZCP3&y1qy)BbE@j5#daxf(&`hDZpu;J_HDB5u~{{UpM9xU8qM8U zaJMr!;9}&z3rZr88J5$(?T~wD^KI)O49Y#4{1A%COK6TsLg5rZqpSLZfASn;oSl0g z|4=2}M|Souwn@oB}|AEqC!yNO?76KyQ`UEs9^Pe)C zT2dv1^eHeG^17drMhL~QSQhT4h_d`~#pwEWsg9wp?@C5FBV%s`J?+4*R==QS^JX^U znmc16Hp-!8ZrEFg{(IrjuDrp~y|re?R0uMaM~RD*)d5)_A#0HcpQZzCe==B%|L~hr zyMql<{NrI}oLmZb^`pH+J;iwXYX$=Vg0|1sY*R(sVF;aG`N~>-zH|?*{>1XSoWW`? zrrM;Y3+#SUAob5fz#zDzqi#8svDs=(6&=_CDS1^ry3Q8S5)~RFQ^|d}MJHvv5Hw(Dnsml)yz zl6z#Ry|`{?Lyg*V(|pZKg*cdJ3$(MoCK#E-XtGm8)O2A?V+cS6fuzk2b6(ATKJN9|SD)tl+7)kLPE~o=dMdiv3dl#5? zVN}w6q5p6v@1GbD>~S;D)#Dw_insHb^tsdUEE|5a>4l{>y11Z8Txod|2o}i&U3!$i zYKw5*%PhXt>2`_mgal@z9%{Ve+sP%WAgK=)(Fa!|S_ZF&I+>L>#8Z&qq|RU=FNA^o zp4sH^*_=fu6*|q=&n^WluNBREA)Z)+(8?EFE#CYgc+_md7o48Brg_HpO@sJ_4J%|u zAnZ%sy+1t@QKL5<=Y!P-Y?nU>$=|UM9P%JVuCzIT^TeC7bd7`D%?}WYAw5pRe^u@H z_RDQw1W?86?66=o{?rWg2_T05Q17sJDXx4eL?Fy`dOTBopYgD?+?ERJ+#Yn)vKl%( zH|za^! z9+TK~X8`J{PmiXk$ecG`Q%Y%0pR)ZNSZt|gk84sPPJEvR4a1Wsi>eQRKJ7R#CKfe; z^jQ~4cg(5RvTJt{AX1 z_FwGT0HNDx+$$m-D7x_Ft@SbR!Aty4$^x~{Vpo+uSxv??A29|1TH;%xb3>CRySD>6 zG$gpyvbAq8()8AC@>TJQy<5&oayJaeMJV_r>y~#rB{ji z;43K3qRn43@5DfM7px;{Gq{&z)@Aav>$h+V;8&SJy^9)g?xu8kaLLzO(i7T`#Pe@E zcn`;gsKlB4Bh;b7U2|1bp!u=J*Xw#-*Yo*!+#dp}(IX56Q>=c>b@Pzl zc`&Mf{={0P?rM+1W~IWk^C9gL_t;Q3b!ESga*ALkcI9miFd8*2BZxCOlYc0|FG^2U z)|NDh)e&NwN`X_;9tfRcK~Dk<)p&WyBqshG+!_#zv34qRo>rmuY%G)_ENu@2_miSX za1*tpD?%H1!VzZF*3XsxWsgk)**! zk_Skc`aR9QO9UaS?_K*PZn_3hqGj3Zu~_BJ{E^$L{r;0N2ZJ(+Ei3)aewEkSK839g zZzM-QQaO4N4j;D<_CLBzPU28nkTL7SUahQ1vSsJ_R87@qCfa-3V~y=7G6qM$(5qlgp|@#A5O=av*s4b*4Y zWTnwfki%v#>boetKpweRGT~ISWx3e+T{xOw5)+!dBy~~I%O_HSy?&}c6!RW zU6xw@9e0+aAz5>*Vh?c#vI;hBeLBY6R6US7cCa+k z@KYHx2ac*KtU0uCo)VOM52JA3IJ%FXV5w+kXiB17ZOilyY7bi{@tk=QT^@)pOZ!3M z_w2_YeK(yPP`&4aR6G|)S{Dc0W(ObgZ$&!F66~LsIV&5q=NVg1DR^g6b7f2Famrbk zV1vz$wEHMQf_5kevZ37mDF2#ascyV63axGy#(D=4pQXa{K;wSHYYYT7d=2h~Sx= z)yt^}hzwg2@LmPTv{xIC=+AMQel~gOV(vHhr2wASP1wk-nUeBrc$%3O_<5sgKJQc6 z;r&DX#)iwLm>IAHL%v=SB7-GZ-EB1n6RzOr*ejqS2s$Cob%r4w@veC8Aj-i?hJ_)8 z+$wGOKCnRz>w^oygtURUWR5n_N8DfsAzqZ)Qw8EI2JJWn@7PNb42hkFHLiA=;7`G; z$+7mG(1-I~Vk8g*uX}X2e(Dh$lHkhV;rb(*r&i7rKhRpcOyA?R=XZ z@TgpP*GUlqxjZ*WrJwY!$(^L-^;+|@DMDzW4r|Pe`cp2iqby5G7G^v=_q;TO!&s*1 zS_~#otB!uS-QmyifVu=&S)LJUb%pH87mG#x!d?it(+r4LO~3OOPgg(lENo)Hu;{pU zjE;=cA~|bVEIK-sSjQg;G$t`FsaBT#DINCF()%{;V~g*ulU~^~39JJQ0lqj~Lw96r z)}#Jfi+h6Qz1%rXVXx(sG?AstzsCqe(?y?xj)-2vi6f)rCj?Z$r+V?DP2al!$}R1>}DKby=x1j{3L;oVhKhtz24 z2!10fVAHpThUVM{lu>U~J|S^jO9dT|Ki1}+Jpboj`jAdw73}jrG9J;TgP30mMYXXV z{MFTl=O-QY;UD-`?o#}-wxFY!KOgN;+1_A}GhV>_UblXK)o*mYVDEL9#)Jp+=Qj;6 z&u<#7{$OFVl~9M43O{OUu&0@9qk`pT2r+TllmoZ1pK%<%s~W5F+SO65UW(-#n-=*C z4H&uVpY&qzB@NHFO%sn)oNvMI@iDOlt$a6ktn%pofH?oo`XGzJg(Mc8x3EFiw-^`O z+_tgdj23zOP}~+VHmgAC2ONeX;hI6SaOClGq#XA>$yNV# z)hfLBchy?7H_3em{&~2^Jm>|Caz+N>?%R)fymD32tw>ut2idpw)_vrt7*E?0saKvp z@r$&-DUN~~%6;!K5=6|n#UQ(Hh=ai;O0QpGgz8HXGB{BPQ*!3IrjR*d^Mx{q>-U9A z0W9!Rm>hEUn4trzdQdZHYrq|#7f zgO4y0O4ZbKa-1~8;1|3(*S4<7xQtCpFb1;C^St&&dXnZU?*rmT$=JKA#vx*kt#`p4 z>h7{YF&9z#tX5zKfDbfnO4t?zu%f^_b+9t0s^pD{2CaHno$MItW(heZBaqAW%g^nZ zjKsUWh>$49I{SbS2VgiiO&U43t|XogEA<((Ey=MQM0>dWF=n%$oLA*M&f>w4D4?E*7ZWbVstK?c7|CdxlBm1$nT7Iewc6n%@?-N-$b%6DKmZBXwhx7E~ zE!L?0CWggm*916w-fY6#bP#7c$Jm86+w+8@D4kLh)z=)AYzsm}UHceCgUFqBXT+ig z3ho3$sJq&-m3gT~2;u4pZ^D11 z5qZHVl9S-A6Te@KFURCI%&$f0BJ}~(X&5S%@xZzUZIbl-epA?CMDh21?{gsS>4`!yS=#yzH^WBg`RzB2#oe&Y8{ zG2FNmumOiG-5q4Ky1r&SlDKR?O7cs02djl29Q>qIpHSZJIqx%*lZh8n})VWrDm zJwnp8UYeTarH*h$!!$w1JMQe060`7uCfU>kKH(6-J3TQdSlYa>`=pSTpeaQA?Hg_S~ zMOPqDvGe0*$tYS3GY_@-fLHonbl3I8rs#L3N}*{^mh zN8uFq+lp7p@$u^+92rOCbPE3sbXbh_uTX%0odfLBOScVk|6t$$({%@qk|BgB>U|df zdWEt9xfHhThM{CK)YG}kITe3Ruufc+O{A^&b|vfPd<3OVBg&D1Hqi!BjRTIoLTYy$ z8kl7V0kHg8znJvw#|J}|K?!op7LhQAZvXR`{?QKs-Nh! zYlCJ6S`**18NFpuo!{_QN#_GQ(6p5;bd=gzxQEz#FON@vx>N{LR2+Dqd`Op3*c+?2ULvnD5=eb-r{r_X5H+ab zt#?ENtT_K~Z`Vgc5PZir0A?o8S}e|fZNouyVN9#Ts=kvw{QDa^UtuK|cCgB$O=`Uh z2OaA_APn>lS{;!ijmd8|dM_sOiAkj{JX7Kd_ZSCjrS#23BL+C~S)kCSed>TKxBgw} z+f+mEn__mOADAP-SwomlHeSU`OhUZp=D%7^H!L_A{yS61e~DrPI|QAha{03qwnN(- zMnH~D9N1{9>lQy?)fNZeD4M-`zJ_Y?B2fD=O@Mj3iacrWB!1y_E^kWBXbo|5M;uO6 zvbv5{ae2oRB_f3ACSN=d7Q1bb=|9}#;W`RW=nD}M|Lq|lE$u9i&)+>ihljuDIfbp8 zEVv9c9>O(9Xla#QPs}#Th8AZ*o1Jm0_&F8kv_D(snY+x*T+vV;I#OY@Jn-Bs9~Ce< zew*=6e&OC$LjPK-pA9!NiuY+*YHp~Ag;JmcVU5Qpl_5vQ3_oZ6New?mHjskE1yCDE zoVn;Csrg7O!dk~&?p3TXJ%>%Mid|VH4{9DS-{|F-m-q>^!*h)s@3GrFH^G1&$JI*!$&*~sRuv(XRR`TcL4$@RP zpk;cucU1wICmBz7D_IfV2C0bT(NrK6w^CL1(3R#|onMI)=hM=o&80;JMVXg}oBV&w zM7;ioTrRmBvY(k8I}PMzdH^WBP26Ii(OsJhg7%jew_ZlRuQl$sgcK+Vmd`;iMT0SD zW$2B{7vxgD$q(_>S!gHeF|!?ds@bK*8qeLXnjFz}zot?VzKZ)STh2P-3-*(xykNh% znORqad?o*>VC0gWlmFc3F$Y6W&_5Z#PsR4B_UFY{WR!mDpY@iGb2(=r1B>!l4AZ{3 zQaKoB0(U5^YOh%C?PL%swB$Z~UwU-1ME$hQw->JUOu16Id^Y$C`Ev40-#p4E&Ooq~ zGgyz7oTB|*ZK4=>dGCVTaQ?*pz?JCj$6S2ZVL<=XrYFjq?H18V-YiCmOM@Y}lO4Tf zstBk4x|wJWt6JhJgjR%)@A`<{0m0l$03DWpz<%$e*7sKo`-m$k{-CN%uYO_5$L`mc z#?-nOmfif5E`mF{gUexa)p_{*#Rm_IQ8ALN;Cx7_r%O1wGmPJbvq#YXUray$Q1l-B z85iDC{=1=;K3nzbgcl7YnP{lltAJadOk*Ql4H*Bnkm9NqWcnBkQD0aCB)&q9$)WmG z6&fM4lq$#%4&gCl*MB;@o-v1Hd%&P)V0cB`XfR7Z{^gyzP;CGgRCmvc#U-w!n~tzLlDVdb5uMg3DC{;mjk=QYZ{(AmYO z^0(J#^@oh0J;i$(9ieN_jZo&iiAL4^FrQ7me%>LoTG=!Ze}H=O{z49eUtt(Mw64HW z=uF6^yQbu^Be7D}7hYN(fr^X{19=$LR=(i>3|Xk*bk?7`0lc@Tzr7eQ8Oq~Jbr4RA zs`0roHFGdjA?m?$McG!skD_3$P7)jdb4=Ggy-TOlc{>=U9t98cKXP=9QNk!3B~-3d zg#pd7nb{QTn-PD0xsPa#T`Fwq;DNjp1@EmbyM$Sn(So;`85_otC*z3AHQ>1lHso600 zkw)OBeKP1y!&&a~gSglVR>rPLASzCo1AOU~)`d;vZxB`FMPb{SW&|%1HMZ6O(1N+J3eW{#^qt|80J%eoll<}fiOY0A8)dq4t zVa6mOEt6^&4++E>l+PS^ur468MY7%!-M-8~NT^x=1)X+fY!SiP^JA(&=|pvk@gy>iP&Z?*>^3F5CS ztUKgoOd}M$ZeC?zK(@tqVoX_13a}`$hy;TDV?g@Apq8Ob<6_iGlyq=5Y214;_3c@y z=X9OC`io=eD{jGSwShLPffBWK?*5i5k@*vnulCnEN%2KBi3iP%{<_J{(i;y+imyfR zXU2dl(N3xPqe5<){r_HS4r?qC!6aftVar{*ex_%IL&a$uR!z(78c1Le%`Ig~gAnXS&z=q4*61MmyH&0yK`PLXvhe6I98twgMM~T40 zn#(eL#VwuiU5ms_Fx1Hb8i}1+^K$;O%*jF_pq1P)(g3zl#~w&`9Y!&tgU%uPS5^FS zdAdU|oC1GtHSF2hRJ!z-H0TAgq&U+`YJByyzo=|=d4S;8#_#4Vi(rY&dS2t=E5E21 zDkA!_ip@d~k*uwwHew=HH03>Pr38j6*Reg#eG1N^gdR3n+S_v=0!OCJk5bTDD(MqB zfchpP?Gnx3_VT@CZU)cN@@!1&XGyh@)Jor5@&amcS*5kh8q#|94jj3UCc-SQ^K!Zd zDpD8U&l=6kEcx@70uHH{Hze6A7y#t6^HGctmn*%!!cDZzSo@-sfUcT_{aN?H3i7GU zZ_Kl6rlnf3y=|oX2-P~BPpjP+3H$5Lzv7m~uv^5%ZcLY0&id{4UU1lcfiA;=_^c3A zgp-`A%KnRSlfijyJ&p5XeYJ#+ko4+LujxRv68F>ff{IiqQ0XsIOcULI)PVh`Y3_gT zX9Jh#+GU?Wp_y`}I(MlZN-FpU+f+~y)jH@m-uGG81LhtA3&a^~UhB(jM>TvO2>mc_BS_Upe;K41k0gSkC zkIn_Y7O=S03igi3OoGj4q-hRNdsZ1=&I7n&#ZcvF?UkwkK4RPHwqwM zANPsU;7jh}rU4J#CQBZ~Sk)4nUWPVQ-@zJc>*hroVVnaIe`cNxI}BQGzpM-s?^)x- zWl%InppvC1WTR~H1Gf+I*u(_a!`SgvWG*wQ$?|ev9lR?*M6^+6&ame0G0YgT}(*#|Z*4l!c))(pf>d*2GD!_Zq!KM)! zos2DI!LRB&rQW!bc%ZaF{y1+*fPXFxLB4l-vutE_R) ze+Amyky=9H5Q%W<^vrEK3PhZy1*dHPG1$F(+z_p3JWp$T$w`z2(+q#SPPfX|jFtMj zQbXq<4DXLJoFC*Z3F*bv7$Y3yi`OH<(4mj5E?_W8+#tB%D0l88wR=BM6K%&vy}y;S z3A-yXS>dc3?rug|&!b6t4F+F8N07sVKMDPPyC5BKEN!uK{pkum`*!rvHAz?hEeHp- z-gS7Ec6C`)@48j`reO|e@^-7uul%juC+T>h89iRwGqG;d$E1Eb%qC6U z`%8dW*(+@6o2g+eccpCV+tCgud~+ldc<@X;E zim5t4+jFbIexjdGO8?+T@9cxn{$h2cuf7~Ch>xhudAdtFLuI(^T5VbWvVj8T*1e`> ziE)QD`PQZyS`#JThhe_ifdk*cXZ%+G4=V^Qj|kLp{ThM_CubWQu$n&HE0DJxCa|Iw z!l8RF6+8S$!N&UKe6CD7r@r^xY(&^Buc}hwQ)+E>jV4U)c1qe+tAw?e(tOEDI}rsM z@Sk-WKGNmY_nd^a1|gAuneRPtjusMfbqE?U_zir3rpXO&VL)qz?9>df(5{3AgTo7S zS(>+*1Lu(Na1ll|jyATnntI3bNX@fxI(l>;ZL;@6+wuU~5$rl|&!(&7o6g06H2{p7 zVGx8oWRfsA>mBPrP;H)$Je`GQLozY1>Wj3{kM}SLKUu4nh>Z_gTgwlf@by{v4n~*$ zr1<8gz<@v&ebkdYLkC}cA0mW@*k*cM%D8O<(9Z_AoepiDX8 zR{*Ai0T9nlT>xK1D66A<;sU8=S78j|n;Z{lTq{Xa%A-j$(Z-;gkyZWCK+5XFoAs2W z*7^*Vcp=^Ua5I=K+9D1^d1=3P&sm9|;2Gwu^nhaGh8R;tpGcZ%sTe>?jQAAtlrFDI zaNSPEQ7zLHoT>Vp>7{35h9y}I;LrazHIKbxUUJc9ooZEx}O z00#vIMJ{J{#n6ruYn@7<|Me`s&8Q}IK{JqL6$iMamzhSq;WIg#V^I0Gb9GWwyf`?O)L z*gYrK_w5*HVqvrOK1U9eDD>u^p$^uR+V_g+%A%z$X0eS}Kc zkiO`u@h4iotjI~VW(WwpUqzNy4Ai*_^@8egtMUFyhjLq!S|67LLqD;tFDm(Lk`4s~ z3`NYBKl=TtF@|q7tM^y=jAxi~idN42cn9^#=Y?U9cil^?LFiw9uXaZZ$ z2Xn6!2VphF$}5dg)*2jZl^r6PJVb?X^9a#=aCfy148}7zoGqQt?f=oZ5oVdRFDQf~ zLX^`cO|-*WRP1U`fy~R3)kP|s^ zdhoDi+{UI=O_$IqMDV1%s&Dva^LNxMrQs^q%GdkfXD=$hOA4=yh4F^AGMhDdUkpM}&-V~#0 ze8zq^Z@%8n>cjqMp+F@KOMYGGY?qx+r_9I1C|Xzo9UC>E8;Yf|As7;D?0vi(NMfMXbgd`S z%CLf!S>I@pMYb9YL!h3;48Q%}irp@1&`4{~0n_ga$3!q74hQLGyB5lgZw z?3EnLnf0x1(cIPBeKK=bxIfAVqp0|G3zHU<+lt@rLt2?TUjc736VRb5q8koFMVzMN zHlF_9w~GE118D?84?)k4YXnFrLO8$;-m!Bbp$m$mn!E9p-Nfq5aZ)tgfMVgX!6faV z^4BH|BD_E-O1g&)37`(p1xFx!?bn#lu;(x8iB(yb>NQObyT)94Xz38mQNR(^kIji0 zyjn*8Pf2Do3me2h0t3^c)Uu(!?Jv(XbfU7!dtHn*FD zqEv4nO=@N59~(ck3{qnr;Byq@D^DSzks8>% z^RK<+Xc;b`zFlt)#HcJ*!B+G`Cq@IL;2bdvC5p|$*02kz%huc%um<9Ig3QyI+= zrZ*qT2N6&8Zb0J&MGjW2rm;V^qbWA8_`T!&(O$j!1JKAt6Slh9w13wGw!Z?&@YbI~ zSiClPNrlZ9F1qkQ7LmU*0JrOT%o_ysGJ_KU_-lY?=o5JZi^z2u_zG>PR--<~<%GuX zcIB5ifTiy3S^v5pMoi#L)A3=5BVyk9c0{0%jl{T zK({b}EYV}z-odl?SoC5&e@{(b=+&Npc(%}s42`pR>q{J4f;$}eHNrU9^gV39zTYQK zD;YoLH zF1~NvHa=uKeEB-36D{qIr#->kTM~^7y|0xW{0=bn7Iho7M zv0(f>>uX!4?NA+;;c!=oY*r(i`lkuo^I(T$)^}F+mv&pepxl35M1u#dCeAnmNbZ3O zzAZuuV#jL`sO{3(>X^sZ>9;i|seG)Ej#zz6iJXIsI5LS+O0HtFEj6=4WVBpH!pW^4 z;!&G#>)?e|n=WQhR8WvAZS#Mn_N+nzk;LEs>eGm-(#}j1S|%;8ST{S2V{5>n;y?kF zkpv#O{qkh=fDf}i)V!fJaoo<(`Siw)F)PPkg4%Q^y(F&DGPuP&UhV{V{9h4DV!+)3 zJi!JdtF3zxDV?C+1*a&2cr(wFhj0IB8uu&@zPY>);n-gjt0Z&vFFt?%<(8u(zZ=W1 zKq2tK(P^hv-7hP}Z2oKrGRZ$FG%U;}UfS?kPOQKR?BE&_Ar!S|tfNmWbVom1?1pwc zt9c0wD&fFBPJls97@(-RazdC!7^KqypqfSBW8OM#v;_({sRY=kmi zt{!0+Y)L{f6?z_nCI(oj=-)C&Pd-Dzct?`o*MaL;bj<~bL}zqucRyF|m%)z(wrb4*CRX68BOQ^TkFw(hrIZwUk5@Q)w!@d3(w};Vj7xi zJzkGbGQKB755N$|b+&Ocv40_0BgUSp@D!tK8fv4Af%`BilFA#(#79`27xVZ68n~X5-HYBqJ$`*e?1a609TKCebIR8Zld&F zQ_j?uHHC&^m3icL=ghEeg~D^Ly4J(KC`Oo8JZIc|Gv^U5BR&>x`SXF=;|BdB6#}L{ z3;aa?d1_z5XftEPLCy6H%$=!zN%(yRDxA+Ij`!!&TK$cX_wkxA#BtEInMIe5Df3UE zUu1cdsj{^Px*^koY=(f!Vx+-iM1*+V_`bG-m{6=I)g%@~dqsc_zpF%>9I; z*iE(TCWh0#n6w-_P9TVDOW0a>DBLG~b4_y{rUX1s3BX`C{9W6=Y|P*f=C;BTN1oeT zVZ&nUylxMcwj>wh3M?pZWz(uEfP8ohbJDuh3 zQ|^2KmwDXQ;`{xWy1XUdiX0Bd;f+DgWMUp3M~!UWtQ*wm^}ZVf!!Et6R1|-7bqY}v znp*i)=z>+;? z5n#D!XCXkGJ#(zkWWwh31BeI(HIw(b%?#L$c4~PI&_+XETym}-+e-kT4CMO7$Xl_4 z7@%^!DLwAZ)R}%suFFUIQh^$Zp=R>2<3!I&?<<7+-0kuDWNlBfPxZRh12FhG;vh;J zMvTl1sd3nJBgW|@+Hx|4(K;l|npr_k`=w~X2$$ZFrbJ2dH!~m9mZUD}nLs|yJ!ZdF zHPKeuN~Bmf`X=#>J-VpXpfV({wNR1S|Dxf@q=smj&}5w@Z-Xz>#VD$2qElJoGSlho zjK&+UFD`|s7pB15TjakKzcM-|G2u7M_O#&2cuG9MQ2VHJd;><<4E_;*{H}9)Dy>^i zn6MQEg34hzjv7nsy{1}bHIDPu-#~J4LEO2h+yK*pxfu)HM1(P`{vXEb5%;W#Zw7S4 ztl^0!d4lJ_$)}&E8MBt}xqZJKcs{y8hhjjhI8%nP&##LPKK$$yPo?m$QD0Z2GuP^7 z3`XTdGQtXh2Dduu;MwR0Q&(nRUR|S1G&M<{{x&a$a&=6M zwVn#mB1^%KCF|Q`WtB}S)mk5q#0o95-(bM@6t!u~ELyek)=yPGuNvCj6a}*{uF+RK zw`U-6gym1stxVrSF1`x|zf*j;0LNy>%uYZbFeH0l2l(3yMKy z(+15qK5F7|oR_>FZ-aB1?RZoNHpC4~ym$@H{VBtl)zM63;K(Z4;%OIqSO#GS7&n8E^j&5 zuBS$Aj-1~%qga%$Ijk~daegW@n8x}s!|%hpE%V1E#rRUpriB$S95qwV$ghQurpmhZtXI*=>Yg~PHenSzK<%-%g9J0fjF9aAXNG1YnGtp-Gd z>EKM^pos3TeoTM^U!Byzytkv0(xZP+DvIsb>ngG~YMD{*26B(T0NVKV0Q!l#KKmRLV#M zK8SH6C!}wk9UCP)c(?Y}$M=5{lLNV)%TdCd0w+{gDF>rE${tWhTd|jFh-|elsheUG z=>Xbg2e2cg9EUy03+EOMLiCE6l{BHe(e#^$QfwZc1z`q7w|TU`vYrdeW?_v z;G^aq&V@RQEzVGeg@zYMIXoEjXma^ON`a}iLN@LvDZoJG7c4dn?)wDWyY=J}GO*c` z6j2}!^Tl92a?oLE0ytv)^g9B=09LIAmlKtg0Yk9S{YIwABg+|<)0Z>zs`C6eiEmb? z?llV@iW+=v`1#%7#Yb~dylkr^^&4Pede&^>IhnE54rRXQK?nD22csy1l1RC9KLP&~ zM3roQU^QSSyT3241zihp$!jcMn?LM)bAT$%&CoJG=&GHXcFRc4faNvW3DGp=2B8@mMM{4-ixJmQ5b6} z0!9b_i7pIIs&EqMt*fvPd5_t$KcCD`|K&YC%}1~+Xj6WvG{cM{5qc^X2 z(sMM|NR4Ccr+=3DU7uS&)@NadrSn|b(?gtIs}Bnkg7Ai5`{H38 zn*x*E;8$&IkL{JY2y2zcNiUlcwZfwNOMEnN26h={xV)Py(7y*e;m{i~cZ|qxyHXHD>=oe}G%~ecZmtc8QRZ0qcJ(ZSeA#{9Fn0p+$^I}?#Yg>pLzU2R4}9We zkouR2%;YxIux|EBeiNvbHAT6-6N?)w!0>y|uo8c}+FK8pH2d&1j7LTu!2iHbN^hdP z=bTj%o!MGc`4J^!Y-;sltzz_d(5HxIWQbZV>kuI&j08~VXF|Hc)YuPUZj?zde?n2L zyOrrI_nNvYtrAe3jN?2aaF@9e@wiDsr7i#jKam@FYi*Q1$qa3bg;`Qwkot~`b}6uu zjoS`qw()JYj4d)87hV2#yiewjOLYoa@MA`-YDA$jVB}OB?1h3$=S=vSjZqjGw>hK$ zFA{fChGLxD7Fzn*5I*4FRooTn%Kvjj2XL?4mCmR5}KDGbR1Q{lgWo8as3Md2M5?*gpBd?1yQtnxW@YK-SY z?1ZjyBdI!G1%EjeRRLUGO?7h%bKVc?NEX?c;2?ro7}9Rg@;N4PfkK&Z4N_l+1CP z!E*vtf}4fV!OcNIO^>ig;2P;vN*k>n9s-bzEzT$}(e4sL35fHgieEVlSE0Vb1WlCs zGSsL_7ncAxaMp;RsXVcF;z;$eb^Bh!AvApCm3g4LvQJno+hOkXh_0JUdz*yCH%y+U z>0(VLJV`mkW6x#NZu)P)kV70V(ZI(~qopTB9u<&kfn1%PK-WQ1g#I*&M9j<^~1; z#$(iztUlJ``ToWqG{C-aRL$Sq@g^Hf@9->83b4qB|n_{dSds}q=mau`H8W)SIz zVNrM%gOy?BpFF_y95(m$J)6N-PbQdwW8dQWrmi^RqP+aux_iFssl-8J^(tHjv})`d zw@T037QCrOO3CR@jpCH!NtG1mt*<2iP1ai6F!dSd1~nBH!r=~QgFS+(pgcvad*-}o z+uO~M3D*&q^hMsZw0C*&pUQyM@TG&16%`hA2X1;QXsc;HT|?GI)&A5WBfk6>#%t2) zFbHZ|IW~0SuUxoYjx!YAJr-@r&-FFw`@QY7UMvH+WrB~JW-Fa|<__}EAmS7a=}dYe zBs6}8%w$!aKlkv&%XwU($V|{y#_ZFgoG=lKdsZ|-YRMm5FQyVM>_Nu~@5mNjT`K2P zhzO5fPH;OV@g}-00OV^hX`xv|qv}|q7*c=f(O0ujuVV1@yx#d$oZvU1lQMsm8G=(_K$2_WAZ`GMX>31 zaSDhtQ(uh6p#*YL>*h_MLw$al7M$C9K$$-9F0c<=Vj4&z6!VFTh^- z1}v;MAo>XCx;Xns%FKk8o6U??H@lFVmHCMeycTN@hOT6==zoQ@+%Ae3rH_IUQcQUZ z1BhS`E3)_E=TrpRFF;l1E_s;@PE;1Ai-HkLcr25HW_hUXQ=rggwOUs$O)qg^HZ4lk z`>Dd#vC7r|72I|CftPZ#f%8k+y_~^J=*9~aAG~eEqGQ~r!P{!Oz-n7#XY$JmsHnOB zt%@32A_qYL-2aRO{x3{=a8iyLGgf7M3RpArhluflJ>NpRj>}x7rAf8tWUM~bs-?QG z!^djReVdpnrQ=tLmodGk1OV`lE_}RhRn4HH@dnJ!Y3N;FlNJGF(xupW^UE}$#5QA? zmv_Eu3N+p|ihmd47F*GLMRp)Qx|Nepi?uOpHKo?{% zkF4QT6Z0sm3$bNwZ@arepO=%XFhOQt#+9f+j?;NHWjqJie|nN0z&E4EM28zKTMGLf zot54^LO+<68?bn$9y-9)Hid_M483A@ylV(2F70zki4Ut`+7 zQ)0mp1PtRi6u3NF#)llxLbB8?<8 z^KGQ7zu)a7_g7zp4QS~?THcdy(@F5n3O#2ou!7djYCAuOB*z6PdWmOZgw$Q|LPq5 zXQ(eN&&YBoD{nU^L@s^;40E?ben6nl-`*ZDjdvNLe4c$OIb6rpb7s@iT|t35)5Wk9 zrPgr+|UQ9T3*I4!dv$K-CBdt`jX7^Lyvb6 zvpaLXZNxsvD6^V^a_+4jD%P4wv^iQ!c;GD(fvb-aX?x{LwgJmWOQhr1hIM;f4g(i! z)5d#U9Wc*}v*9^6ZM$%+qPXNf-wnQ?iD%cdFe!0VxRGW#o4UFEr8o~_v)cL4=&dDu z>tZ3!FbVj5ft|xEYG~zl_9dB!fVHt%&pRowLEy)GR6f~ve1XX149tSWB9>@<+vE(( z(<*M|Xv0&#Zs$e|oGnZLpolvxh9GAhNf%#f)iz#PWhwxWjs z(w*10_o`^3$&ARb^L!+>y4#eYFY&U;dY7RU@*6br>8ox@+(q&I^C|D-mi|vN8UA@u z1M@;ag?hZ?)TUoB_s~kj&YlNT6_fKaE$~rcRsc_#W$y*&RDuF37I;b_TUUp%9~BG9 zMnEsTOPXdAK3h5Ktx_hp(gBfVKG zV_Q?3#Kj)NVg`HE+>&z?JavxzlaJ00tJ&@K zZ9_y7*tw7Pc?DX?D7xx%MLn7O?a0VAO?%vnU^{bSL}3PTaNy_a&Dh2HTWn2S$`#q* zlvA^XTU*iL0mDCoaEXM~Z@!E z&Mm@NLgw#a&T{Az!aOz=J2f0HQUD)S<0#wglmh9wYO;Ab582K&=6vN<7N@$16jLX< znntFS@t39dxlvbi&iK~`Vy%$#gajyP;6;kE)Di7pqsi1AIP6Ly<`44o6gxG z@hkYtZrNC5*?8It%AEWBh3B+kpkQ9aRh@lavK%0uJqVm_uDj83Ki%-UO{28a^xA)s zlr^qp^M9pTHc)9AY!dnV={dVV?Kx62kRIOR_9fUbF>25=EU(7f1+E9+ziWZhtur|c zkdX&W<-YcV+hFL!hwc>mK1)|1cvjk$UFkd6BxW!y1C7t>8nA}_G^&!}Kv%bn@WQeg z{2r1vCi<2_o1)nanRLe;q{r4zb)-i0tOUxriZ|gm&D7 zK;iRu^f$ntee)w_e&PHKXzR;Iwkj{ixCSav@!G3eH|R^ZIN$n==u2AC5@%#C#Bm0+ z90tmd9edzeNS8Z-T347+E1x+1j*$bT%;>Bq`Edrm+evl2`C-#M9*ppKoigtNec%gY z&f`KoO7nLANV^0{BimAbBn`&9L%8+}C3UrdZeMPe3Q7tIeK(eq zA21du^Jb9qN~%MtejTXV1meKB`d#|XMdz3jp5JG! z#(!<5PiUh?VG4R2UvBGsc@^9yLVPjkd~^Bg;2ipyu9##2o{`%+YfFeeoX*Ul7aJuW zO8gBj%Oc1KT~=MPg$iPQX{{jpDXM6Gt0l&qGBPOd;7SOyJQ%qb1Gjym9QwH+PFUYu zj4e!)o%@+5Qm54Sn3l^;zFCQf57!$k=PyAj0r8OclObyTcQQa0p|rDwAMX!f)DcF3>);vog1{Q}9t4FVoK0vzLFaf@twFt z&pd=p9Sdt4i%kr64iB2W}HYx7VD}@>`CzoFop>?<9}`*-*<~p6(NpLAh8- zAmZJPnbE&oaFPtWS%hVUE>4->JM}k{!5X8AIBUg4j6%sK&*TQ6Cgd(EYEny%u~c z+Fim5;{Z9-^@9;2<7d*B6)~i0@@J<`1)8mE@)dB7P%2Su}ET)v-eFi)&1t|FX{mqZw z7|s}{1d{^@aLCw66nAxLo1Zv0yRhFIgtS4InWB>hJ^5BZ+Z~)z1Z6w5iv02{XnB6) zC&dK|6e-&gSlv*>8i?GYDGIlL-L@!$Y($!JobrqrO_a3R+8{nNi9RND*BvzI@}k3+ z!q7H(HSx^s+ycySLjsT5TV;LuILgJEv0ytN= z;dx9spZ{s4lP_?1+0qLjvV7h13+Y}! z8@%MO^Hx}nIgU`K2CRG^-`9V~@ZOvLr2RLqJ~7*tE$RG!w7qpelxx>6E+8R|;Ls@o zD&38=Zb3j)Kx$}|p+xC!q(qdE6ch|%0BNK{q(xwm1}SNVl=|Jz0DJHEefM|H_xsK{ z|1cXih|c}oYhCNQuC*4-gP;6HVe76PFczgg`8|`_H?|*fvtSzW)mx|LW5L;FD${N@ zke-0a1hu%ggKnteg`N!L%v7)bd~%dkr4@6L!UFfj?_}6lH1n6>W<^3 z9iUcO2zHA7E5rZ;P~g>uPH2wr*Q)9iu+F4lZ1dK;QSZwE9WfX;XyFl9LwnR70Bc3- zTsj#$0y=o>v-n;SyX>FEY?@OMot5RM9Zr>lvPE$qHx^$77@pSpu+^#Gy@PU08hDRQ zkM|wlJb?=4o8q?kz%L4#$WK<691oN}UMt+*?0ul8KhQ78cTm~|CdG$dSLX}pg}rCY z++!5)k6Bpe8|94;@Y8YAK+7MN9R}k+6|&${&6B1{WP0{Hp09{f@xt1Q)3hz|2Gl|2 zrxJ5@zO$O1861?_C*p0JcRvKi{}A<)XUL>U-=L4Ca#bIHJI|vE^ljL}o@>GWfElP! zfGfVQtA8}5l7d;%)13&0yPHz@N2Zh%gJ7Tt*eiOx zyc76@=ZBIsau-+E-%vXj9_Nq{FvdV_CCBD2cnE`MTFC&=puET?$d9r=*<^dXQ1E!O z&1t9T2^nI72_^fOq2s6@D%V zI}=);<2t>oYNuMh-FAzAXgt?b2du4JHe*Q&_>@Z#AdV3sWw28h=NWRb+4>QV2Gr18QKYz%cWwDDw9uUJ1EKiM8% zE@zjL@6H~vA-+@`E91~^uGDWphV8xO_T`h-Fq)Sm`jG!N754SW!$(eT9>wfkP@80D z@Ij91x=jc6(o@92N?OXCy}%_fe*dYkc^S(?G8vIrFj8K@(GIi)V7#ed{}$-|njHnr zbY}%arxJwzu|&ai4*lDj8!*+P=nbGo!5~lcJQ&ZoIK#Lp*<8(u*^;X^A59m0X@1uf ztTuui#g`U+9`Nx}P@n5Eb^#117&HQ^&6h2m;jg1#Lycb}eU|s0bWh%1`K0gDdAw%~ zOuGiSL@n1%ARhn=XE4;;T(kz3r>cZUytgWy*r)%#r7`ze#2@t~nqx11LG9wFixi>4 z7#fxhu_%psaxnsqy3D~m&4(8qDPp1w#b1ev+fp=8c!_Js?(Oo2~c;n2#UXn4*X-8A^X-1dxn^@$^o5MFO_js`>9(E&B4C*314 z)@LWEhvbXlp@9<9vn%s#2i({3z$B%1rKAei@{3uCd85(yOWLen(r_5{eL>`a{RP6iVOnFVHnom2GG)(NG z{qix}>2NzplYJOC^Gz$8B@`u#~j$!*hmGledmUZ~5#@ z=r#=BK4`w!2aoCP)xUI7%hJ0|uf9o}Qf{l00Ip7(s_Tt@S*_maf`_g@*XDVmKt<_~ zz_~goiK#oE1D~m&5`r<5dj(*J-R0Gdeq!jcdNs22h_?61jOPAwQPU%Pe<>e^q%}X* zgM$T2p4?{#N8dP&xccq78U|Ljf4cJOWd)0{N9E$2TcpSTkQRa#6LQhL8GhbuU+Vql z-g%E}&z6a8n4e>&jYJy^-~GRvHB6USZ|KScP9m72oeVv=jeESZWO}4|&CdMdb`jq# z=ag>{_y_GI6BT=Lo^@%sQY9=WeW8O4 zdA;|(0$b8zq0F5?&;<@?EI=~cub6-Ri%bL}LP+<@$uaAlLN{nUU0g9^+h)@@9iv4UdU&;x?r8DD*6DeijX9Orzk0%rbOUf}%-j#vo}xO}OoW zzo&kK6`b~>l@2@5?E+AayE){hxb;Bu1z=g>pJAzclr}chBaj~HXjFP(x?!_B58Z{6?L_M!QeIJhm<6|ue-#zFiu)fCLA$?d5jjbUtqnzW`8;OaW10(^jd z6@|H6H`puAiFMG?s2mW!tpRnRJm)={04fPZ#MhcVQ^!0{a$Y?qa#g9L-&;3QC(1A^ zW@h2fCPSnD){@G9*x`st9{&(TKtq?7YghJ1>Vf1G(CfFCdgc@ryw$3y9M^r()mJ^^ z1Pz|LZb`dcBXG!Obmq^^jOGQ)!TDidc0Nf}b2olv0lJ1r<-(O}-K>LG3(-$xPNtIp z3rWmdWEv5xnc&uDm{RaaI>)Q9yA($v>rJVK-@B?MS80en7>hNyT9-t-2nt~^~a)0-M=9F-g<*u!~K5H9uNhn z2QWEkEr}^Y!g>;@uwtgozQ2Z>C9ECW;?&1bdF5UmQ}57zqWRK-b@a?D&|FIZ{-#qB zycph&dFHrQdW!#c&)mDo?2!|??J8Ot>BfE|c%gBv!R(9RZ816RaeKvEx9oFUm-F{F?Jdir{mr1A`N8z)8{>UwPwsgs8i;TBzgb2+14E2JpAd`W z-n8zQ6(W%D<=X_Md=967DZ8K7-=j7!Ai-*lSn|2f5ijeI-o0Ax=@}(+?A~RUO3S)8 zF=DQ4{&3fCdU419bpAu~*9c}0z(^SYxvAs@L~(;rdgODn3MudfMWr_$sJ@dvV}v}k z0r6q;mx33}V1wKEonY#dh17!dduvYD7Ce5|cxBP;gKibUQFr&kkJ7yMUEaw|XyySk z+u#-|mj_wJgN$RYrr&l~Kb3qfS-mer%%#`4FK?Z7I$WY~dS9LFt|C|FFB|xfN~ibE z#KSY~bNkH`zdFV~*5!cV67Jo*3y<5LEQ;p7J-pT)JF~CK%p=NZC-E4Zw)@ijA=tfR z;3d1xRQYR2S?2j0H!tyMb^s|0{Vf|{D-N#WokyKQuk+LJ06p|Y^N9nu)LIyIvzz*T zNzuJBfs^baa^T6_c04-9Uw>z(A}8pAd_Nr;7!OxOKpio7tt<_<)d3uFU^8hjwCeuS z|9Yj@Uz=Y3bEOc}e*`8-KnU>0q)|6Dn3oDRSAnZ!JwDF=Ua)s!4!y~w6XKK{q z(+?-Y`&inSdi9CKZ3$9AoIhJM%=hu_)upi@#*?LFP_f4XM%QVXzl;e`xB!ZRleVKT zc=y)G0x))98N@ggCLIwW=0V}JQi5b={JCj;*LhbmkyGlPqt4M5^isIadBe{y^aueH5W0xcAkUO=(J_a?16A4)Wf|XwxPGT5yeMfht^iaeP zWNbWMTW;gC`HGSJUmPw{1Pe#F^Ba}BCF@m%Jw{Y`*?CRJbmB+bS21>M$6D^^wl4_E zZRz^0ID%_STQGYzQF6DSCEQc-QQlV1)k96CX$C{%bU;8m$^_x2le3n(gi>R8t+dqCJM_EjG!`K_3UCzP1SOxn3_v1Rndp9Vq zyYg-}*#CWin6eMW#D~h?89F7bEQvwGM{zG>VjToXUyjEWOy z%NknxxYZb1+*=|U?HCA0&@0}5;1y!`%%<^*j07;x)Ek#(U;etlE}a_O^4Po7GNSM> zA}$w)HsBFsrMk^~IdU{gFJzJQ93HlPC;$PRLzc|S_d);GJmdefVBVDDQJ{Vt%>A?z zOG=LR+xjXkZzwgzefF{=rZ)kbH8r#49N<4|Ldh0ajFZ)T3PMk&ftZp&O&DOi@u$Nn z-)Ak_5sV}nOkpjD?g{ejUg%9>~oEte*{?3{D&2)j{N@xfM)4oAc0+oX*QX7c(S4iL}lw2lDku6ThES;77uKY3|1-2ME67lh?TY( zTD=BGhVKgsi|LodA^7nSH~ksWCR_6b35>IiVF{tOZp`VGSQmHwR|?sUS8>gFu<&rQ zc)XGm$i7gbEjUc0-{K*xiQ_!8D<9l^thn;IYqaI|qL-+bWX8o=ufh-gUtcb~|IogD zU{!5zDN_^5Z1d7VX49ugaLiNZZhuWWwWYi>)j*$e5V=BVUUxS7-ma&#faE)q402Q1 zCbKMS^XJLNN~LwOjT^OG&9Hk^8@^4~_}cv!;g{qwFKEt1A_M}-hb*YOj5r!in-6CR zB0re5XZ}*-TR18rmmt;FAE?A#AF`0`L%}%6QeF~KjSx0;FdQ%M$rnvP+>U)#o<2|e zNx3%R`mwP zP7BV%VAqk|Ks4Pf-YlKkmQd`opp5N>(6%`A%*^hX6=K_$r)S6N#eIgh`)r8z^O=@| zO_EPb6qooGSLp22ohmeJ=nHh;^Ep%|APIRlbaCw8XlaX1;<1o zA-)CML;>kUM5RE`qc>Tl7wn{}M+U~+cK*&-wf(>*LucYeajp2O z5^@1o1}@MYE+OyZ8avxmuMo=nC{Fzxzod$C0nHpPk$<0FBiUJeublu}JLuDx#6r9a z3Iwc5XP-;+W#VO#n@XNz5<+tD!zN2KU@hld~OdL zII}2KrWO<$F0uv^Sp4?5o*LK z5>>xHZtYCnrb*>kQ9fnMwWaOk$bNHW_pwm3_Ko1@sNi-wWMu<(Qj1(t?ZyvWQBqyM zpwGNcZJ!7AI8#F!GJW*OhO!)px4KfON0OdQu3Q4&K?FOaOiq$~F~jd$qQaeNPBD`B zWRH}VWL;|6>ES5@y@nz$V(@FPX@v+edzuU6J#ndQUbC)LH96YvNu7Ad3fH+DVG&u- zikD>Cr-dR8U)>(b*eAK_9!kga^iWG2C%1vZxWntsvRRx4o{iWM%Y1k~v&+ep0>-RW_esY_LO)XU1b@jzU%qBwO@_bGI; z1Q7!~9%Ds(_JV`BSw^LL1|b)0eU%^FHu;wDa)j|-daFwKXyha5mcqCmMh!#P(!91| za9am#qf$CKIftCsu+&Wi)ksi^7yL}K;}#Oz1iVO-bDX_O=H5^bS3s^qm$HP) zIQhyCm*>nvzfACIC*ikgsJ~36i*XY}--l}k-B3e@m{XXdaA`(c(_KKWk zA72S1@A>jethatcUzFS{F&1ml&5zMMAN`_LS52Yb#D->0{P$?(`pk1fldwpfk}ny; zmbo&wq)9AnC?C&$Z9mA^G^JIxsly&8NO5USH_32{cbcu3jIZ}YFF0;-e-1!0!`xlBj;D(V?t)`yuY z;TiNVx@7$*nZpBam>95x2goPj|ET|pc`-9$BMLmHb(m>K0aHb^^Iz7~7(AoPphkF) zWg}3zj-?%ENq{c~S3yIU3i=vxt#}lEeIP$yG;Vz$d=|zPNNzgu-ld1WlhFd)K`5ri zBp5D-Tn{Oa z7_}>GZDXap*xOBa2V78cCU!R?6%sYF2vhLi$X(nmTv1W33ar#CmX9Nznquzz#rm&) zMo1PK3enQzGgLC2>fJo25Lzv?*|3@5ok&8ysW@x9rs{$+#Q(WhwZG}5*lS6szPc<` zRAeVz#+3Uz{z;rzb7LGhQgK|*_hPU9aQ4?BBNeMCK+udKs1Xf!si%KrypMzp*hSq1 z2MTYf@*Hr;+$$(#E;tWevgF9THum(e45vZ2^l<^J(rBp?pKBCKy9W5mET~|$o*U3% zhB)P;6DSvkW|L!^pC+w-ufMOhe5b_Xw{uneY$4&4e!`Q+kT{v6;3iS?{`AK>IjmEf zSAY*31pY6sHKK4q5FDs8!ww1d55~9Nv-Pe?^_B~ayDqw#fQAPYQK_cdS?$qzm;5Tc=O{o4fw zcUG$O8hG=aC-3EwwNk#=(4WRH51Ukc24XOb-uYIrR^5~k zcycredZZC{e$b!!blET4*7WhyCaTR^u3-GSF9|Oj{o&@nWox)6ci?wccWg!`4s{4v zf46`8{odX@eC{S~HZb(*h8Mfss_tQP?MiXe&fiog7>KgyBcRDKajx0U%elFdFXHo= zqlC4nc8~P&!=xaGSGI(@^s(gh!;1M5v){8^t-7AAjXWNmzuM$wmO z$9)`O+sgMB)f=X6F>q)|kV)h__uJfyJn*CSTQ4B1B%~+GX-#Y+9@NRz>Li?Ww_P>m{G14I74(hphdwiSp)QL)V z9N}%swVl3+3Eoo6AKj(Jz2?#u`YMsIJ-n^gg-}!lFbD)}?3Ie#NnESHA}wPMyY97) zubl0JngZ|z4b+8E51m6lF(~FzBb@{zNFQ=7fUvF*>U{l?x4@f~DN2f3fQI%{Upr?< zG3BHvsKiXkRLVExBp6pHLQqv{?VC0%JUlVH2Ts-OmawXK$FAWl)3%R2^MTHVMCtd+ z7d54q!<{KaNv#{%@>o^Onnk(wDFZ?+SGlspgENX(t223;1Ti^&@LkU&1Ihp|$U594 zOXe2MdMO$4z=~#br7q_diZ?=Hjifx(3~%O=vq?MSyPj9KA_mKvZ%KC;(m3IZzHtjP zbT!I(kpAU+T0DpD7Xg>_=JWWaqiKvZN4$aLY>tOhnTo<^JWU_l$hM}&MGy)xj{QIi z`8XK%huNc+g=!?Fm4s?-R7xvuWY{!l+YcqZr?`#1KXOqqr(rwV?rx()+Cv9Yb?n>U zdep@%9=^HSh`om1ySWli*KwCf+~=OfY~{+AsA!)R8J{QlLpA3;53ezgp*>a%2Oai5 zk}D8Uywoo3+tZhAMHiZ=laSfZmf%xcd0lQ4PW>EXK(shFRZ(+2V$IO`x{piaOo&IY z)NnM&?{u}+HG(5Dl+tk?a@A*T3c-_rBV%Z`QnfCS>jlc6so8BZN87JXnffGJwxp?p z(j7m)KkwXq(E9TH=E6B$Qf;;ijSX|X(QiSwukX-qoUOtr+0@! z#C5*g*xd_wIvbjzzp~OY7RhP9nT%c#^r&1m_+wS(-K*sa#dHu(ELZTS4(eF?eELhrJDLACnO@aF$yo$y~VMczE{Q@`A`8l4bK82TKy1{iv=z1`K0giV?CTMINf!824Jt+d2j8{V__q~OnaPqi8Lk*O^z z(uZ0hbaWNH7fJtszP*7%+l_7Z9aYQvvQ*`^OP}$G*%-O-q~uJ5)BI-_i_s2tQ-RW+ zj5<;EpWW(K+>T<`g(6|wL0$!=Jsc7h(@b6z4r55fCmM$+&CI3;JGQ-#>3J+C_U?~+ zW~qdetSzeVRuowu%t|irdXSLhxn&C9-)~!>bd}?!H}Du-H}z^ZyO-G{n)a-XOl-S! z@l8)gtE;r)bHpdq45f5H_2;hhX3`Hoae3}Wu4%Al_`4M$0Pg)~$P8y~T$E~!rrqQR z;oSyricOCJs)7RH({(HnIC=nUO=0UX5Z6n0!|pLbFR4Gf_@MMi=t3tMtgSWp4(Xqc z&yD9!0ecgk!nXdgLD93w`H?zou!7u~*y}ncqr>Znp|H@CxE*r?$t#b^1colc9)+MMGsuZbEhb77C&@L5+!go=#ndr4UM5v|L{_`9kwMC}>XrE*D)u zuAE8QDueNK)_aJWSg9+Io%hp<;Ay?U9=Ph4yJrG$ky;N4$_f9Z6#frr49XjjpWy(1 zUkoJoGIhSFC+b)aLCpKeGc;JSf@%t|@a@Gm2br1JO#KCbhZAT90CK8&U@lg-wSmft zt-KJ4ef4a=?+7DQ*v6S$s>RM-`snn_8rv|b91ePrsQlpcf)MVhB%sHqdaw#IYvkLk zr{dIAGy8c?HBQdj%3D9{<3I%ieP>)sXT8Y%Rl9Vsuze>_Y!17&lo4;NCOg5aLZB&yk)ZAqqHG*U1A>6bj%Pj7)9IB^i?s zcxIkU=1gFsXJ}^eCO1568*3`XmOgIpQ z55A}c@U;C8Q+cE;eT$qj?jJUvhGpxT@n!TH?H6DQ1O;>BRjm;2f-W+7hBi_}4nj&- zD*`6aRbck%?&0O&68Z9IyUtPW z$~}%B=@hz=XEuY$iAl;^FlmzZeiP-|KM%A^knVxX9Fs?DCQQF@>(%wATk~@gY_>=e z3?*gwR>N%mYS$=)fEJ`@8b#FerNY%Oh=~t0q#Dp*by$)3+J4EYvuGP+GrBn78T*T{ ztBp)fZdm%TSmMfe)?alqf~dQ{g<-58KqXR7)t=bekrbQp^@OHFuKz^|fQmw&psqT0 zKS7I3=*(1^B|q=;CV6{Z8i)-dt`~pSRQHCT7kmVzrmYDGiJ;=Vak&5OOt`ouYoPA6 zs0g3n0QA}3}zDTGnZ*>|06~3RD?S$|yO$vMXd4=znTA#>)8#3-D zW};q;Zuu*Aej)uEN$@AiC1AZWDd7fNx%UZ#zLRiQOVEBfvsYbyw1`h?p&y_f0VJz6 z>0pQr1A6<_pe$Y{Tr*TYQ0uyQ4zX@{pA=J<{g9b=$NZhA^snE|U25IW9iqmLN}M#5 zx%iyptLs;K;Xf!Iput6Y>uAKTBo6K(}rer(!4Mz7$kEyI3vxdL?Py0`d+ zI8$SQ6@MIfv}%1Ash1yV*H=5|`M~{$`YMAF*L=HvUfZi9XTgGCV@9Tom^qP5eeVq~ z+c}Bq25?qGQiq1@wS3jmjmnujTes!Tk94WG6*5kBsvCcKRiUXv5W@oeth8u^zms)6 z+UhQ8H5f498abc8OuOtL=g_lA7{2<$yip+4b?lIM$RL!f>XUsa+4e-S-wnmV$-_{e zZ0b%D&OCRue4lfyzgxO$!~vMvim=OVF<(}nW9Z9XbB%Lc0#(dnwY21U zxk`^vn~&Y%oDx|%ttFrBYfPM;U$1(^GHLaiglX{2j;lVLgeP*kifE;^y@r3g$%|x3 zb@O)D*rWVWjbHTHcA)RJHyDFpJvcb+6OWAaiL@s>ZOO7qWqjP70`~52MpmGo^UWVf z2u#ruEOQf5?ym2=A0+!(biVn~WTE0x&8@BYf!HU3bNR`&g zHZ&7~M~s`d=4fzVA^8C_feYu;%g4m7`OJ$?^UT$+YP5KNyj?F1C=xjjm6hGGoyP4| z-Q#Y2^t6EB^T!2HhajkfhhNb0QUMDWU6X@X96Q2OGgNu}tye>2r(vhXtRv^v;cW8Q zlgS1qa%MzAg0W`w(L2OrU9E1wLNlG6Las|!oPWCPcq`S$U?*HfZnb!Jg~qb8sB@~* ztP`hmB#LTCyTQcO3aK3ji5k5&o_6Uc~FT!?;ZQ^>j3 zZC)U963UC=Sp3)=7T?Jv`jldoDZyPQ`EITi>W)+-eR}Pa)@RqPtO=D_BhHye2Auv` zYndG3h@^UgI|iK2{%@N7TX^*$7CS(AK(*l9@Vi5fyu zswIk6RRLA;13qc?U&MIv+W%>cCm&^aJ?k_Fcmoij2kZXuzfddoFf0zx6ClXj(Tv;= z%8h{=!_5MMlil|=E086W<8D?e%{lB4-=A^re1h@U-Vr58Y`dP5Ec*VjfbK8kCMPDt zDg}VB0N~<4SWTjlOU8RP-UL<3Y7yiJ<)5MfCY2*OTsurFE2sK84>~!MHDrAD_?=Rn znVgs$KI~3rz>(Tm;9$+}P+_Qzx%LWX2t}P|*^%JJJB#@%WB%qd)R z>{1|k$GA-2g%#aT7P{x4b5*H*6EV-4JzA8{+|lIiyiE?+MZ?N|DufK))km8j@zFL* zO00Vzugx|42p*O`bdOsO(t%LJMt z^*-VGxvbz$;f3Q5=j(PcJ)$?!CZvBWjjy)I28faHbVL?GpzR$$S;H7 zY?s#{1`b=wD-cYm+c3|VXfvIB|2TG$@ZlgWTdurS09}H@r^cIm!IjCbwxBnVb@txA z6ugonB1%i^7xBk z$_|(bOqsQEnKe!i;4>8r$!$r;QZP8_nC^JSS+!9R$ zeh`$dTA(X65F&+xLNQ01BChH=u=G?X-bI~;5y$F&wbO-W@@bOwSQuAh0tPlL7hTDh|ovS z-ou8F_NF*G)k|+S|K{((5w{|RSjSIQ97E%aM^8*nG})87iC97RY;t`M&$fAorwPYZ zZ0M8;P0mTFV$__$JX3xc46Er%*QogLlJ|IWAfHyF`v*r9ppE}XYsS{})}vqssxM>6MD{=7k;@lO;WU>S)v;%Iy{%4Ux z6X*zZp8rsLV)u97VgY>j{mwm*a^hQSMqa9~V5BpsoT*{)I#Z47U7jpPXFY9-dlN-R z4&J{A&-JB&g{1oP7QH)GnK{dZAEAQQ{5r$sPE;UFn8o}aApL{O&OTGN2cE=(O!2{DwYAsb7~wVH zg~@q^L8-&RCvhpoc~d3}0w~GB@n1S*#Cz+~aOs8Iuu~ikZZ1@{+BkG3HhO<;#>eJpHQT&_Ot8*zVH0X|2V2CHu#AgIpb~uGsnMrj*wM}3y3fn zMeQCbgq?c07!3pNHFK$izOO0+nKX>=!%kk&OUqfR%#@UWwLlO$?Q(z+Jg;3!LMGnl zP;imTPp)LCsB|@&<`#Xa?m=NcREH8b64|e}-fN z0i4+K{y#59hr@=8ZhJTS6TM+AhC|6NHvHA(z)kcDtF2(-HFmSS3Fv*&1Ni=OL} zf3j$h^So4(ep~pa;7~#?7R3Lw4<>u;k&M)&>*WM3;X#QHLjolP0Lb)z9_hTUD|qldJ2>$K2Mx z+qy5^XvYGSHRc=*YJ-h(R~^{j^UwKn4Vt@*0IoTFGU4BFHCEB;tGljE#_VRhtRb z?qtj~4kAzlfY(MXtykLQA0#=3|BWOE`64ieiDTcy7O+4(@Vym5EAo=0mIY$)=yF8w zbEjTBpE#!nLT?cZ--gLH-tP3HQMKBI$sqFM*!yC$cEr~C;=LH*X+t>X#+<-jqR7Ed zaLkt^9rVL0oUIvwy5y)e{F95=RA1+e19>bM5eLT(Cs1OY{wkH0cU*ue)+Mpt zR$K&fA(K^$oQ+npF(&>({NRs-z(8%?N`^(nSmp8NNA2Y%f+hWRW`Z`FWkdZsq{L)D zk5DFrQ+frW9IO*aO!m#es+2Nr?M=`?wLjrrlk(npz{Y=?cmlPEB z!|1nFtQ=1-q<(fR>j_(k+KM=|kc~B~w$`~EIrRdKbegpYDSYjuW7Bb=fF#kd3C@j2 zao}%Dj$-Oy#9xZG2x?s$!{;!&JOn}Dg>iwzUbk=MQ(s#I^9S|$3bIT5y%3&-p{!7@Cb!d>vVfrtT;@4^pVjikH%Tas zrqtoK*~BnR%q=wnT7~5U&%L+-AMhso&DXu40WLNI?Nm8AwFbnor4VSXXOoQKC(u?o zlY5TtPUt%*I``-;DD0NgEG_;E_`O&^^Vqt*ud_GXj{etB4K?nf;;E|7s)Rs`eGm zinKt{;YmhGcKNIr>dhwY`T;M+b_Mg0YU%wmLr8@B6{SU==~{;e`yN&a0;z*ke-%X# zY*HCd_81T7>;Px~PE=eYf2W@l-ZG7UVHpG`^n;wW+{mCUGo$auCKbuErk5 z_Eb5LIVjyoeu&c{g!^MwV@~;i#q+ur0joP%5|hc_z%oxmKR>dOmXq#NdflX* zRW`k*n(HQfGy<6z9CMOrpE7t%Upw@^5r6Gs`aCic3#y#t0T)VQ6JAT*Y`idBH9flM zTU5-!Ks`~=-!E8bky-;S&{b|j9#HY}|6sU;!t=|31#yJy54ux3zr1WFG3)uwt-Bmu zs5pr1)?G{JJxq>hvA{e?tVnWa7cNV5`;&%_DP#Ho89so*rkFWYrgyV&%-*XBn$=AS z+VEGmNz7`^mO!U3KJ+l14@LmMnIlctqlHtiB1WZynCWnQ)QRm4&M-jStXwF5EF=IM z6%BsjKR8@l(~RlTDa};WEpXtDngpzk^^Xwyy;RP5#|XHe+yM`Ou`@LWo%FgHVb^$o zbaSe%k;DNRVZcNR`#4*Jc!7JalP`xIV|EMZPtWZwCi4%wP6g6=CHu8hrf?VTA5a3P2Uq@Kj!E|$+(_Si7dyx@U^zQlEv(D!J78pEoL_>6 zP_!gLjhL_`C3gtNAfoy#8AuT1%*WgobV?>&bl*ErsR?H?%0UXY6tbc_h#^GW7ls8h#3yrA`fVNN~4ra5LQx{%_#(IjG)- zeqd(00DN2=#{OHO4e75LUziQzjlYE2zef9~*rY>vI53wv9UnXu#7?Cjd(c)y7`aY6 zD+VtoLmm}%=3)az#W=^Rgv-_?Fg`- zV~}YXelEZ(^si_hK^}f%+)um8qvu3rerk7qWB-DSZw3W`i2urG2}BeIVCa$w`EF9k zWxy@k(OK|P;Br6^kOOUKbg?^nx|1!wrBA0jWuy1EM_<}LUUuM>^4RtJ4e~%wpu=Ij z=!LptAC2Uq8wdx}EhFh~BkQ?jANN3v2%x2Cf{K-szc6-CCtU3gynt?U(_iiom2!zr zy1JE1yFh3o*789ir`DMqLt$zEN(t~Xp$Fjs;Z)01xQMWl6Y|X+F~Q0iS(A9Z&)^9l z-yBBbn*1b#KUEOk|HjiLI@BC)=Eo+>(be`V#W6xTfbj_Val?We!N5=GI$S71JGPWe z*+IohH#4d%h<4(ntO;KUmi|KmqJuIj>!Gq zFai1jR9JSoA6v&oDI{wp|IAM@GsvEyV$h8dR$yz%glr^x<0be-d0sYe0V1xiIr`;L zy0_Li*Z;V^Q!FesUtd?%b28UMPy{LTGrmpHGr;kXWa3614vEb}M^}yNsbIB8dCJ-L z_;2ovW1kYvMq7y0EJ`22KCfK`HjRPp8Rln$aut2tmc2&)XwG+KDpEV6m9Qz1thJE* zS0kmw+d=FuAKjHxT#xDyEjuo(Tzt#)Oip`!eN#zw35;Sln0$%&tCbcAf6n#q2~}-z zvZ04NOcs3ET{Idp)LLc_qiQxx4jB0wjhAz`=u8W<Txb?QQn+jvn+G^8`-s&X!Gmqk&u6A9gUgtD7rjy+w7c2eGH@*&ja?Mv8>VpP zNo_4iA|W-}SN0Okwok5l61sh*M1PSTi(f}+U4fw*wROQs9PAxchW!qP2hhi_FelMIKC?2ES>mdJiyxaDbG zejqYPw$1LSe&iO|+xe zFvK@>iW~=WI_whPR|B-`+abY~!|0ONO|$l*$JIee=qtaci3v+-AlO(6W>bMa2O|Cy z{$ra*nx-&ui6f?;;?{HJFxj=qlm;BTn)TnSj6*W7G5ia#C_prf6Ks*_t)rpSdcO&u ztaLFKT*v&R7=X)b5(vCxC!@tsbt)TvXI+B7(b+bgI;vde1FBH&?g}<^w#+9 zKFo!rE0hgziq!NaS|%jY%g?!+)HOee)?qzZouUuExvY8~7-ejpJ@f54l%B5|#h``m z@`myOx11%8a5E&M&b2``3WA|`gFkF*SbiESG>ECHgR-+dVyY(IU~RMMA?!*ZM*PUW zoG0@1@3wZTqjdcjL5%c5fIZcQj^odk2++>}wKc#n4HEz9T>!lfTePA^py?$9Vr6f{ zfLfY>Rl%Y6cR@P3<7cPE#rl3Sel}ney_vieb{wuR&5k-M%2k)&3vAfZz~p*hj|n1Y zqf)!1hUr8}l6q}TgD^Ygr}6P9OyynII$5i=s=kTM3t>S0DWyHj4MlbqtPYq}*8_P%&T&QrTB2rV3!qHE|81f;5{HgYR!s`H%Kn;EN^5DSBFcCO!iB_bZ@@jgzL$%^H z($PvPBD^7)blolu`_3e$t`J*IUEsAe=cgqi@{<{F5&OB!hjH>3RvbLV}rPdt{*^o zN@MSwS!Ja-YrnA91k)5u=!AqkEU{KC8ajW%o75A2{ZXT--v_zwT<(LDCP#f#g$D8t) z{F&<(pha;`+QQ;QeT1G5a<(ffErJj`lgC0q6d-c{+lja2#L@j{69j{kX-lb~SEvp_ zj}7o$TK=$(>3EOC{_XIYrpleAX4Jk5WG9p?o_@#$EU0o{Z`%t=Li?!2moH@0yWY#` zSbX-qG$tXyLsCP-$Nj2iHM-H=TJBXttA0q*no&IZTHWU=#^?F>hPz5Gf0|z0$wp=t zgIaSqhi?SfV!uU`Yki z@zAYqhpZFnibdGb`kuh)YH|cR6bgI_y17C=6rNYo$_n zi@+(iBf|gtW&HP83bDMM6SWxMP)hMY!ChZ)kfQP~Ft5ozoQ0aQ_hlYbk^b_mPHYZd zM!yDPbA`oB%>00W>>wH`YIQzW^K+g3!9nJgAJGJ^#x}!h6zVQUPM~GXc(r?H%*f@a z!*SMb+d~kw%qCJWraE<-A-bgu0DPXR&w+L0hBMgW2^cnB~te=*{vngt>JDD z4$AHfCM~8g1FcVYBI`wD!aWXmEn+S@3Q-q@9yZh{r3}}o3=5{|6ZC$vT-!*bUf!tE ztS&RY5cy|g;PJtt_zib7a|kfxDP$=KA|LT*Y{3xXpt3fdfG-IBE7pd3X-?^u7=bJE zjZyaVGKQdtr}#Li7Te(pA!I$<4nE?sRzk{T9M?wr-%(wmW3~~i_+?h+3=E6SC z^wNgyr|w(8v%*3LslOI^5uWfWz1!$}rc;&f`*p%S7DzGyjPtUHg;nWJM3e=_FmPvl zL>ZgCL`6t-D*Ozlm@^}~N(jl5r)X*+;JNK1_CRuyXFg@#2Y18^fj^*AHL@3$0QgbB zoasc{6`vi_Fo6nbo__pApWVDSNpUIkM?ZnmVS7dCoq$bzD_-`jOr7ocVaeUhCIL=+ z#!2`770Ic!HNRK^2sjoRaq z94d>UWPsEpN$P0%<+$Hvx5Y#eUGS#yl}b2}q)k3?P-8Oh8=PBzSU~N*P<+)S2lJDR3FyKCbND-p8^_^@n#K9Q|ZRXVF8S^eQ zERLE77`_gVn;gM8Zbp+fy|q6P>6Ur7M@-r|I18Mp8pCH3-o^|+w=h~vbmke>c7`4I zjb8qRY2@{uTj4E;Lm&s>HG;2oRkSde`Sgr|tNqa`F3dx<=BYWni}}Q4z^?n8{6PaL z9fZI@rz!>zkND%)IAs0Jr-zO;z%=ucqGoJ=c-v#19!WqSMqhr#p zu#ka=&u&%`vF(S7QrE)v-xX}TO3Q_jLRei7dZ2@GVQs<~7pQNh(^*I!xw0W+L&xL9 z+S3<;_YxSs^?gBB)g3Qsx~S0_B+dAUzh}8j>^ExP^FB4sG!lBA=P*&|=kJ~H-#vUd zgU_GK7njmMvi}~MenL;+k`IUZHgfPmmbZMTsTZOle(G1-w&l60jP}d~QUvxs#{2j0 zM3uFwj@ly=2SH4^fVcppd{s}$Ls?T%mpHLK(ef)*{Q8HtsA3gCx#zX>lj6MkCAXn2 zY_BwSVq4*4E`yW&P{J9H#L8Hqzr1DleEd$)@z&~O7#@a5mxN9~3QZ#Pz4-K8-ucx6XzpGA0XdI@qUa;t`Sa8)LAg>y<$lD=Vzghet zjXYo}2R*=1Q`n5}zd@PqYv3t6KC+#LAnnC>tEL5(cn0@Yt8aFuz+*2h>uRT(A1!Io zqkm_z0@;)FTCG->orTFio55ulz9Z_-m1=&TWHS=+{mA!#wYU zkg)a2t8l8wFjQ;TOuxP7*%^gcAy(+? z?;9>8A1y3fJX5m>Bbd?qZFE*0L*(|hRk^s|6>LOFVU>PH~U z$(;t-#nR9sRJ*Z<{rMR!+QiW!cAKb36EM8&=p77Y@qf*~lUg81aV-CCJc&wNk$Is5 z+9^(X>uSlnsoc8YL5lhin*4r>{ zWZC*dAnD=X^N3>*W>nU}<5@dLg0O)p#uK_NPcu=R?>N)a1C9;2+b@uKm_d@YH^E(| zUzPLs9P*Lk2RcTF)?W@v%hOJAC6bx)pQQqUhy_%u!vVOW)*IrZTLSb__X40eDwG5` zvIQOeRt}RH%23g@)kOmz0y}dc|4mIGSKnjI&^W6u__pGC@n)lOwip+5OR~M1b@%AK zY4^rs?u4v`-X(mD(E=&_?>^q3CQ~Uvp$x22#ie z4W)iX>y6seM8JD6;Dc-v7^z)TcbqnUZiygYv?71K^xFw!?+4#G2-;#&Rap zRtLgwn{Oik6MFx}uPNPrNrOU@58F{ou1(mS{f| zMFkbp$LejeM-oKGA(G=TLW~Q7AE**s$KncMWqL--C5*j7_Inkgx9m|^XJ^ayvR)a^ z!nOI4m^k5B>{cP;A|pA!{=eceb;#jj-t98BO;XGu-;$8M4Be$ji;eOAvc>IBguB4^4N5l2uS9y&IJh(mf=@4$;xHIiU*q1_o-2AwGAq1*DR5EZI7cOB zovHB%U1hK~-o4kSF5cp@-p<~F$){?_j2N2^Z+V7>A@JTGJIw1y)@ag( zgBI-$?rLEpIL#eMxkxo88yHF1m*a98*XSb;E}TOUK^r08f+0~TDwFOO_tD_p$Gj>? z=YVH$?^NYMg7Rouf0(I1`X4~vNQt_7+9>v^zz?8dsY)3XNH4UFr25enHyBe<$4;2Z zKxJ;d_=_B)ogle|G7+{@4H+=8Lp4ygB@udX=Z?9A+{; z1(6^@53W;bY`D+w0q9XT1-EXK2?PrS3x(Gg*a;;r%Bw83A}6D%2mM;A=O3|JG_;aC zp~*^KnmR6qjsDu+dTu!`&_80Y&*L!iPEDinl!jP2l&+`E6ygi6in4n*GS@K{^!OVH za=x{k6>l`@a&Xba5PWb+DSS+cmoGRHAuF%Zy;zi?_eA+JU;l*2@c?!Cm9d`|6JSxi zn)*P4Kh&5$zZ1t8S?w!N2D@!1Ko%gvZ~KZC8%OiZuMSw_-U-itKMB1U402vy>$Ahz zP;t83zXO=0x>iR>3zxg&g$3B*AmSmXaTAZ>{pHvytX5((C2jl;GYx0?TBy8WFab>U z8y%b!+=lJGYyRA(O}-AiM-chps@Gi6eigB_yrxm zBi0lItO0Wr$xB7xZ`kFOP}A=U)h;9fpJ7rv^ClCdrwbGIf!M^EQ%EsfX*x7wKvgP% zTZ*zl8)&s$exrA}ZhgF3X8i&tTFFXdpeLrecj3UZE=UhGHB|JS3SGcCN2@;vFPQci zYpAk4b)e&30O1*1I`MrkLtgNZfmw9Rp z1@dPRY#CMwOyo4tW1HkH-OIzH6?PT%%pZ~jyQ7QExHC9x>zj|$iE;ee6fE13GWL34 z7-%wM+L0bN@V+%wMY`ZCHv<0jwbz|?f-v^j{z{(-(PZ*!vMnk#WG#rU$t`th#Uc~K zHS%{nTBl4dr!ggl>g^kSQ*xEn)3(kE6q&75`-val?fx)&d)+dZ9K}^ivHl*u`m*h} z4r{>*wk!xsv1L_pM#~S#h@ZGbcb38M{eP=1naj4(VuER3(6A>kX@{bxcKTn?+)N-E zVn2N~qaBA-iBZA1fIgy!E;e7_lNTr$Y0)bSJ9v?T?h^*u&{@hZ7p+s&w-x3 z;L7C_XZ3^B3kr)t#chf&guK~O4}Gf(*QXxgVHV$^10R>JjFCa-49x4bC?;y7&b*Qo zyVk^M0=21NqQE{ghkio$;?}r0$@R|m^GjlHV>alQbQM2r95IZpNUReT(3+C=(X-gy zq>a3SvJnrVV?2|~Jxc`d8_hz_e`#YHrg=BcK5@{$FyH$ z$9+GA zX}W`xZ>S)4y;}H}qKj=carWyw?HW0bfzrK;$4?rS6Pc8BB2{|vy+EGkK0ZGMl)F@4 zTSqze_M~m(JvK7SPe=?6q(~09`b^(k=Y0#WezyjCMw?eG6S~P(3U0P&@F1VRj}0}6 z&ZNh#D=aw>DuNDM;v;WW`a!q!kGuB|@9bYzUgD#k8}by=tsy~rtaR&4GOb0H5j0c9X!zJ3SBkn5lWc;dy7!fVv zcab=-9%KiHI`g#T70TRR8Y1YrQMyCf^(=A7wwnJY&UFve&0s}@y&|R=n}Ce2#WqE1 z+?F4%XZ5@v8aHURPSSV|$SAn!to^WC8f8d;L9=MJlV=y|H9jB#jxYfjh5O-Sd1xQm}P}c z?lq|23L5~%Rv%{gRQA)4&4|aMxkRGh21-mOlMpR6nu$4t2gxd>W2%pCA>hi(9<4zw z1c@rm3bC#FO-2S8+m1sMBFZ3TSN}tURl2t+tkQ&Pw={12d-59o%&<)cZ@Omdnds`+ z@i+zsYV1u3E+_==C2J00@|+yA?7ztV`_cW!W{eY4j{u5%ClT0j0{kWPgkm~hBAZA3 z;5q`kI8yrPglIu^9Wi+VIf_!JCqkrWB<6JtDG^q z4kEub{dV9}d||eU%=J23P0nvu4MBh0wewS;Q77a^KYi{*e==YwMw9+)#GLZHvkPV3 zHK*v3+?Szn9C#8#2L_lWW=90H{!-AV@h8`6zW>dpuqO7u<*yB@F%#KBM)T9oBcR^1x#8Yj`=H6#_>bU$!qFkKDgbR5q80Prs`{rFw z%Y+F8#}%iSNfm&utb4-H-CRmbnCMN>1a8?%ik zvdp;z-{ck%cU_8|?}(<)j-&F-$7Fi;LxL zjJoG_a;lzKCI1MN30W&0RlJE+}E2vbeB3>T2-Wd&uSR+)C;F}a?+Mb z)Tb9H;OWOBk!0hGFI`?FZYE07=r-aCi#n&GF+f?NRUPK!pz|EmBp?S1p6L%52V=QM zAckV_nT-FLlEFBYnUj-a3>;h*mw=qvR{?K@7fdwY-wH5qhGPF7l_e^#$F)4~a=V?2 zapYX?MXtIaY;zw2oro~Ot%#j^K!IPHnv}u%cVArdgQ%u-4H5p?KG|D2{Bz=2q((6t zdI69kthGLt%Ph8SI>hw~Q~dE1vN8VnWA!*gL-v%8`TRP5-3+}B4Rpg8|1W9iqvG41 z?$mRwt5>s}>p*3EVHE#OB;UUKD)#zYI?_P93IS5+gDc7u=QevyTc96b9X| zn^0+X(S+armrw{%Mz2Xq?6kQpC$FQ^rw_BC7XU<}J^*FKQ)GghDS#Ud4BW%kXXqY_ zZpj|moeswb2k!xpd4;^5^iFLNtTAy^Fr`k)ap38+d1DAZYrk`6$!YnS)D$BG~4Pp`R}38O$V&AZYmx*Zwu za&>^iVXbrnaYhSpB_GuK*fcBAUZstWdDg`1r*rM4|Hg5o>nlaqXj`w}-aj<=?GxHY zR)%g*I+!Lv1d3h@{fwD|*`lRLdj`o@Vp;-I?*(~;dC!~H>&-4Cd9_9J0~a+cmL9=h zQngwyM{qOPaoF}d-il55t^7l3w_Yp;Fb`nnnnO6WoJ8VbSJ)RtQ@|M`P(f8wM-0Xg7i3Zz#!hwS&LE=q zXr9|V)KNbI*#gy!hY)BD?dO7uHrk3-cL{O2HS-JX{>R$=y0z0yE*_NfFAnTE$`4YH zd;8m*^VOx%%h@59f;u71SKV>L!zup6UT3wwy>b&p3LOL?m58rIQ)5+Cd%O=~vA7`; zGv0sJI>>rod49KU*)wGs{mcVA_O1w45N2N*vDCq76u6n>mG6YMn17<>NBH7HMC~_c z^v9yHjg~dgLM^YUhSusI)DKV8=M(KAaeS?O%!n7xig=}B+0G>&$?v==y}>W{8zCCiR& zrDe};K8V1_7Tx?<(S4#``};da=lqg5#aDUbrFpAc*N}~x{_ATtY9KUEWcgbsb#C=1 z)x}Y9kn|%{wU9M`JSJ7!Kt*N^~|j zY!KEKj2urG`>=T~C-JPYu3zH9XFT>2B;=lxzi*73_IeDm9I;=NbGTR=90vcbdY=0J zX~%oqy((4==OBcb);?2JAM5_QmrkF%6M_>jpxr8 zi@@ryCwCM0-YjLU!4zh!cpA`C#J9_Javm$69zsWb%?nfp!>;C>eJ>%3MC$sKe(#dO z=qQ*n9afS2TQSF=(lXx0f+BD-kmA?N4gDHqc|aapB53jB*^Wnysbb}wm;3H>kIKLG zNp$P7v!8m7iUN|uX8HPjpu>1qSIbp_u1JV`^Z*x3cxY#~>fB4y>I^2Qfs>WGs(FzE z*53u-5G}~`E`hJU7q)zzEzwD==Qy2LNw;;^s zy9CKdLVz<$WWF~4vLeO!3FKhHrF*MpB+4S5S$niJ#X+DGCJDq!d3;23+|g{zukV}V zDCX4Wz+Ir8g7ctH5reJt^&$ATV0z?HWJ0g&tNrMsm@o3ch1vK4M^>U_Bnvq$$sKQq z<6|lK9P8O3!`+vMG%QH;`1dQY=UAwe-&xtfHiZ>OlpJaYH0~hKAwVXuF==;?Q0vj> zIW=&X(LkJxz5UyLYy_+L(uQY+jXix9>eGn)?Hv#pB{O$#?N0*Gv(L0n;?w!oVXRtH!Ol5%g3)4m`U;mMtwK^!m%pbG8-ZppU zeDR4W_OUm)uXNUr^;!6_Io5I^;Zx*bkZ#k;HA|Z3QvzqLGgZ}Ljh(_FNPE4wS<8u} zt+kqbEq=gCjmAgHGz1o0ZO2`Z*o8cDk2r)7y38&{k-YXx9jvr>p&LwihU|yX-IsON zTCw)#%fI%K1X#2QvX#tEyW2eeJ_zendW4HcZ|veRgX5Npe&yif&l;-Ye5C|`J$0_M zV0Z-4uFJSn8~(;0>ilBAf>y>hx0i{4vy|1@ zWq+)^G<(!ex_~CBPwK8mF^Dz>!UIaVjLm)K)M&A1mA#s+w#W8zbdgbBmb3X&!&^6V zHZZmt2tkL`_HAO8kbB=p&B$ym5Hv95rdAGoc9 z2uBi+0~f*bQIdDa!K4S}1RLSqWGf6yvF+*J5fy6kz%8)3At=@-q)tXNf7$I^x4Nr< z#ccnB*d1rlOfgt7A4`jBKIx0P(O~DiLHJ}xoJj^Oc*WUvUz$-C>-csFQMc%<*)+;l zKD1cAQ6`p}WkEfEIhQ%Zksad{k62+9H{B9XRLSKQ)YX4u+K)-cxKN}5Mp5>725%hw z_wZ+c?U}$2_PAY_NUoIl@t+0vUuy*Z=nYWG1tz1dFht%!B#ZwDtaVs)JKgR%LiXLE z3JZa)fs*gKZqcY(HIawb94;6D3aaN9`E`rohp$L{!2GYUq;{VL z^?kcGd<|w|A6mP*>HSU%x2vPeN=lZ(sWxS$wJ7UPp@n?e@lchmyvA}WUG@az4ywN9 zQ(NiNWEy>gBKTioEA&>>yg=?=&MkcLd=K?cfU7vobQ?cNMgK?{BfQkGcA(4xmm+94 zPn&b()7i-87aR6X%nwqAmF6G{`}gnEyno18t~^L*k}kO*w7s&bwqs+cn2BHy*3vec z^@`2{f7twiP%TsWAam-fx)Z5xF4y`tk|+nmVfMUc>fibC(kf$7OFw9}HvIsOA=^d8 zB!|k^aqn#ZT}{YH=qA!S7}EMXW;7W_7Ct}~Bs9*a9Bq2vpkJ1vJ|L=vVpd6~F@TXj z1>d4vmV$MzI_Hd^8eGRze9C!QI7xORJ56B#xRqw+`$i&LOUC)&bHd{!W8y`gR@8C-Ai9$9y9+L~z=RxcLpoZn{|F91JZNUG#v4SGEN>c?b!`uR3GFewpT(g95-rxI- z^Qf%qNP$HZN_5f7-Y|d)$L22z2U&4)E)dg4Va%Kj0i;y55w#wr~1$ z^jqmcb9EQOs6&(lT3B4%18sGf?ycCI!-3;b{cN|Ii(j!w;5cwQ0kZz|B>~&UL%##z z>liGAK8FV4KsN!3!}+EDIGFTp?&9BWfOp!UyI95X>572W4n5i$v z$c*O7?(ypXpuN9(%eeZUrcFx`cEAyPcPMI#{KGYHp1^sC0k1@!;Y{sOml!(gM=o9X zbl^5Eb&x~}+Voo{lEba~89Pl}7df-n?|AE9mXK9CBntx`YvgLXZA85-Qk1qI^0#$qEq8l0+e}0 zp(P&W)iCVZ@!Pnwbimk$s)k3YnFXe7Ydm3DP|-cRV?wHEm+;H!3abx3}b0e_}?ZSfkD|RGZ}sLKu!Ks*n!q!gEHw*rc#g z1pS-mXGF_{oF1^uEDC2$GW1K)-z1Y|Gk|Ga_Uins|J{vpF`z?pIbkn}w}I`D&hgTc zRW_sOTIwlM3e|3@nQTJfp7j`4PMX85#{W}|h6 z(H>9tBm%~pPpa8Ul-Af0=bwvV4_#KZohFEDj%(C~>b%L`OQW10v6KRDbZMW(ujh#1 zHItwa*~j`XwS}30dubuh{$dc~24js~47_`ep}t8N{F9u5sKGWp5`=$cc_C=lzkm<_ zu`C0a)is9D1dkkQsxwyiusKLsW>i&6GL##FOgkf2 zwc-o01!FcOQ_f|aJyQu@{y^g2-O>AWz%LuIrm%IX<|jWWX49UOpX;=kTi#?E=lEpC zNW8(td?6A~a;_0tah({lQ?#M7iQe577>GD%?s>XaJ1%k_7T?&+9uyJs}S~mPf3^+9F3g<-(q?p>sRIEp?{8DqM2{P^$_71$7 zto=O{P#@Z^RMUm~vuH~jF&!YKdo?|H^vNlmm#63eoeoHqzwdTLjH{XD+t21RmGkzO z?vU)2(4VKVcv`RIXz5zhLUaw;d+AMViJtxU$N|xf4&<9cQkqs}`%p=bz}w~hMUTqg z*G2_5WvsEA1Bkzp6G~@X|4sTDhzdFlu3)0!9ns?&Pjz_ZGeiqgyF4W;{jLn#{|x-R z!Z&^UCoOzph|#rNNP|wuJjcFy`niBs~KdO@omSp9M+)dO@p!oM*Bk+AAeNn%&Y~oXDGA}>{S(h*{7v8li?J<>HtYc<_Ph1ex->3`S`A3jrri+wJZeFR6+^6$CxL9`D<^lEJ6q?0|hpo@U&Aue0Y8 zpW(R2M&Xc^St2Kp*df<7Aj{}yk~M)hqk$A`3b^wiYLHJl=Ky!KYZLzu$t}HPHR=uI z%dq<6X49&kTR;q&SB(P_r`=R`jKf!{3W+hXGVZI`Z_HxzA*%K(`yMjgVXbm|%GmxZ4Yvl3yKcL3LBmN+#1}u>;Sz zMQx!fZa7kA@d^Li1+hLPO!iTve&(~(^2b(aNhI>?Dxg>d%F*SjgCr|1yfyJ)9noQrz7|JZ^99Z(qB`z zodaCP?CYaA7_d(d<(1ht)j}LswL%UjgV>7@Xnory+zZ~tkLlhk?UN*kqDZ4=9N`& zUr0=tIj#ANtWxIn;)>(@jqhAw`xAEYoJ;)Rxl&7BCk&Vn$~1?xm|^aHvlzeFtkrM$ zZsF-sY6_?UZtdu5kof=uzkpeG%AuHMi|smoXa(N^-h>@LY`XIet>k41quHP8Ft~FfcL>DT;k`E+=|qQKYLe`@dmD-g8U?Oy|Ld09T&abTu9ie?>Nc&IYSp*BDqG_Po!ox$qD4gc9Tf;KG?vV@i4=!uvIly{4A$N zksZE>!0gE(;W*dn@4D=+OnVxImtS^V<#iGFXxspDrG6x@iVP-iTd`nLR-jGENFGCW z(P+dboaYhQQ~TgDrZ9#kT3d$iT-9&J8YZe5gDOQg2H-F(Mz z`?{1i*CaV`_J7I3Ulbe0G@-`%ijeg@-GMZ(1W^pRlg(TZsLA-7l4rA?C2`B~H|5w! zCYqc1`GdMgn^|E2hN{%VS&!WS_`B!cZl0_pvmGM0QbqA3u9sOm$URpd9PSJS^w!~ zEvAVDv+HwLqLx)RMf{6{*js{YWp!uX5M?V z*B5APKYH^dYS5knGe{EN8@KmCoh^w;r#D&54vRK?x%nP$)IPSZT=CPZJh{z&;f z=M>v(2ZuqR$SEEBriIOgk;)4h<*I9(CZW)PtA}EBw7>C&^ZnFoOax2Nc~tc0f;T5x z9lmy&eEY$F4R@i!rz2bY8SE&8;e$V4YO0B6Q0t_So^j(hwFi-h;ge_Zzz{$(YszUB zD7FlC{P|)*wCr+SB#PaUmo(YKtP|YS^#C!MUVE=#wJsbmDyq4A>3TJ>EAk}4f{A=0 zakYwZbT zC*#*gda(Gr7+%^%IKF7!@(7Hh`fJq$5wsLfa>&&MQztR$|J37pY^fjA`&)NWei%Sb za){H)W(><*KFTxH?#5#fp|K-r!<14-M+{0kPM7E3mev3dzm)+YgzW` z3k5cJ4g+d3+;^HoD5KN2P>fx?4jdk32>he>1_S_uuznzo3ci(6sMlWQ-5bzSL|`QX zep&)Lb6l?CR+NUP;6M4vgQw`(C84(!_1`jPj;l;nQuJbfx{a>9*d&7mTS%h-y#pCj zKj6Kc0T=J5)x9?(XjE*~*J<+kp-oy3mtk9%Z78Ym5W3FNROgOU+b7nCi6Q$P;<6;ezU_0-& zKTE_)bMvMUtq^6=yc(b&w-yl$so%U(aJZj@rR_??hjvFDm^{}DF>dq1!tR+ovOpx; zqK&rbgQO~EaD+50#f{3DOsP%9lAKx)-wf=Vz?bZ|4YuNTjx;$8ICMo`6rNGF?Q%ry zt=8~lFplb^co}>rPvKQ@o+=(CH7KVz$kAmvOrsv}-t&O>+M>vZu}#ZqYd$>oLd5}q zF(fzt!Z6FHUdb&GFQ1eFp3Vvwk{COQEhVwAcYG^_k5oEiIUAAM+ThbdXO*`$u_FJu zLk627PYSvburKLOg+g|{IGK*a3DXXp1I8DjQ_W%S<`;Q3n z;kRm3@G+#N1ZCZT8;Oy+w!e;RcXALJaC7q^EbO8v$zoyKD1_;h1p$zLy)Nu5iitoX zn=PV3bn92BM;znT%xu2p?-A0rnkXZOCIYeLN%mc25O|sNp+KH?_?97}-J{)?y;sq; zthxnJAJ|@Tm+y3iy}f;t*^Scn3vvlU9?HtU-CIn{1s_d~nQ7Gzi@w#+-E(xUvDA=X z&3a(qOn{xX-6y#s5$CXR$Msxc_ZiCvEpeA>;opthiq0&ygrF(9lN^jR@?1C?_HWd> zoNgi&vTApUjN-T{037yX{cqW@>5=n$22wVkZwm)z-qwFS=RvBzn+4v#?%=V=so5eH z-M7^!LQXZ@(nzYeA^Po_1ewEbaixhHd35TN7%{P3Lw-8!4d#_Hu|}~%PqOLX^@bG> zt+!0Ioe2sMigS`s`Tuk>il&&+iZcska+BBME>G3umh|pecKFiIOt!l^Ts~7O=?Ypz zj#Jeo$da&`&n}7GqaiO74Lr;MzX-Ye?dKW0FwFCZI*Ie8)8(5QB~CzLX(x|8*`ZT4 zop+kIuCHVRL%gIXISMFko65H1*+u3&?|&~iTFz8iWAI%T!yK1jQ&f<2n;iXRZ~H3Q z4x^JpM;$vh=cY3iu_OH>mNznGZ*_;Zz$3Y|s&khG#zK2FntF|T>RPAhyL1z-H+SYQ zpCzG9Y+s)H(E#+}#4?gh|NVlw$E?OeJ0Bm1)?9QgWYx&jj*FZZS1K8?9Tc2;fLd%M zd!b^7U0xfF^WyGp?s}t&9nI92gT}TyulNDQVxU?i1(h1qepU^ zH>Qm2MN>~kg^df;p^&dKw{K(9I<~|@u_U(ySx2_e1L18-Ul&t_GM(8Mow1aNms-QO zdNOjE^ASAFTX*E09XEE7%q%6!_Jl1?P9U10E?$)^8VOsf<@YOQVY?N3vIW~?N3jME zsfKozCVlEM%qA}>unLS3NC4C&Qq%iu=S!ALl{)UcOA+IgZL8*rIjv?zu^Sfh#F$xH`@kmBHB|9QA$ex72nw74 zB?Syd0n?1wetubuSYG!*Y`&RaF@_#i=a4AOV!&{dHz@UyyO4*`1B?~{Y&eZiMPsLb zZ(pNTe)%o6)>9?%`r%Qr;>)@Fwy&5Zo;)=JE3)W}m7a>juZ@4lv*XlXD+%9BFVloI zxSXcC*fl1~_rZTraXeHK1c9~k;Ct49iQE}kjP;J#4)nAE%oHbk@QB{WucQ&5kwiaXnS z#bp5&V~^Qn3i1Vd|Ax`%#%bOx!K@9;rh31ygNbXCW=RiX#qpxPg(7d-VClMMDgITx z*pjPp8tqiN`vb;V2;K_+Nlh^oqY&QwCaD)qp9Ft@Qhu_)!of05bfy7?e8ecH!|1qK zmnHbaFQaVpb}-@igQ9k3QM)VyYqnz^W;8~y8V8;F$y-HsR zJ{nC7ks=QdL4v zHc`^UY?l0;aiXLpxmbLwJ;*k@zYq^Mwp8Ugb)m@W45oYm zw5@X!`}w4N!V4FxhRkt>rTe>R5<}J3w`gr!+@K0ipO|o8W*s)g%#9e()tQv? z{BRO<2W@duH)SXqUcEFH83O3;}D;q!h^3@P#8!O zjOo3ZKY}esFDWpljXxWkRfKaOT)ZdqhMotvu_&Qm z6D)N-M2Ld#4{TY4OvT^#$R+}LOvS!5Q#{DR_bM@aB|0j+4-C6G-7MG+P;8A`-BvLWa=xD`&!D)l7V{K1g1U-d#m+ge8s=%e)CI{(uhj* zvQQ$pv12B@oKZwh=_m4!WxTKlXv><8?GxMvmzOMJOKl3#<_n0Gkt%!o9^+zY=OGDumT<(?nw7%EU6au4tg}in zsWGe|plM&(`{U(^QTW`z-1nEqG&H|=p8&>8JwSbDdpkjS$0_LQ1K{a{(6fBk1{R`u z0`)Du5@w&2rW$ynVqW6KiKMP8N7>NoXv0S~sM0=bhyjV{oPo|-JFZDxc}duHeEavJqLq|?(v}8`k^w0k$INX?~LJ-^_gPiHsq7Lwqtc3P~ zol}A*_Kpo~l@6+fIY>x?*Pda`r@P%V1{t&rR`{@K$3DFPB%8MR_m?AY;Wiv?14_nP z&S+^h|J>|K$dHxzx}HNNRPY=D81<&>59c1Vwp>=W&TKUf77HfC(6N44|C6sJId*qq z`5PSU=9_Ub3oBXDN13C}v37-rPVM}rf!Qn2$eYWOI?oFY3T8;`67vL?Dfk!x^7qGH z(%-&n9bh9WT_EUH|I0?y7hkOA_UWna%VN6Y=;+a7*htG=P#a=4oNnvNgz(hz}C>N zSv*!JY;nHs9GCOm8XHiMt5LEuB~^i^E-?iyC>>=fFXJT%*xYy@Tmfpg%D%^Q!ge+g z7}j{}V_|5{SW|RkQt-XyvU>^TTHa^Mt-P!XY7qo|f3m*Sg5;KwS?TnMxbC9#8oX?@ zoM9^~(!K5lb;n9xLAIRgt|bNfE=hJQ<1p9vVgg2=2kuug=W~`V4O7Zji&;-Y5^`~2@8tLOEVaA!7d0M<*>?>H^6t=EhYQm(|I}2qBih zJg$rfHKge8W=)KS1BSu-+={yW`2=fq*Be#`noU{-S?U8WHjBc3`xZQwQv-k4)W|s* zVE6M$(l88|mmF4i+Mpw&q1GWSC^64hr+-iZ`caY5r88G@kzN;Ht*>V4@`(BDH=#_N z&6xrNU$uO2b0I@93K%Kb>|WMrmP>p$w#|PnuDYwRt-gwQ-Q_HS`NHbNFS-OW#8(GyJ)+-DE8-^I{1)D@2Mhi9n9N2H;Jl0 zkS@g>cCOun)ow$jBYMdkB&d&~y3iBASH{Wtt&Vh0k5dBE6j?7<5w}JQm zjWst;gTf?AS(~YQLD-h+x)UN*=mnTGRG7c)#MQr!olAZ^bfLY@K;iz(Vs`-Tb-BqJ zjRvtZaBFK5nd`c>0CO*p-6iSqI2zTSW%CMySeThx)i(|8UoKfB-HYiKD3Cw#O2wOg zFY78lcp8;eOzripwDy7FHhA}kLWyrBa^6+h*)^5pI?7H4OK;7y#`_&~24AAY7<*Pu zoU9x+-bRujN@OuX$fl)j!5x^-4kI?52wc0zEmg0U@KX*-f;|PP-*~llJ%Ae~>ySi! z5KQ|6r~cz`z@0LPN(}JS=e26^IItpasE?+{0EX!>IYiH|-ji8z89TG_aEU10%S_^k zU>ubSdOLyTW_h;v@+#!GnvZKU!_vWXe-nuoNnC-kpe$DXz{!mKHT+u|HXPl{w|p+; z*F0Rfw*bO3L7@xvE6W^I_k6sw)a^MdU*Eudv)5Mfk%r?mtP+&tG(M!5Ai6D7D0gt7Z|0=+hg6( zx2bu5RT31jY2^rO16=*VMy{^c1N5?)G$xj-W93X4<4VK4nNPp_@vZpW&wuwi)y2+% z9SSqF=8jgd8D}I?M_}FMW2dR^~=7r@#JrnJ-+<|H@ zM7pY4hq6dcP?FKju{2Wv<3q{AiR}699=r8Oeyw0&e~{87XZbI@Qd~RO_FothOu*pm zXAI)5BrZlYu_vMZ1&4IZ@U^Len1wWPX+dqC;y*yT4Adv$<5-kNAV2cf`-<7k-IR)`5c3?xKQRBx{2?xA6pWOK=l4D z-rDb3C4{DUxWyJ!o=<&#Al1!^lH19;mTbsMwbYr`t_{0rb4c0sxwMxV@t-f;E=O+{ zx>}o%PLgo9hsgr>nkl+5GMU>vUtnJ(5&!;_4UzE8T%b&H9pjZUnihvQTQ-QJqscw1 zr1%aOza?jFog{N|p3!S`9%<}7XEz_`bDMyQE2YA)hOTU0;dy%YD_Nye^UN8GxlPzeTu;{Da)7Y#T^Sp51G^;9CqTlE3QP1(7ayItpnW-^;4VG!W$;R*67$3Mi=!+{<^ zft6`#f&ci=^{&EgVPnjthAQapZn*%&93=?(bXC!|iet~o{~ZN0bq908Z(D(2kt9N- z+&n%#aGHpX3_`-mHx;RXkM5RzJ;@I8T)Mhp{)rZlNj&%$ubCcpe>?tLA;ir5U`TDk zqvXbe8V*TmAJbOAR+}Dh9qplI3n7r2kGZwy^@9I8G^aj{l(EA{2X|_}`Zql&{&>Xj zivP3#7Fr&2o?aa&j`^ume*)Y*Q2OT|9_!%_s|4DtZm%Qa%!Pa3#6#BnnZRyILW?Xc z7w-26U?kuW`C!20%Us#otnGY?J-Fi!R%Jk%^a*G&(K5kYu48w1wiWdJ6riFjn=b#B z*;~9_PTcI-Km8_VSV?*ozl)0++b=ee~F+=}_o?yK(t+u2Lj#%4EfdxHxI^O`7{`hNnYaQn&* zAVYucx*~cv=I;FYoeCLfqu9!Weg0jlkfx<=slzhA(7WNR{ljnJ*Tm|paIk&TMcmax z(5z17vqlaXR2WVnwdOb(81SuCmWbilHtzlj2qt82mIS~K)g|UgEAHFS2Ok&0hjwAf z-32qrX-;IFn2GG^+`}7&Tp^?v?`zD}HN%K`&3?M0XwKu)z%b{v-T&~Z=8PM<`e&a- z<$K$diwA}3h z9-4(qqh7o!?16f<*G8-wyS`tle$&FQ91U(6o)$sV#3ND}wEVjZ-#WcvY{VmYqT7Xm zVesKea8kggo{Ww69TR2ycnOgkl+alCV9UGX>S*Q^D$b9wN8Jmo*wQ(FKB#>qcw;#~ zSTqWj?$2NUp&sXFw@(j!Uw_N$bWd=0MhVPZegs(< zunuzP)Hq~RbB7Aoa$6g+ON(vBNFc-ghCsG30jYVO^FKDBiA-J1`GXb&VjHw`0MIA2}bP4Ud}TAhGHpyd(w!1_N7G=0jcfRNFYkqWw;_2y_6Zpfb9~Ucksqx%?|6; z#ihckX(XAIE2L^c4a?p2%spE-9*v)z?+0!d*TVjktGbbXzS=R%I%5q39E=7kKzuX9 zjI;NAs@V442;F1B2eQK*VlsD}!&u5LXp33vc9Zkv#L{%uzhV#F!04mx^_d`de6hZh ztoM2U=a=4p3|NO`k%Rorm(xyagopVFkgnLf!d*f2B$~(n^tn?Dw>? z!y$9vBwntPzQv0&OJeGx3yE#*3V~^tnL6y!RWXmaliSKiX%htRk-RJ z>)Z*wr9@~-ZHpE^8EbtLOcF}pu~)v#ZD+AErF+}v%h{7D5S9XLRL&U^iVYwO19e?W zr%dUepQ3vgr<1X(|7%WR&BQd>g7hJ4g^UYod`H+*=OfQX?l`0E+Zx6_IZQ#`*}w!4 zR5jyr;{kKqLm1)z|11|QeX;7f>bjqb;eRPHUIwesYY@4 zYx2O;Tvl)eH8aN5qVf&T0$+@^%OcqO-fr}@f+-lfe{dgcE@rP=j{8y`w8I(IO8eLF zF9Z^*Agd?@Y%m-vdK!WxzR5=1kFH(E$%X zfqQcws`(?zBaN#84GXt<{`T!R{(S5r5%g9iZF!Swr~iAw0>Ad!%f#AlZ+%5)3@dKd z9CBTP@Z7x>z75?e`F68^D7Ik1J?~tUq!;kq^{A_RrxPA(ym*3g9+}azcYBgdXaAzIGv4Pef~Z({mqpM!-1F?9E0-hax0il_WT&Vs?dYNL0-F?}Z7sbr zW;seC3C9zJ4MlE>MQ1+v%J-7ZyvY~PJw}+aBt_A`O*5T-C{CV-tOnpr&DY>p(%CLZ zGd9}_z6k1GS<;VlBcgls1fX!0;_>pLIL5$R54;PZuDhekwS;Yj#lNyd6tcbEM(fRv z>-!6ArpAz|xPv!b>iasYh5GVP*m=qX2toeoIE$q|^mf7_Y#nQ=L7s5+kZOAbVwiHv zhkg!h!IdyNhwLYC-6z{O`$p(mqJL6UIKAo6JPNG@q|3E>gu(m&82j!(D&zKVkx?>= zkeMdgdpkvxT`41bX0KypuVh7Klud-n-g~cP@9h{No9uPY`@IjU=Y4+f=#Ty=2lsVf z<8!Ug6<9G9k6Is{sJg-@7MpYKNE=jX2S*8@b!Wdde9(`$v*@o%3Yab<6}$Vnh=`c@ zQ1e&&P}MqA=Ou6D6sQicQIl*%?mZy0e~<#amwh(4+0f@LxW1es=Jz~ZD03(b14Nl) zb_D)tAItn-yj}Aq(I)3Zg~)?0pchT^aboKl1PetX+;?Y(yE5=7mKRTxuRkAUAR{WI zy9>>=>j2```>EPl8RGwjF^EqQ;v~WAdI0EOP#&%Yh9tDvc9)?cPDtD=HjO2EU?^(a zA~0h*KE|H+`&Xbn079%%7Ern5R88w#9ch9kfr@YWnVaK$Ch6-}u%QcL7p|FU`&1VQ z&o4bg>yGhEjJLph3vf|@3%VNu=2anF>2A#OobxvNkI`rAOsTD6n zhy3QL2>U21@+S6e@uXX?HMGr>t^-OB2slH0^cO@;Q40jaL;TujuhF6g8)fKR!}u!f zP{GqPYrm9upiO)^cS2uYwih6O>uk~(FuQmX*(QBr;0{C9eSCSW>Q#ac8H(eiB+&gy zpC*OK*tc2K_`4%Xc9fz>HJ>2t;2Osb5<1jIJKtS$8ZiANaiHDJ^#32^&fp*XfK|8+ zM^@eLlHpbVPPI14XmFC2K`hwq7;XUfn3vaTS2*Dj=VY^5N#WQtomV)!|1zM z+qo`9vbjE+di3#Z?VB~{H?#1IrZ+$S#tAv}Qtlw=yJ2RILn3bZh=q2qL4WXaBvf=d z*&ST?A{9z3QYUvt2B|3KY4g1veXv>b-ik$R)r3e`;7Z2Jbvs9Ah10bOuFVq93cQ3) zvz!v5wwxpCzj@hlLIx4{br}!3VVuBhu>U~1WM{|l>dIg|x_pn0qZ~|(zuKX!lGvJ& zTWu5R;c6}NET0#L9_J!&I+;~%Nv}<4!?OUYM5B!fSDy(S)tutpKu7rdf}n`T?5gR> zYuTH3k(FK2Ny3UJ=hGpx-w-HX{$!?17tJhxH&3F7(Te80xd(UXRACIo86_MvL&8rv zL2z{4x)ztNIkwUMwUx~Osei-WvP*Cc*srjFezKcgP}`d!l2 zP=1bVa`CwUD0BB4-l%_2S=t?Dx(ugrXBJr6^?lF3+x38pTQ$Z(IFWv@l;<+I>&%dP zJ;-38up^qq&_b*6MY)MrcO<$VaMj_#bwt}p)lj5e{g18WWb1U5XeatuEz3_si6rq2 zLj3#W&L_vAW9}h+sDN_0h%ntZg(x!!Wu5*I6TO*!32t~R(QX2E?mx9iD0!oYnna*i zG>A#IO~X5@g%Y>avEf83{!A zx2&@f0ogi-36DeF*Wmf%k>R^+k`5{4+}j=+ro4~3{IUzKEMX|bxy!h--6f?iGNs)a z7qNa|hz?-v)S#1}=x#=bN|)!_kRb+m2Ye4&S^usmgZc%Z5;O6d?-AkkUfN}Aw^qgY z8{5c~tGdR>|D$60hg2OLIBlpifc?hcHb_Qje{@=X-BI69UP>of75SaQ+F-7F zdIo+Negqm6%Qo99PN77ixxX7cn8M~}{4>0p(3iq51-lsujPRs3PgNhGj98Vb=INO* zl~RYvzolSB-Rl^Y*NN7 zlU-3Mq}32wl`{ZvDrW0kszcAu-@?2(X%ug;-I>^24?7NeFf?p&!Fwyz#zdbpHhO|4 z0seE;m>S$bh1m5#&FGZgy#`Z9jDlGg++X9;KOCr9ZbMjwAxgMEu~pW=s{sf2@iN5^ z4yvNfysjztqrKtjTwx0|+iA@#I}}hhJ-#CDzEadUYPjcw! zH!Prx3mAX2JmQ#R`SB#AJw3-`d@1okdAU2_&Smm#V>=Fjzre=K8!!@iVDMH>$W|XkpT9OFR|PpZ8o!hj+)=?N{;|;C}T6ZRvFM zQMB8dupyUb@uA+uHwQnGwQS(}yo2+?ilbLK7(~k*uH2$8s5#7E2Cc&mL@*rQf1n(_$JiV@K8PWQo6hO(PT_w%cr5$>(9Wfa*w7%@rZdrQXYpcYwIvT=pyL!^XYNFZN1oEmzj93YzvPD?bb@>L>EZ|~ z7K>tbvFoD8JsI?o``Lz1%~Mq4`8qCXu)_^l9Mz#^)$^lKE633ShS#KWc)Y&oyM0;Z z(~V2{LVX#|Sm^B=P%UtpBoBL3v}Gj^3*+N4$xyulkbNaMdAo9`Mz$(;pM&DCYdM)O zCr675eUdr*>L91PYgQEZxvuMyZRta!nCR1f6xcZwD&CE3V#~xC?$J!3PXi?bpUcPN zRTA6@mV5-jxFd`-z;(t5NdygHo-ma|Rd|XkN|(?jEzTDKDU6~hiGQk9ik*9!c;W$z z3yH3YtJ7*{*TODuB?5X=G(i>`qva%k^)CBvfxW3%lk6>0bfT`~Lv7D$Uc$HkF)dO= zbcEXKywSeT?5hgx#Un@fS@md&Mc2{K(ZZ}E@Aw?lY=r9l?S#I+iG5YGLWn*T1X4U1 z?fBB|5Z_#yb|3Rv>-oApb$>YFY@s@(W8=Y%!)#Nguv|kk}Dp3{Zc3RQ|nWNS{l704USXgX(Bokely~X{!22iq! z_ASaKYz9Yg&?Pg9vH9U;M0($MJ|3lxw=+R!01sun%<$ez`+ooFGm9+gJY~XsS)M^y zl-`Z;G9bdb0r)l#t?BTvzx^NwAUs&d3C67jM?)c|zyIFNfyR4Sv~>{1CaqP-zUCTO z1ub&_{P z`?pYM0=~3J#>FYeU(~F3a+YhB^5I1z104>0 z)?F_%0_SpsIRCjX1u^5J!#udB0l2)?q4L#n#fxW%AFPvnkwSD3fnq50)tBQflCQ(h zo;C=7!N8`5`#PZ}ZliC5GKY#{4&I<(I-ZJm?U+1&5zx4iMcGfrQ3JT7&}nF#msQ$3 z4Le(D#-o5@Mv^6m@?E{fpuopu+}s`+B15CX&2w|3MBj2;FG$uT5O?^MGxpph>a&RJ zmtl3~7h1gU-5)C-I-9uU2%WZI$4nkr3KryZUwhwRI>l*GSlo7Hd=wCYe1KdZH|Ani z8{P9vM6rNnYed05E%Iv%(Z@>Cit8@BOpe|;1*T)?%)HSJfamGs>&BCE=cVTOB~P6UM;>q~yo2==N0OUW3FhK-i` z*ENXh_}$(37eXO}r-U?H)Vx;3fwGdt_M21x55aCf1W{~e%tKiNyH{d>ULFWWDO zkc!JJ1hrq(T!kR3UsX3*6TS7fuj5pkn80=%d>1z;S#pEG3VxdobgV-RfNrmKU%pvO zv30(2E2Q@EYO?td6nsT_u+JgAQ&tzlqNaPW{R8C|Emd?K^iK+;WRF5`(eI0=HE~6& zK`sp{Jcxhkn!0mq#7o2hLjFR7r4&wy@Zv8Gg}%8x@`pzOflOHrnI*rd%C2z%5SK%7 ztZQgxfAePYkg@jbQISwwX70%)x>v-s*&A5s#R*8^B2VlBJ?TSSP`tLXlux47zI|>k zvefk3ZyPh+#q4X^aw+#G#J2`CZ7mDyBD}DhTJlmwL{({GAN6!FnMTFlT7rY zDR$5|)2`ioSfFOYk>mV1-_|oFdU3XKsG0}4W9>d;?yN%j-J?N#O-$ZkhZU-_;kCvO zxC78PdBHI*H4a8eAyY&pU$ParQ6EL1oBepFvtMaZvY& zwbPXs^IqIE?pBcmJA(QUsA6<1oboNU!V(X4Tl}}Qt(Sc!5E6dJt5GccHk1FIP3^s zr3PGqu1o>`ap=@K91GoH{DK$faGdlUm--`YCPjugZf6=t4Ikc#G>E)M&y4vYf?H*D zNp?j>o2``1QqcNzgHYXhoqRc}?ellghUQKZ5G=hc?^8AMmQ|!P15!=H7qNq@yh4Dq zxDcn19^G3c=Dt1T2;d-LYUa6!I6#3D zbMxfYll<7Q)MH-&0#wj5xOSGiM}5E3#;}XqWT?+AMVQQ}HL`^$wTSRroo`hX&0~xby8T{_KS%OqCm(*aXMo9s32`k!)#@Q_ zky3N8zf)zrf3`jH*1(rG0Yi*!|4Q?!NHAD7By~I3KenBLfP82J6U?o(jk>)nsZz{6 zL&?nAi@aLu37SuC>`_(&R36sUM5ldfu&o~>l71IDaq{nR6ElDlPoA#?x^Lbjc6rF}>CF2g)`sq52{6U^yDN*^~IDDD8_)%wVlvg0srCAK4gsj&& zM2WjcqeCFY{CgVwG+d8iC|o}Fstm9E#1ZX8GjK#b*vHiyxEi9J%M=DNO9y`r7DD$f z$%@zFmhdQ9OOrba+DTL}<;-HIyvd<>8G{vt?{cjVCs2YFC~5E0tSeqkIM&payMbdC zxlhA^=iKEqDqnpZ`5Qq%GUu`LY&+O(nHFH!cEK)N%vJJFs&Pl;pzHi0!~b5r@NXPP zu&`5Mao?m3IL{ZcxG_{?8(whv3fC{YpUHwen%0TfajESS!F_oim7nVN-(%-E`8s4N zU-n_31oG@8iCk(+0A3toO>KrBeX85z;p2b7BS-bN>pUIO#4UKPtxuS7RSR8_vm zX*%=-3?AKf+3Z>>hTDu=uIv+EH)(AP;!|M;xWI3AI~<@wuIh+kqdeCq6&s@eCvLTJhhmFAs_U${p8;E}b6P>Tp3MmuY-7DaJ=7KG z<+@m1Ln9@Lvnbp4g!Mo)olJWho%=PR3A4@eJFnP)(=5e}wgt?Ve^$8J(H!{yF}(}+ zAg@JAm<48Y)P24yVn8#eDagB@oO;-vyt1mtX+igcgXGU}FBu+F=YV8jRuu(`Ums2Z zxmn257=^&f8LJ+B8*dPeo5)w{ht!8F`LkSV759?3;=3_dt<-$sN;lLb)3-;9i5N@4 zvd24*_t*?^zk*`lSZcp@Ysy))HXiS7Qv>jUJ!&YRIu4kkkAt{m<5F~&514}i*b$6^ zmUJDFP_j*ViMuf1(JiIBTZ;t0&xJG+t%}FdT-IwN74NElDv<;`v{iodtL`h}%Ipm~ zh`5Z2jIfaE__l)3HhPMuJ~4MDZpn{imC+17CBEIpqgYcKs2W<0_l8K0w@?ELiO51?IIc(BHJqKy3dn|Btak7Xdh?X z3KxK`FoD9)>uR1_qh7mlD4MUksUov#qltuLXsmVV#PmLH9XtwDSYZaGHdC*4jRO$N zgW4-hviaj%KIG-ex3;K+rkk?9N%gqmv*k0PZnNx52$0%rn+hA9fv#xoi>Iiq>84)< zKqbdNQ<{!G5BfF$E4U7l>I4`+-SXl0fnkkQsQ=YPlPP4Deo>ibu>1nkJ3eJgu%q#Q zeLBOm@H?22^Rk=GWUA^~5#0FE)X!HZK5u~ay@_YP?{!*bWUPInVLHsP{oE}*9s16A zDes21c1^wp#QO4~dT%cW*W|DECi3YPY(udB<~NNwfZ@c~`vTlKr4habXHkh?J=`U^ zLdi_~*jwVgU>)<1t{eM5zm7c@)hR+D?L@1>S{Vzylm!s^mr*C;zE%0fcPwXg%O zsM;W5RGHe$gn_SFCH4a_=ux%XP$yn~rV4C(Q1>Wmc$s3q4I#8diaD^2x-8ewBRw3= zZPN~JWFuXE#}*kLEe*1otb>t9cXO?c7X*j3gjFvPwHgoE?q|K+%cK{jw%z*G|NKde zI7v*vgI=bk(GSiWlKQ%>8x9xN_lJ>y$o57tm+g|>5DDOEhEXuyX95?Q=x0UL_1{+c zD$~&LjclL@>X(RRH&u99m})p~@%qN?PF#<=9zF5E*>^A#VhVdRDH{GOpFJzv`=h(W zs!l+|>_Pl|643jBqcyvs0B*tF33mJ=rdKaz08MSV^c@~+Ic*j8G! z78`g3-&HoLob%>MZ03aXoTd8$v+r^pv-q-hxV*RFJxijt;hv2pM>fDMt4bm zAtWfb@HKSi@1R!HYp`<5=R?)HsTUcEz?5GgMZLBfY)INJUxAHs)gxz$L{i?){F>34 z-=Um{TzpMIr@1&1hN`0oWlR_%A&b(a+5J8+m8IprHgp*C*4$6P84H=g_-58HrXy$U zL)Na-;oh#Z`-fF;70c)5LNS*1T6;k+O~b2pdt78eV=(f4R(zII`jGWeL;Qu0qZVXt zZpPcYxJKt4Kd*vcLBTcm{Skgbvu;+0BmE%?IXC&UAi)mq`efB%Ak83GR9O#fI)MIL z#8jVAj;BVaa4wdw6nSIJq2W?(L@2@!UvQSN*9h>Wo2g7o;C2uKI#@}q)PNspEh9Kp z$jk0QpP_xR_p^Ey#@8*7@xd3|=CIbsr;P$oYZZ0gRYLu;h;wa-E->!|UQ(Er@Y2p1 z(ViZ4uf?-JF=Sgo?9T#RUlnRv%CQB)=1h^inu67GIRy1>9Pg@1OF#VXTDEVp zwpx5lE%q*{<9Td#5`kiV!M}fN)a6+`&vu?1v;|3Op^e1*oQIqEdy9;D$Z^CHA*^fw>yq#XEa}=3gJpy`V{jJLMk*x>?|r=> zvY_oWeFufAS|AfULdbW+f zQI0%^umOR!TaqFm7hLnaRbQY;^sJnqRnR%glutFfmZFbfAQmouIi%9boSA6Q>fPV@ znUSJZ9?MrX4-akN>=-NWw!H|K$Z+NIgmHC!Unpk!Ie1g+2m1>@Jklsu`F5ccx_4&3 z3d*KRW{abkcWb0rzUwe^2aWW;A~s5;_Ya%Xbw^$uGw7h;uGwsSz6Z>f{tHol(2{q;7A>&uM zu@od;uAJj;%S0e3?E9@tSNtsBb2IxOGP;rV*xfbde7eAfTS`d{`W^0)c5?m#FZ=XL zEw1rCqhyI%i95Hl$U^H5a17M$g>KFt9?_=D+=iLD502|gHHmlfpIP-!pl@3bT#?D* z2;%8L#DN<*cHEV6M4k0|I}KV(sKReQn$^6E7`N+Yl5sb8>fwBI?sf9@F*)>+Fs?io zgjOUQ>t4vXg4}!H&EV~x;h9b5y9HR>p0&u3RT!Pi{R8=tL!;FnZk~I?tN3M$tJfn& zIJ6RUI@T%LF1H+7DOA#Y7*lbn$``i8bJ((u{X#hoPn+f2fAdjj*; z5Ogl~214!TPX;DN-xxmMTXzHshKR4)dEuxBOXtaIMt!1HsamS|O=Y}%-F-cE&&^}j zu5#mXrCab3ZLdG<%4&zITX2qvkydy!wUz!sQGOu<;JfhNVe@d*-Dz*?v+DQ=DcYP) zE^Cv*NJq0z{B`+aKNnX*)C|dfYv3E2zN-7&3X(*+la+vXUK`(R$lJjeEM<1k!xy~(6X|`nZQKTnce;Rd_h;n z?u`<%H07Qyhw%@SDkPXeWE+kSwrQ_sJ8tdOJ8#cZjrjb!2F{<=KVRtl)lYh1?&I0i zsf&_6eSRg|iOyTgMFw$IuI(S`d1Vn=A7eQy7eCT|xAM#+PQyX5t^GZ{OJ zN3F&&Oh)#)$V~<6$Kb=Fp zzPW|OD4jou&P~*k_zk>&G(~&5ZT<7cpl?+o&)xT_up&cPEw$drU6XJry)~Y>8}d29k}fd{HxDY zcXWiN;Y1JYMKgKSNe;{0qhYuAN=N+>*0d4sF}oQZw-1m8}#Y@>WH(=+H4W`)^kl4310i0_&X4g$C2taM_TaXM$kCqN}3RBefL}WaY?-RcaJ-y1JVe zHtxo$J6)~Ael6xl+bNmUfE@)>P`7_bun?uI0XBz^?hK9fWM@Y`1{O+2+aeh#6^Aw5 z#&&_{xva-@vSgsXa~u+Cyp_obKLaq)}sJ9s`yeketT$RrwE5~;<@&d3>CnT%@s2N3_dsF2z}B8s03;vz9h?4i%gtI3m^g>{ZV{{m#2j@_TEI|XH`SQH1Eq?; zeGp2A42W`kHZ$LmA;1^Dllm<^=A-EEf`%Bq#?@($(m4k+wk0snJNn3)7IBalY1(#J z4BEphG)0a*4Q310-U7S3&k#%F`+N1N%CkPrF>2Vt?t7vjhVDD}ds+817{kwRr-cg9 z4V1FpawKW&+iTsSb{dwDo%Ihz{XUnWQ$GcjsKW$<$l7+w3738Zg&9!~d$tV*{f(WD z=-4Sou&1S-YsL_&vZ7U_5|@3@9-H|b3ufT zoX;1o)zS>-HeQLm!>x)*t!iGa9 z$giqttAsrc19c~#IlxMj_;nXB0e^eHwAb+^6UP_0yK|4yx^w|1YwC|b37=3>fF1yb z{z|k%FP=44Z&9^ELlzut@6k+y(6HD^r-_~IEq3jzY9GB;s2~b4)c~fXY{vG=SF~(L z2Gc&plEWC=pR2*7$MM*QzS(GQ+DADu)JT^6RwY;rFVcAe-S3p-06&(@`}%aeslrwN zn1|>~nhDRj2aU(#254KWzP6_~UsLlvT@F{#-rBvS8?HDVA5^<7cbv_`!O@}=aOAMV zQp}HVy}R--dY`H4sxPC*6|lB`yo7c!BPLZaV5f*P4^9Tv>N`CMZd+>X*}tT(_o|&G zM{~aY!U1Q3PnU#sUEd+)$#vPQ5f!BN79N1W3%XTye?UhF^NnmsQ~W=|IuYA@ekg+0 zY*8AZmz7l3fZc2gSkm=Y0wY(y!OM~oQd za9580O2C2kYbNT;ELt`vUb+PVW&&LStoPdgLh{$DJMYqQ*mToeiv`ZWN4_ zbg>lqkMSBpQxz0vcx1>DeQ$79aZ5szJ)=E#mizwpdiMX5sWE6h<;giw8d(JuQrYuQ zCQ5>N-O_$E;yZL%`)dEQ6)M=NzfNE|%wF1c9of_v_`=ig9?Sx}Bm>7DW&cD_@hiU^SBDDu2K!uJW93V7AVlC6_T zivq_ZJ;-+m_)3j+7IzJW+4&&;VW?u3FCIkpVxnESNlnnQpiy7gAjz9j(n7?s#Yzte zEL1+Ums;<>wXB5C8qNXH$%yhJyo*0(*E{UBn>bFn#_%5?23|lrE&t(}px5jd1RUFJ zb;HHhzy0oZTHu*H{`4WCA+uN7ltImJG<#{q^2ZeyzD6{e}?(vg{bMC@?FOM4dUA4e~Fc5DT0T4ZSPuDm; zG{Iiz+RN*KIbVVdMc#^S?b}g++Wg{3#JuO@H`q<%c53$ahh@ZzRtK}q39hy_bBXW4 z{Xf|Y(3F%AH@sX|^K|{8CWZn<+B1Luy0pFgYluNH?b9t;F~9y_Lx+rq*{*WFBJN=7 zDdJ*^j+mbj1x?HGq;N->|9$O6uEE>;qN4w$Ip9DEP#sOrMZSo8*?;ypAm0LAwbs$3 z1%KDDe)DpD9YhXoTtm%7Fh{0?5$c!6M$-5lZfaa=*V?)xz=v+U=X~|hvu!$lgOQeB;)F;Q zIH-}T$bN*4u3&RU#~YpL|4EJLAchZBt0T#wt11uxKwI0t6DP8G_V+HIvgtVb!dARP;#)dxvoqCA|0SY%5f{V^5Ew71;SWPPSPtOFv0!Fae5X7Jj3n<%=hD4P1{` z*rA2J{7f1+kprEggsT6g-d!6_$5JztmlCWBlz4IUkuJv@2bv%_**gb}i9pZLY_b1g zbP$m0dI6G&8$_81Z5$o+Fd{Uc_=n9Dw5OS;B%b|mXQiI~f+tA;P(bObJ;?Q&HPDR%F=O?@AOjy_x$1$N5g-3))Tx}QA}1h!D_NvCUtXYl zLi?V67p0j_E*23wdUy`RdvN*sZIXukJmmS--OnK#do)|3%U#3je*Y zS90m^^_W02t66YIqi0%8m-iM}?GV66Bd>b)^I(?gm5S#-S8YBpxCwaSHq51eIbDw! z(w^SsqbCbqJ(>sX=L63pXxu+!CqnC>Gw%vkozG25*(@sjw->v{0krG>nE|UX0w6a4 zAkjmFr%3xG_WhOODF|f`j&628baOvYOz=bi&`^*^FT(KQ88@hgaj=Us%NyKNaI zssE1%ZsRD)j@b^o?Dd-SW=>n$M32q_wuf3K6GzT z2MKAPsIPNeUKBPsnF!V%Bjh^9z+et>AP%^GZTm=E6*x%Ju9}b6TYaF>9SF&yKknJS zEGFwo!+CnnK(m#o8&Q@>298;yM_vETYsBz4sKD58kQWpHj?cF>V(0Ro?tMZ4Gw|i( zXa5^Ve{_uN`rvMnTZr^^*v4EW(9{UNw-u9ZpiKl~Zk7qOA zb_y5WM_H5f$$P_?l5SZ0kY0UX zhJ1?g_s?BQ9F}WgnoS(hk_!#}A>YHF1WZvry;Sl<`g&%i3ebu1GwSjxX7| zBk>r<>aWh2%#eBS=6j~(u!$;|i__YUy8$9=5Wj^s|JTZkn~_W@r1dm)VQuPd&-t{E9sT$ zJS7DJEDblA2Hu5Khd(CkTm=%!_rZByq8Hc=2}ovtFM;lt@5VtY;Tcvbb^4pv2ZBTD zFFzrxOK8A;I`?II3kWFI>C0_TrX>AT`gIJ!4jNc^`sQlc4J!ju+Xr^;u@_2E3lbst z4c07-;2Rill%;5ShAS?!j*ue^p0k&s+HV12YCSwd$*{7|rGgm1{VTFxI6!2u3ZvR& z&k39L<41AS$k_(GI0lq2i4FAm+>sR!xb?wj2=%1;y9S6Z2G80bNY6(a_=Zq zY2KHyZf4E?n*D_QJoQ24z?=49)P;yT5-r%cro5bm2J`xE_Z95))o-ZZjr8789<{=2 zrIW}7t85A1S3m1&hqW?q=VgCTr%x_{4^*1l+U$$WhB~k(j}V5Py=S0Xk`lH+?S^1# zteZMx`zXZ}CDTT$+z-8rPS=jzE$n!NHI-M0s)|hJJIsWy%RN~wliPYXfv|6!W6Gx& zRnhio6`d1~hFLwBDyc zcg5x4J=t94FSjp$jPa*5BL;@PmC?Q(tGQPE3|V<4i~AOn1i{X5+Dva~tf{or#1953 zUe;cO!nwPq-=>?__tz!n@r!tG3T?69u~=jAkidPSusstP8VPLhl9CbYg;Hz$SfDCH<>WZT4}T(0e0G1h(F?l1J$ZM-?lmp>mW8rPv6F2!C7v} zd;=+}$Nd$@7s(3ym7;&;a~H*KbaA;e@YWwwxuz^_To0b~(s&%x7t;EF^a`>*(gvO{ zH*Au_AQ=f5vyTpS(8K}>F~#Rv3J+RxtvvX01KtqkRje1$UC2a9SjF5|M|5`i!T)ZG zcm+q7lY06-Du$|&7n^b=vyBdik&#;0?0tl6@qBcG!;jtR ziWB83D9mPpW2NmEY7BH&-39moX1RhPvtGUUnv#7IwpYL0BrTaqbJL&cGc&n2Sx-H3 z)TkL!x$yixbA?CZWFSMobZZK5OOV}ECOjb?hzn`GtayG( z)9UkPq*~S!(yi(4yH+JHkG}#~mQ6Ab{5&sW~WnAY1MfPlg|V5vso%Q$T>EckfBYL_Jjs*mRP1z#7}R1K&#=? zq2EKw7X*B<(tc2rJ}KsuwwK`bp|0h{R({xQwk_auM<~_(LVDC5?5wdlA_H=5z}iTg z3ZD8jmD4;Hg2gCk6&C<)|MO=P+neltkf!(KlduUK4T0qMYhF3(&eGQ>v8OYp0)qu} z47Z*tU}eUf{P&4dPZu~SN%BS^*COXLkX;E4`%$5-$TdU7cinIG-j=$U+PN=9jxW5; zaxn=7ew}W?xH??%BxIb&z@X_5tg)8RbPvV>F>hJo0*-Mi?$H|!5a*;rvc<^2FZ2_4 zoLx}ORe-1D8JWZ3(_BTOts4=@z8S(8?Ci>}iR#TVGeaV#JapI-N?{6z3yq5k3Lpss zhhM7rx>d5CQ@?VvEFnexiUAgge3fuqY!LP$RWcc|ZwiPU4c{rc!T_wU!FnKGx~+d+ zS=+$nr$pTr?i&-juV|TB`-Htw7dl^B6H65)I)AYLM_d>fRuuVu{qsB&tP<7)cc3_T zQTY+$!*S-)m6Ff`UHvZ#qrg1jZqL>-pD>LS-730NQosm3F0i2dx!#?M50m$eZY+|}t_*(F2fB61?2+NX91&rWLKW`2 zW~?llmCQ=+GFDX&p<4{-py(j0%-e~$J+4-`p)5&R&3z>zJ>FUb`i?>aVIfz)w8nK* zdcpZS@mCViZY*70T-wXyl8Wpv@Y;`xJ^*_Uf#AaI=O(P`Z$lbWyPy&0q$lz6Oj_;;|aml>PYIRKi#e((oP z0NVYc6khpIKQ_YU(^=%fKpb zn#$|xo~(?;)^$b5>qqmmADzD%-;gOo2FP000E);$lH5G*%**AYji(ibwEJq0esN3Qx%L!-s~hv%0H7dJfT z*WiqyY`_wKez7Y9cvuq{Ac8b5hI*An_IOwz$2ds8? zA(brpAhE3P6sSR=0t2Hnan*I^A^9aR)cqmr`=Y|uL~b#Q``)%ryG|eyVQ;DkJZ&T% z3z=R@_!Le^qMF+T!F7V-^CJDF)2XLu>W1z^l6PG|*DSIsm!e0d=Yr2chHX8{p>eJ@ zp}~;1f~;3#CPd?rB7mk~>&x@p%{we)zSbbxPyW5vuB^UWZ!P? zd2V;rDg=7&sIuNg{a&t%eTJp1(cPKD^wrz%^| zi|Mnz(syeS<4!hKr7^n)8>6l~CbbZ>)SscGv?jzYZCw3pzeVo&Bf`>{Qy==I+}V z+L*d+X!^2*J6Qo7VAujYe}vxPR0_(lbKiyjCf7hnZUP*E8h%^_Bfw~}b?Xcla=W8C zk8pteSLE{UVFu8K)icbH^EcVuAajs?gmyf^^V0Mblr(xJum|R_D48Op0yhz?C_L8>SUUwlSp-M}L-JCeT$a2Mb1k5tZf*DlwIQ_Kc(>oXYI&HWW$ ztOj(XmG*bgh~g>%#q+2tmywt62A_qhxtXIqk-Cg@hzveQ1fCA?UjW$VY&_kbPE{|> zxQ)+zxrrzF0uF8?3SZm!o5t#d{*DYf)k_*Oog5-v8VxRb+fKAEQM%}6*E??asqmB2 zCF~CY(@{^z;8y#WF<7md$k3`7Uf~&Tt-EiRSa~u1=5^r9Y>7c?Bh5NCUVtdoC+iOZ zkQdjR%=yQOIYL?IU(sPmHzr6h`#L}K0gor3^@!2WR6%MsfDzjo(zwJ4C6ni~%_?c7>>Nu8$0J*YamZV(Hh z*V&~_CP7F_OTFR{Fv0#SB@b5J&TCWHRk^j{iXkPs()W&`t6m8?HKVKYVN~B+ng7DB zP#EohF7pCbG&+RUlHYgXIWv;KAG63XnE*i7#fgBl9a+n*CPbW(&Pw14)+vxXehp_Z zu6~E?vUJ}@*M^D2Arp#+{`sw65gRDA72IUBEBQ<=xN($46&vG5bl-TcnXo993BpqV zkbbKwbl+$3*rthbt4OG%V~Q-9yB!|)Yc+Jqv2|yocY7KwBYennyARfPs^g^(1C_pjWn)l6%URG3XMfO3!Hx> zr3)Nb4rO_1BJx^L0VD&>mw{0620{{?;Nck-QsdAr?6_?6H#VNneeA5Y{}3PR=lPti z1rcx5q)_1pXKH-jvi2e7p34Kw@XR(FmyJ(c-dXNBHH!^)bj2X3vc>^h2B;sr6@d6# ztY7XIXsoEGo@h(uKZ6{&;Girt##%%&I~5oIbiXzu z)6d+ydj*FD({+mQ{GSZ+{)<#CHJ!|kMkswZ5ZM`hA|j8Wv882<-l)&LdJc5BEXXl`?APxXP6`szR^FL0-49>h1A#J- zuKtp3B^;p1Sxb`+tx9u7?~3h_xUkmR=QciJFM)Gan-%IWT~>$e_5=*%2D3b)=slai zIbgj&W+(>^! z?cnlw)~@cLk^V)Ns1I(bIe?w@L>!(4p|4R(j zW(IlsLR$RFs(N515fa{H0qN=wP#-(CRb=`DTDR)f*@(=&kke8JNWQxLm;ju86yd)4 zZT;$p>!E7+Hgkd}S)c*OG7OJ`AeV^N8g>hmKtK7!?ji?*Ab^&raj5S*(jE?8`!PTb znW&Dh)M2c%^bEH}nZ5@8t?X9O@XWE+$wew265D+rg(*W24Vz~M)QQyTXP&6~7Gp-# zxg7jX@%mA3Bgc5o>&Ml`TF7`K(X~lp92VWnzc{QfEt?#dCLPQkQws7O1w2bO|9+aP z{*@d$3wZP?%l`|xsrsqml4)`)3IAUW7nFn;ceUT*vRG6&bxb_|_z@N7<}j)RscA~7 zXm9r(3fbUa!$&7vu@a@&E5pNlqPYMNV_^LH5QOVn43GWCYb&wIqNXy$`w*NZeWH1l z){w!99=WmyEV-@qcQu!- zwM18@3sSi`U({HN+B&UmRSED^^ugXbo2ahhE-mJiz4a!m+W)#)!Uk$*$9WgPc~>zo z40a!6QEE_7pBOAU{nP8vDmNdT&EM*0b(vE~%tBe=Ah8(auz9=JC^~xnoGf zd79lGzI-QH9Hs7~tScr~KQfy$xEo*(hB`y~9Zcr3-T?J{kgzz;A*eQH@W8Gp<7U~A zp&?{u0M3=(-(^?EScdzaJ+6D)l$yqTXk{WbU^GOUUzxU2;?p$st0E95z{CN5Ts5g= zkg>JjzwDZ5{sqFikh1%`6a1rdk|3Fy`C3)2%K}LbD!$HWvZrinteYyqSpODhp{xip zw}&rlR5C@NYKUs}N0^P#z6MHo#n=&trBts7RMr#~yjlv)>C~;;K=SFfyM28QhiI&7 zPnK}!`qTetCe#j}!Pu-Zvf|%5%jI0EE@Kaz|Gm4Byr~|1nalmD$K|Zgz0|H#i<0F6 zB<5v5@5PSrhNJWCFsS$#aU3{_jaJSWt?WsmYn3;pP+?@P*Ab5_%*D4(s+8SvX`&my zbyVYZu_vyzh}>vx=1B&Db{d~irF4NZgRcXtFH2hHG5{MqlIbRCVowfyj4GR ziwCpoCu!-P7leL5tYsOrWe*g(&3F@#j4pOPBU*52Nt`}HKwWP3!bt6jnbfCr6TOFnW6@LLL?U{N(dcv^8*;; zb3dG3+6Wi?tJR;T;*-q2eBb)&8wiI?n1Z{jQqH%hW2XDSG6b?Z5Ikd^3n?G1xAILND}!7&N*DaVTM?F-FKS>qF8+8zg32n-r(# z*yz1u69idkMIYPSy*Qd_PY=75;tW!WqhbhyJXKcjX*`T7&u3$fEmI5wm6K!hl+Mi- z!@x*4Eg`4ff{#2usd$s0t9W#@QAEh2Z{4yvtGi&TCUepgNzXc}aj5PkqM@FbtA25- zh|*@H}k8 z47FG~JlsCER@pT)?=FUG1h<8HGH7S2AkTj9(jAiWGFbrZW zWBXn2_sqyS_x$N?f&)4(fdpvb;BVs9SviL$ULPk;-bxFMN zz!^Ml1io2`JZ@_PX@lNZZi{;wegU`=OhkTpcUQ%I)w!54)GW(D(@IK%`UPxtlxigB zSF5@F!aR0u_i{07=uiu>{;B40;hqtG)x#`0KedEC!jVtt_t(^ z!fw?CMHpM@67I@FO~1oTz3UnG&+wdS>5F7zC{^j~J`IC18`L2k-OKt1^yT9?ms^yE zEYy0o|LJUTf%+jr@l%-B#P1bS5o1gx`%EE#A!40q{we|j!9csX>B8X;f^K^3E5g1XR9Um>_n+(j zUm_TH?&kd#Y?-s&bT6MQz~LxiT;ZjZxLgh~r$csCVreCQGAU&;ucke2gOv9VXcW+V z25U1Z*El5|tnAF`i6u$YNEoQi*=tup9<@G1OnYt_E)>;l!Icf=^GSoVdqRo+tU<~e zU8GM+d9&XvWuQU}V=EUpC&(dKwnKAtXOvYmEyLZ5b%>Wt0KcrN0?I*$S9%w?dhhv5 z?U8w8yN7m!J4`*E1bbiVB)BxW1Yf^Xf05DddZpjAV1Q5S&dctZF)T|V^;Fp>7V!ZX z#V&7IGxu9XA67*o+1rva4>gUb)fYhYn@;tOze0d%pxZBBDo1)Rk;aj3=BS`i7l27H zWkZuT0I=?F&oEKb^kZ6F%pWN-g|x-GD}y_~JXor2jVBmE@e+ z5mTM!n7dkHzn9bpQeSN&!Q(9%V5t^eN}~8d5;63%%<~leW4Jr9lJ}Qz7E!y!_y1UKjxPe5ZB&0cc7qYV5OVw(puiSgV4l5H)YO^X=ugHb$W$5~M4r z3YSfqobtJatSIvF9xwi>MT=R8Zy)(A=dwE8H|Itd$;4+NzU)40K_fFBpEVWs0k`c# z1uv*N?0w?fXkc%reJkI(U|qj_^;g!Nls@Rl)tB#!Mx=FH#7yJJMQtGVS8t=)UT)FS z&o`mQ@0rFEigu0k&_#oY`Zu+^OgF*AnU6udmyC<_X(}m*mVFdp`d?EmBy<3`Ob5Nx zFjfI14M6k}hH5`MFkFqWx?s6l-z(bUI~7`;HZo4oQiAa{nLIUtQHbyYJ!vGL z>)_vaNx^3Jsr=9dg7I9C0zTu&g;=&x_s82cb(8gEcugH!huQ{km+nKA85-8KkRwG1 z9z_1JU=rg>A&WxwnbZ@2B^oTJ9IF-aWgKNUYXy2_a z)?7<0MMHD%$J^WD<+fYe%RgxZXCSPiahq&o#UuL;XiS-W&bSLr8Cu`=T-=K%wVDH7@!*^inQfUQ%Sa&%7-E z0XL2b&E5ZTmflX|IfUd>DmTR0Z5$y0k@kWQuGgRO&PL?p2HW%aXYMfyvrGl-;PDs8 zCuW|@1z8UC*YohWFLRA1<&%ePRk{(~M_MJ!&GhqXEuQbi#jTOojk@3nH~h^gGxJs@ zeZ8lF9BeHFjoBPM@4*HCK)_hh$>*yjM=MH_QcqNGpzs#y)sfF6R*PZrUi?KO=k@!$ zD>Ywsvz6I?*m4VmE3+k5n0f$E_DioX^>EfF%Xleu*e6Tz3(}~e`?{u22;nbcR_Yo% z#$|tyciztK8nS>B1hM`7!D87}rAiOf-hB=Hoz}XdOy<=G?lhdJVwtoXl{+E0x-7i& za~Ys0<`nqz4Z$od`9vWgvB~kC%HuduG#HP(g*FBFSq^B5GsuX*F9v*mT_6U{vlJ47 zs-gHJ%Att~4<;eI^Z71GIWKyrPTjW%+`dgO&vJRL%^ew51Y^^gdWDwQ`Ki)_=05CL zZF^Cm!q}ilFqRB-UQy^NF{)^oX*5`PJM)} zQK~DBIzuywmtwF}J1v8RVQmU54BK>wFM|{U@C*y@1^z8D*~EX*0+Ax20Cenq1fx*R z0c`3zr$u)f2|hSbt_e$Z$tQk&I^BjvJ3pFUKu8z%M@Xox_oqSnL|6iZv(*O4QQtoa zA<|Izla~A+OfJsmpOO8M^2pG7FcgA8vQHq6-Aam}KXGulmp8Y#@c2%FAwVI;8RT&v z^E$+j5X0$3hlPpXw9@@UW26Qfs%?o`F&{Jt<3E}Ipx~E0RF#!iBRqw+AX%rTL|%C{ znaKrpgoUK#s;Yp@tAG$PGSyHTEi-NbojAi!i=`g{-}z3_Bb&PG`NkOpM&)*&mH-em z`F)=7b|J?X;#b39Rf_pFDE({-FT|}v% zEp!c+5-J*->hejBueAYMKYZQg{LBMS{weYqr@#+q4*5J&1@9I&JIgm`fo{c2!yfu~ z1-b1?C#ew2!gjNa@$4a;ypk<@|LAUN9@Ob91nr?8u6cFgX^Z7{io8H~R#2#mG=>=9 zW=-A7qdX4%96+J0X&+;ml$0oJjgneFO^f-RWYYELnqv3!5FlhBI5nI!(aXh`efw0m zE(tU=lxx4at=R=)e7|`%2M_6$b~cRTL4?|7VG~8S1NS4l1|Z=C&;Sz}Gpl5aEV|Tu zFw!2QbLv}=FeyYVvBW0TCZFz7T*%0dF6MjxM}rq+0Lm6>8kNBlorXSRM5h_8oD9do zCoN6>Yh^`v{h=8o`SNuXlEREE)~qN2XkO0!{~ zm^?4IgDrH0^RoTlraYM-D&=v6sL?@A-Ix69op@)GQKiaL(FFreP=Zr432Q#FYl$$K zDXHwgFAR*w0|kT0kI%64;)cNlLk-!TIitr!I3Z{Z`5oLqggG$+_ekXxCQSYrLF(M< z^R2&}I5^1x;2{lISFjmu5CMr$>c7au{;wDY(!?(x!TXf4GO918+_n7JO0j_S2C|== z6F=+IuCmF1{_q#0ipYZhyK;bB18Of66mS4Dc&RfM;*sMpYNDN-$O8`1ce~d_F8Iun zj)5)pW2^Waa0N%`Bia(Wf1S9ldIXR@R#{0G+CvqLHO;`u@rt_=hSU|U)?u0x(xTVi zPbyP+?G)zsx|7;X7ZWvhCD>oYuE=BXssj{=2BXYywQ=yb!vUA|Pk=&GFuF5G;8@i> zz?g(kEEuHdv)}vr54=BI)T=9MHwm#Oo9Evc{f48V-%I=c{?EA=R#*UeqG2ILfguRU z+sESAm0$kKZ0I$KWT@aiH=kE7Gk-?(cjdGheq#hKBBj>4rttAfs`a?ZS5BEgs=Y|e zIXb$ck!3xpCWe~A>NI2IjWoEM10PQO?7ELvS3{sF?5=gVMo*|$sFr{1#iQ=(APV@1bkP$7W0c9+(Yi|*plWIS`d$xD?Q zx;wweRS7q&5~&jFKWR?B9-s$lnqLEgo)5OA0!XR_)`)FV0#os*uU+<#)CXvPO{_|9 zbfL+gJnE_n{zNT3kO4z{rg2wphsm!eWC*lJEImX|c6Ha^pf!qgbbWi7bU#4%3}OPY zuV3q@OBk(nMEVy^cSA%GsI7DIE_Z)wi4B$jJ}DlyyG$kPLI#WTP?x7EahZx zx?yy*@ogIW)i)M?s(ztE zx3fi!&*jLdIT8cahozNUvB|MABB_ZgqUqMs`#F4@95YKS4Rp;dTS6fG^~99@pTnbz z!a%A-Uk-)Tw5*s-LeBpYp|5{xxJsJdM$eitxi6Li*#OL?pAQt8n;rM^CnD-_Vc~rJ zSK;XoNcrjL%5f7{3!oeaNFmB*0w;^(3OKf|lqvD%POhM3kHCA{T%b&(f*8eHk2yv0J<=5=oe0_wxI!D?E}32JA!OhCeUj!%WuZ@fM`vmZ7%2 zrd)Oaae?H=Gjogd_~$;&8HU7_IB3t{b#Fm`}Yk<`Fy@^ zr7w;7v!thb1zvb2qDyxuIro@kw>4nBK>P3S5&TiGu0aHV0^Y^2%ozR*~*xv7o#o zkdEN>Tl2r~*QN)TykwJ*Um_Nn6%GiI zXO>v;7_qx=0Mltaom-|HyFB3WWFxXsc{j`%==Ph4Xe|Odk|XFVJce#TJ@>IeuFiB=eg)WAm;}0C_EL7tdvJ&APvl zFCOMUVF9E-`XM^i5>j$BL3;T0D@qS~juP3)y;20_gHy|-%hP1?r8K_P^PJquGH858 z;l}ROo4`r8zT8T^l25#v{@Z`1O5t2)bd7iF+`Rz?t1Mxwr-Let(!;t5*{xyI-tUM- znh=PEK+{5R8#WDwv&O#Jo_VL8 z4Nz4x^m;D1Lb;XCl+sV^x@hg2I|Q)PY__dy6Td3cTEkF8Ed|Pd^E1AZ+)fW~*2Py6 z!E;Id`$Dt{&BAw7V8R$upkH?)0Lfz#>hgBg%#aN3@n@fS$UT#=K!8@8g)c6Aa0>eB zzYs45Mjeik^k*;w5;~Lz&a+@f1VQ&fy9Zs8{sO}>_wBr=oAlYGmLc`4T`!fOdq|}} z7|v;OpAd9hMpB2m$GK(X390Y(;qQHnCA@Rtw)#14ebb4Wf+eR$m;e8Z~EAfn8So_RUKZdpPsY-IxT9CRf?0|^cm^N?ry z{oQ0GFasZ%V6bvX%gk57GG$}sv+r-+zAxUquFOTd_^A>tV8N2sCq=dr#{zq@OoPip zshx9Nr|x`ian~9Bv{xMv*geq{F+RGlUxxI?DUi{fFC3?ZNFod*p0-0JRP?Lx^l`Hy zqXAoqYD~^WHksPEdzC3bJO+~-^TJU!Xo2qEa26~f-Ty6@s???SH&8O9pAB6m zbEvQa;1F!Cc$~I-*;nFJ8wHq7-mdg+snv8o^vbjC_J}*4PnDoqrZ;UMVhf$%py^xt z5bLf4aC#6BnCh68Iar1^D?pKBjUDE{=I5bpMH}ZoPqO1*@VU(5opXOi{mAdCRozF^ z8hnw~{>*LCew5sY)?g(aAF>S5R-(`!&{B$#?I?t$R1q5+hGqs&I_aju)fHOa9J{n~ zmvO>SgwEF%!wzvH`yV>FlO66B6^}zJQXsm4UZH1+ErxE_m$}KNXg*lk4SgM!T9n0K zm;wMW{+NVh0ULj%036}eof(liRUqS_Z7u!h_Rj$zRaW3{OO1iW3hY22FLqE>BU3QF z`l3n|g*>`WYR61*>*P&-9!n!GQzRX77#zofB3Qh8HmG?v-x%O9Xflvi)u|&c`?rm? z+=sfq>RMgFQ{S(GkS0Vz{j%H1{F>pmB(NZ|emQ8ZFKrMUWW=y+zwL~N{Shz{F9Q8~ zvv}UUORnqY7|f%%5Te_#v!>}X{Yo3aRUpica%t}lH-z+7=ibCZ39`9WY$kpJTjgz> zK{5fw^`nU)XP)!iT}Dt=PMrR|xcB1}fe>PXHbGX;#uOFn(4=tJXD=5k zL5*JN-v$I<1BJ6b8|w}F4G*voa+~^Nb@M(8MB3diU`)QVk*k($N+U*W6FgYt1NbM2e7>P7fTCl zx>_UmJqdSBWT2Meyi;0Sj_JzDfpv1yOnJHt8GQ?^V8a^xd!A`80xS(p$erXoSw^oEF+HDcot{$^hMQ1g+|a6y-$! z*DA>{YLtH94Rc#k8vjjQL@b!HK<w{BJxAr@;(pBfz|!)QZNA2fXA=*M&db56 zV57Xy(cJ)tHV0g+`u|6#9Z>i$9hc^CS8x=MJL&GV&s?kLdC!=(;hs>|ZP+b}#gRQX z9X;)x-0Ts6x*sc6(>YH^cS(B2fr{}H8eG~>WPi=zNGE4la{_~alZZw3LRpY~^u0xs zJ@9?bQVf!l;}XHF8eHU0f#UOlEem0Aa|ZqcAtW`tH)a`88F%u{*!v>^kTe7c`ys>& zCM-$ODPPO+G0x+~*NQ|8{ltFRU{^O*Oq9S8rtWr{xaSp7wcX7O9+;uatsR%hgR$ln zcF-3)>?CVlkS{4RAuz(7m6t$KM}u96eI_2i&(_amJnukRi9%-l?b=QT%3+n)*v50=gTUyg#F7Txi^9D zwg0w4a}OGnTJ2>JAkTKdW#x*7>EBC>J1l+9jVn(7TyS%l;z#BVJR0PUKXWUes+GY(Tq$|6T}W(A|&#Qx^h_6adi< zECjCAfn_ZWSdX#cWp7XEB94Pvh@epsv^WDVw)@*7 zjy;#M7U0RVCOg!o-J&Iytb<>3BBL3Q2Idn z%@xc`o8kmP(JB6#lN9yDLx<1 z?1X|{BR0X*@_e8qFO7klM?IWP78U<6v3RFM87HEgx?@!>v=@$r%JHr* zZB5ej{KZ4@cM0_LYmr#)R%ECcgI4GVkui>;h0x^k{5eq zy?Z{+hxr7~N9LC4s8CgLL)i(EetdGIM}7*2V}JRb3C;a^ld>M^ek4(bF?PjV2Q$}F zF{a_xodGROZ%liM1_AsjHmr>7*>6zad8FRTj&-?8TJ^KdG<0jgjVa8<&!m6;diY@u zv2GNC)aLpR+2S_Voo;NsJAzZ;<()CO!E>ifme4E)b{03CT)6;%yh5*u)Y{N?vo_Xq zua7|6TQntgZQ`8nMt2QS!h*>ysNs-RchqX0`Fwiuh%Z>Ezr5?ac19IO)?l>ni=`{u zRXJ(odR9d~Z+Ho!Xdfm^9}Iv{$)Tg0lNYo`5|&+>(^RT&tfQgn^#0KvuV+1lBSObm zl%&oT=5EQKJsl1Y)8T3MH?cNSEZR6(G{c$3+Lu*Ao!q*#I(uC+{-FtA=Mof~ry9?L z9tQ91;Biq@=Gu^2Z{0pOa4{z$B*bL>Js%qclqbo~zwRdr6pc8K4XF&&>S<>rs^G}` z_ZxMOh9NZo8whz1d^rB>bk67^(|5&bFLm5f$&4Ys3+$~|SrGE5I~EV7x#hl`njzm5 zYN7v=0O6g>$sHa>pa}eH!}$+O{*42f`z!4}v<(M=VAQ32BR$0OKy?MBGnC_XSPHGk zGha}){#60*-Os-vxnrAwLkhtkzz{a!;3%^(gbwPUjF6cj9lIqZCsCMt(WwVoF4~A@ zQK4+LYlK~7+gC_1 zhwJN`DSi(VWKK~^-5BvR%u!IJbT^{9g39y@$^%Y%EkS2%Gr1J2;s~omsU7K|n89l) zI8ylQkTn;MKc`D~qde~Fw?~ULPdhj?Hf%Ben^Vny3G#~Jy5*YWxtN%>EFbo6w%ZW( ze!u0i&q<~QkU&{@rDYC=rP9%@&t1QwaIdut`-H=D!m0v7#=IOXTx|#IB5%a*hl?}Z zIJcNK)HC|Z4@cy`0OGjCSF>Gie{oDXa!|=6m0gOs%g!gXKUK7MQX-!n2p`Cek zPH+Kb01i)UZhDry!ddx#nP`>|4V$dDz{JD#c2fgs!~+D@kBqmU@rbWM&+ye%>mmf9 zf*Uu>UMAa2qfx$a`v;eK&5C|ClPi1ldy<*Dx<@q`dVO>4cVVn#?V#Z|8?4C*>_u3}<(l7<6J4?s6O>bQX^*#p35d$(c}xW*^Y}V~{M`D}A3d*c{fk^h4LOO+b>dM{+5I-Hgu`q7tZD146^g zo2g#O-QrCsl(C&)#a6D?zbHG4;P2jb{R^mp#LCr>$nr;8$nt^L=~>xkE-3zF#BIMo zgnQgFnkKI>$h)`PHB%fbhm$R3xnKwC_Gq5&?XDuQn@zKqdb88-%+c$s1;YeFC=Jr2*wDmbCDE6o@TNE>1w`eBLQ9YX7O=)9_U*BHDnugz_VZ_8#fSx1z*!e z8)Z&*mNsj<`1aPP$BB}3vB38|073i_cNMHaQHRKIu)Gv#Fix~?%C93c@IW%DS&Qd;ov?Io;*92?Qblyw*(N$TCg_Q z$hFr0@&q~hl^+UNj&afC7ov8{F?Skw4<$Isc@{XhGyRPm4Xj*kbwrCeXk!s6{1n3u zAStx~TEzC3QgWv*jm0`aL++*{eh9g42(0Dqp}5@qKL`9*nK^kmgnjV@U?n}&Ij^76 ztnsSe(d&+{?KAh(?ZJf&1a}MJVQVHjx;H7!iV4q4#3^zucmvLOO|lX^7o6@w!0VHS zYk?@vcs@LU7U7A9mz7Ihoxki-Jkrn(LL8@yY7Dt0_1*L3jpe6GR85hl62~r6n|kk= zSOX*J$-Ei;Uw~)G=4!V10|6zRX;hM%Y3iR50FMc~kv5K$;UL#A-(upgEO=$?{@1l+ zj2z}r-qU-7M*@5*ctW(fnn&;uKLdxvgI&?fpN;452ZAtz&X^ zsk0*NYXcYW2jQ+$vCL1J)&Ub*F52>xR@l~VFJlx!w)#!jE(iX z93@K{pLr>LxEh>fOG9gMip8Pz3TY@^{%Nj{b8$${0pzw$xeO!F=yi*w^Jbs;Y3lY^ z@%3ZHpQF~kiP*7TlQSzHkjZCe)4;YOKH7PdKZs3DGZP2$r;fM_N^a;+=+mjN5FQc< zoU_<-y^ZV3$6Jlm9|TzPZ+(~64jgdy*pa{vIi66OrSkUxW5a0~ImtAyGefuY-97+` zqbfxD0AasrrOdfss0h$nH{2C8x^NM|SSJ>y^r^oC(xE(XC%nq`@#n?&GDgXb{}u}L z7phx278NV_aobWlVKjoP@eo^2S=3|`PySoTLjc--1iD#oKIck2k~I8nNZo^2Bu{JC zDcH2Q?Sy~tkC#VNgUov*CH0`qg5d><+@JU^9U0{}*o^{mcLSGl9F$V$1^82}t)o|} zC3Aw|$!?R%Hg&4@Zjac&!OZtDj;8LDuKIT7r~u15N(1m@2@ROS2V*PcW&*%{efwZC0%^E>khNKiLI zKPNyTKxVX#?S?XWRQJ!d4ITORFmqr{;93ek_Yj*#qko6qoAI*1x!&Y;xz+V06x?=M zK=LTog#nh0X1-$hf3^FNxVd3SL$;$H+fyfH+6c%VVAp1qKBiy&8tzsl_*z!tHLLiF zwHuy^r6fb24^YIrLWYl){4l47!9loD0qbLH57v_==_5hIPp?)d)^6<%m@FjJ{d~r` z{#L6TRLfIYw=ORNM?RyvgXMmU{Hte=q`qt*NkE{;j?GXBulNd%`U6IF(3@lxa);K} zf(j{GrVS1n{2b?O21!DUHdy90eTqY=NnX-#)IkITkl3apDxIVnGc+pGEKXku`ZYoQ zb#1OZ@GjuKX<7F{8_!&qApbMQiQC~#Q^2GIMv*@qJ67i-(+`du^aD_Oq1M;i*%Ir6*+9)Zv}&8t!pK&a?jjBt;F{N)XMJAjRtsW)l%pVO zq%DPtu7bmteBY|z1YLUSsIW1ohp|g8R9bVgecGa4lWWa0#^CLLGGE+gO!oYB<0_tJ zAE5%Yu9|X;duyg#>_uf@KhF|_nD)&$a2Kr)cysSPKBWQKK* zvE+Syo+5sl#r={*X?XpFI69QNZ<8fh4}<5 z^-c05O$@Q`${w3l&URY2fY%xT;Itdue7_41v&ioys)fVmUv21iO_KtD#g1Odx*;X^ zkpYr#L1zq1jY9WHusLZU=3HyEQ!K=F8adTGGiuNR$-%v~=J4-`1Ek0g^U14R*_*7& zU>7uBczN?v*}Ie{8>7Y_A5ZGY!BTsd7{9C?J^Q)}LJkTBI!g)ZE=RKEN;>urth-iv zk2!V2oiU)7mPXJ8gL$yz2BxGStIHomAZBagstCSmm1vJ;py8U-4RkO#2)C9odX`6} zqX>V;mb>?doE+&g39aF2hUv<^c!n50>7~#8jRNih;&satB5Vs9%U|?%q^hVOp8it} zIoY5p!$PLpt|E7VH!5{@$*usn2T<+hGUdZ(F0J$+xOvmQUgEAQ8Vv>ABI9R#L4v{E zDppM-Rf7(`-ebE-*QrH!)Xm=FWo4+rI8=yI8Ka917PELou+SN*lwc)Y4s`TC^9VGV z6r{H+?u3l;h>ORWTFbi>;bL^i0r>3cbZiDjW~R2!ZLzm!(QIiJ6h8kwW6MR4*_Uko z5Wwwqh*|5KUBR_U$QE><5H?}@qv1dO)Xm`4=F_D94vIQE9Mj7?H9FhTm40hc^+OBa z!0Q6T_P3`AXIgxcR|pl|Ma${?%+*z3F)|pVTP|Ba5&YdL5BNulsOTscD(u z?UyN3)ceGql9b-Co4)HA3&|L`o2AhWqM)F(W@cQQw z{O?otVBgsH6S26`9_QHu8yW##IihheNs8#PX5*rmdOMY^_aaW~YVfCpTWiO?=J&v| z6G}jS@vf}D^mXu|g++zsBNT+-vDN>ie1Nn_*84epc?roHI_%R;gChFvaB@loSjK}w z=-mJNGy~54-_s0jm3v>W`}AC&IYJsN&-3+?=1@M@5NHS2l<&~|U2D%>Y=`NoNDz)C z_mLiTe2-2mDze93vam83n2 zJ2IQnQC)vqbC#j(%r8BcN@5h$M-8e}$%25G5$NLge4;i3OpUD4-d7w(eEed*;(tEp z5`{IRt`11XL^;y*hp}aTk3;jc z^IHeKd*0~f=|CVa;*c?MuQnVn{O7!IV=FKJpmhE%cz@^IXqqkM8)d%RClMUW#LIRc zLOD-?4Sn&NoV~>k98@Vc1xU5Mv8{(#;E4`!3#4St&Awt2hX)Dq z-D#7=(h@vs4r??3c+Bx7rKTFlFW9;(cP&nc1S8(L71gA1Snr}v_ptU8DDW*ly&t?F zg7zcLDIS|#=Hi=5nfw9lbs>J7vL)CNU+nZ&*kyG%CogSrd>b)AFQYw17t7 zx;|_iL0L=ss#TQJkTuGENRIdG^Frj^cgLaKo}s$?)b9Vmi|sxMu0=-u$vSOocVq}s z$Q1_n1~^!Nj9+P#w@i?_-}(;|wXa7vH2eR}L`{79t;(Ep!-FG$*f1NY;aNSDvzX|% zoXzrAZ+)67Ejj5cE(v?#o@vvvHJnyMNAbWP4+;Q)qMmSZ4s$C>hQ$MbG#b654K+@0 zE1T8Gvrl#k{|-m+64ULzbZ#Sl{8DAT%U-i9Xq>u!WZ^ydGd>v|*}q4#x0x;Q!j+XL z-4qiP+D!CySG0tzfA2CA_;DBg6V#wy_5Rg*3|`v)+S?^RC9yuLaoQE{#E~k8%VU4} zDE{m`D1LWnjpLLlN|K`&g}tRH`_YKOeepYJnaSH~yH0xENdWE%8!n{~o3(oxzw4d# z-FH6FQWdg?(oB^{1@%g=HB<(A@_!yR)nQNWm6$#f00jng_ZvUI!%Pb?K}N{03mr#4S_5?fG;<;9aP>86v0vg`>JCl&$*#XRrHjTw4p+(b zm_sfAjA2!H-*~=~skfjBbyQi~p)0|Y`B7oFlSaq6wMrMU-lVUEU{xMgod<{}-v#LF zQx082`vmXpzoR2@?_xnM-!Qspih+yuLEa2dtPN-p;mSLL7FhnA^P4Ge`)Jub#lYyb zH&JQ7#llpO+)&?-p*B0}KI4gYrKut_=PxyNW0rHZ{?^>QAJO=OMdmAvoqn(t*dJ}` z9dW0DOJ#CRvq$keY38Y;XQ&!GC8rtxJA_LSt`8=q)*i$1dGKX2UxTea)k)bP>yJG+ zEtr4-rm~cF>V6dm`+s6M(8r;8^X|n9#!mFa6}wn;#V=^*Rf4Q!)b42MM$pQ$_w;x$ z9mx1IdU=3o2z?joumU2qd#}?TUZfs!6N3T-c*!^9_$Ide!ZSP>?7vBziGfXMXzp-V z73qm+@HrCHoM()$p+>@h{1z{rv?U-!VK)Ktuciw4fGJ}@lULABjjADd05 zja%c0<{!CPwTV0H`l1LJl>51Z9#X;syNArs!lTB{)mE~FDz$?l$>N3=bz4p$1S_+< z(Qv$exgx3F{nzO zP4B+z4mA#WC1pYdcz!?&`)-U06>5iKl$!k4pa3bafxrrr`D)(|ir3{IsUuUs1_29w z9#~68?XYw%LBQpi3dIFJu*UXk=7qQ3vx9%*fh0;Iiu0sv5k$9eKNq*T6jQcZVK1|(7>QY5` zWsCr#0DOu{W}S(k`jy`{3jk>3_&mY2-p`qT=5E@&wn+7a4WUgj0K9(PhjCLy) zzZUkVFMy2jKj9bG8MX^Q*aLkAyUv;4@+>}p)<*rO zxKbQ44bGnIl%e!b=Jr*57y-^Niywc6^m3?2F{%i87TYgCi#Z#**1cjY1UkALBBM1= zS^pv+)_zSC+Q4=NG!&a+J3E4$yVi3-QfigA`~{D7EVBvFgN7dEtN#oyY>a=ej7XyA za8h2|kr>XZ+0qwPoHAiGLi9~;KpKxPODKPTL=6=u64ZwLIMClLtxggv84-0pStEqJE&Iz z$`M99!%iol3Iq*PcZl3&j+=~U9<4Xe{2pKv`Pi6*r@)4A>yU`D=TU0B?UMJ2rO-Z< zQZBse%#8Zt-H3mO+qQPskCI%VPoNI`#T!{%&rU&{FyyNs0`F@5IH|%+di{UyHr+QL zvkqFAElurm)FBsd0o-qqepl}5l1(yTkAC!N2j@sERCQy3FdHZgH%62#beT7=B`80n zX{t8KYW0xL+tmXFW=xGg1! z#l?EIV0DA`eHZj?t>0F*=Cf%OCe-k*E*V3SK!X5)*V}kT^zyUbL!LG}CG|nAxNv0^ zfMX8pYEE%VkaS)qGo_}Rv%qtW60B>#aztht`#eZ}3 z8@SY;7;1B$%z*Tqs#&uPug%UHG-9$Cbj`M3b8PiV9vDHlObreYO@Oca1`P|~)a<>C z{RdoRk+2yIBrb%_alaJ;?Iuv6mv470K}koQUiPtAa8{=QgQCr6%h-Arp7)P|iP$1~ z?NaCv_&Qb@b|0V5E3#bcJh#Sn=!s=4G**E{uz*R=@!~`8o*=QkvXb{vm(CU*kOw$6 zWpIHK6cip|O=nAs<<@3FFL1D_=s}yGpn4;zk`Z81dBcB9Xkmx6Oyxr?L`DC5%iaAC z=F8;G%_DBb7Le2qvFVh|x(s>;xZ5ZwKzRz~SpLAl$@0@cP<#Lrg?oi|qw{*lJQz4r zEHwt_uG3zrcqtEFNoe~zD+tyKz*orp0;;w9oEJI+pb5{Pw=7=K%DH!uySqch6-g07zPW|xUa63Z zm5|m2wMMq!a0uHZA854;ihiP1hgZC+j*|m6R5C2R{CbkSzY}Jcf@b(?cj2tR z-Z)Ss;-8nhA{O(}Zt>c>7`<81M2z^Q(;2ncQHELT$OB&@mOocz%$J=!{j_R-QJR0Q+Bmt1T-2W| zS1#Ksu^ziVx_IeJF@Js&X|+Ucg1mKE!0y?J^o#~egDR|3dd&o#J1S$;iB!CQcqqoR zezp|)G%vvl9G~Y7B5)d!2DicV;wn4zf2#u*(mmtZWft3o#CM||9QExH)nZO@7}ID? zdz;|sf=F%CFN+RN2ETaPokI&pQV_20({di3?H1lgVX%DE^V(FkK$kIwNa%HNoW}pu z_LL*vS(zb}If0&+e|Fb%Ig{K5#F!E}kH8w7EQ zT&D&|dD|g;@ao9lh}#7K!bM1!;$Nh5IobwBU)MJ@NE8-ET4CL;x#Ij-i-6~XOw6N6 z+lr&E9)ZzrD9)sG`wTx}yEMLsk~+4QJ7!j_UkKS~vsr%nMyetq2a@H^Hs$VdJ!#Z% zbTo~5tDC@YqM!qcVJ%a$cdM{)p7@K~^gbBG!V06G2vqgUMY~s5+S#I&E8?y~pCaWs z(8Io!G(G1oI8kogeIvj(!%dA%qAH`4;$B%F7!M$d3!7>rAI;|t}i-sTCwg5M_ZKM8-)Nm zFXhFRig>?^laaVbxBH$+&PDasFkCr*BHh|sG#{}#(&!EBkw<_-5?5K{TM3l0Y8&|i z(pEZW?D~|x{*`Xvd&#?!DSr6+PM*U&MJV=ytc6u4ZDW*(Tc;%?!vRS9VpV*Qg1y|U zp5?)xbLLMk2dhPLE0RV${Dj#@Vzh;IB6PnMKhmj38YY9U$bO|%2r2>Id~ zBRH6{U=Xjd54&v=42Yzc~dN6$` z_~e0e(2m@WxGMF$JXVXZ{X&l5zT?kn@wai~4Ec%1ZQMso9x{5oOiW*D4728uo{VNw z0Vf~p+4sF7OfDX4E~L?twfs!Z$$45An=j{Pa%gS5x6ER?s#vrvtjO2!%8Y-saOx%W zHDK;bC)q#CsO_9>+u$NLH;4O5`ulETdWOL#Lb}I!>u=lcK#mRiq>F29W54X)*t?sl zs2VD1^>#L#EImb94C%>=ux4JV{pnBMADCOgc0{C(rF4B4u3e*lLCZdM=0~#?7cebi z%Nf{LcClsFJ1nZc(y`+5!f-?0E*-=2bIAFXw2FX|PlneoXl50y108uN4|#TCYyRwI zHYS5W-*l1E_Q2vEDXldT*F8yT5+o27)dMm-DWV?Cs}oYrJzt25%k^wW)aStCx<|hG zS`iE^-xi^V7aWGb2QVB#H^o&wiqu;0@gT>w&)VrDt_o*;BONFb%0yqvEk@_Y2l#{Q z9}@|Kw z!l{MyTq+#c71a7~P#I!+g5y2Rd5hND`)11$upjahCJh%zQ<757bHmzznx5=I6g>b& zM4@w%h3v#IR&K|yk<5tM-yTn)4g&cdJTl_oowLY*=yMTEZTVeCVmfV$5?c9Krvm~2 z@(14=<*qiu!MUC1;4Yc{VIIu49Fl6B^{=$HRP&c+dnz6SZk#g>j4bLpTq|)?Tr#&0 zIIbTkfTQ`8o)Mg1gP#~hC?6GOg|aNb4+ z9#@s`u<2ZLV(a=^q)lo!tK#Rfe8cYlJW7`kq*t<8% zreS`CU>aK&_tdV<|mjt#>_mWc2In z)CQLnZgAhq`Pd2C@@P^T>hSjpnRNp(xmp-7?0jw5@ZKdI?`KjP+gk}?wVE=3@cUR_ z%dB;?&HL7ux9m)ah0nYK&k;^cs}2L{tX8kZ7*DS-b|i~g7duY%F&pfh-Ga~Mu??^8I9N_H*^ze@XN*X<;J&QQ$y%U78-4fxvQvB z?@~`ve@4(A2p%&6HQ|HhPWksC8Juiynz`08IM)@lx3V!a@IJrat8erEdET+%xsaZY zXpW#ZKY>Ti)(Km#$1fnfxfFXn^A8lrmfET-vb#w<-EUO1z=6St^0$+Ne+s{5=+8DOx4x)#U&=(UopBeA{WA2q8Rjnx z2Fk5&(d%k3(dEg}9P-%LemBeCH}3motVSPO07)qB8%Y;G_V-(QxAkN7RZvcne zO3)c9k2zCnOl_V7HFC1YOEAZ*lZTvy7g(Oex-2=Ldad+3z(R4VY^#JHdR@gm%a|E=UzWhO#l6~U7)v&kb#SNa021b$`FqcH-~JFr}V{J zNGlyFL^>*3$Df_rOYNF8=SlV;(;u@ukI!lXk6aYjZ<|*e+N-34i0|4;h`jrW&{ZOW zQmwBjU4O;4ADTA2lHP+3$sG;GE$Hj0?*(nsqi%%&p7z?W+7n+RG;9{8zD4-BO?>Od zT@C>?o5`G5{yqD(dCdG`>H5$3iUr(sQ*~g>Vkd_Ri!yq$341ckV*w6_zBCljb;IwYGpDt>! zM}ZihzUDAKE-`C-^KcDVs9(@P5Z~bbL32uYUR)b52hHR%qwy~QFoWe=PxD|dUdIQB9Qsz`X!*)I?)^4PjVh}c??B(T0tA1D2Ov1i6>A&low_fy z^u6&Y-4TCh=u+mlL8T8&w_5p>V)?$C;@6$3`-Z|vX-*~gr6kfDFEt?$?2DDVpbqLl z``yP};G>j`6-?dW%=zIW=yT^!bcjujU3t3-qJ!_u4(J1XV&}4hIKi@}v0TP7O{a6STQbCdw(18~jzF zd=zQ&34D2fHS;mQ?y2EhnkYL!RIu2zp34e}71f+r68V^MCro1q>V7Ey#G!dGzL`dI zG{vddf!8DK%63kCYOlPkY8VgwoGLQA>HxWO^14rsn8gf!=p=N&`g;g0S~|b~dBP`H zv@8-|u}%o56eu}8_*Eg}IACS`D=_!V2N+=HYx#5-~LVPf?6x)MVPv?$4YhqK> z6D#L|dLCYPENL04%-PnZR@1rbdGqM67ptZo3tcF9jma9rG5|#=UBl_vG6(6EJ|?p4 z+?-BdA-aWhU@<}K!zaOXkDq^6O4DtVT&k&(?RSykkwaU2{z1A<{qJa9hAz>E2UrPC zHlD8497Ubj!)4LW|H_ zJvHrfkPjBzu32$i!*n||tI}6lMdAeRR$$u=p6fgS!G_evuab973f9z;k(LFku`64G zBQ+Eveb|>hdIaWQ?rzuA{B+qGD=C zCP6hkn_yNNmt$F&gg&WNS3=C0^@65*W7OgHWLKCBy%58$`02DQWX zUvmMrVQ4{*UlewQ^2R7deMB>yg&rX@;>PfnlzC>1q9*n^GNT7;jOo`yhiiD;+|E6` zjdmW5A9IRqPMV;(MNu%Z8!+r%a>As(w2io zw6!5KpmxG%l=c88&Ch&8UZl#sfcpre#o)ar-ryqvr|Qmo80M5g2C3#KtMeK#E_sy~ zu{8_L{0|g|2H@MgI1*5rJp20&SfQb<+5M3zQ}@E4{plOA$5W>cDzazo0Wd#Jg}Jd{ z_eY<*L1y3HMQTb|cVFqJLObBn%Flp~{OH(1g)r>YAvqT?bN0W#fdnZa{^{oNg&EdU z#4iU!X*Q21B3PB(iO&;DQu6e?Zq6(1GDfIOInfFGyKVNf0A1*+&5Un|)F{n`k+!L- z?;|>z?!sjKV_Rp=tj4wE6qJ?ITYF=^TEjf*c0crj0mamX;$d;9aI_YFgcm&9B|KaB z3Y>Q2mR-@JCS$yD)pVNOFK08pnI4C`Ij7hPxOtJ5@T zFBNXyx1+ppQVZlQTMJ32nVJ}j=0+J5Out#GY-po4UXGx66H@;!_?m6)Ed6?Y06Wa{D&i8*?eV{{ITl$~Y0k6A!lF1SogT?3B&PI)Tcz{`m5ugIV zFxZkUMpE2)sG|AAl*c~Ob}n(s`%5$nJs^Uf^zXeWsU1BP^v13yQieg|5l|>@k}6wx z9SJDktFw?Ycx1PWAL@*=s%9_<1?VwBni>K4#?_9v)TRCeNdvGYXIE3K-8SK= zj6UZzm#QhBuo~x>4*^e@Z9aUO6B6w~k`pk>IedrFX`Kk!^~`lu2$-DgO&X)Va`<0D zD}Nm}Uf$LLCl#0booNK-VJwB}T z(ggj*w3K&M=OkgCN6?OfB96Af9P3jub5^X zgj_mZ;|+^FoxaU-3l7|$;)@L#B|o`Bd({;3(fH3u17f<66B$$Up1&Cr2Aij{E^GCq zizibz**5klHWE}W^lJB;7vrNTxpURq2~sN+p5hkkSIeNg@8wX4v4E#hec+j~BN@|8 z$v^5dJ9qqdpWT0LHbdLCuR%lYINkT@>-J%W_Pk?OFXM}Y-=0ioo)AffTJ7mXH!=UC z^c0)eKgt&X%hfISO9Udf^wi|oJ8`N*3Hc8(oZj&NQTFEXP_KXgI4N2zr;QL&r<5fL z2{DzlP-r1Lh3sU{GKQQurKr$ir;sdT-_4L1l0C*g_HFEpVaCjSulEeqIiJt{yYJsW zXC6IHmagS>y_V}@-UQ4dxc8u#)a|IC64eOy3j2Yslkm)OL)O9+fNRh$l z#Q-dw4EE*0_^mt~2CiTSAY%k5^8A#}*brQz1NwhzY~5;&PW?jo`pmO~jH#+=gw?oX zGyoSBl8N3#A#W&h1B*d03a-u2)H}@KJW#VR;Co5o z9CoR#Xr9y1!9SnC?em=#+JjF39F)KZgd zg0p;F20u)ZcD)P-Y&x{+Ct(J1+@-_Q>1xPdTi8OT`zWQu7m9SH+MSk6Bc!VZVG+OY z3*^B|r@~h2l|D#KfpA*i8?_~-X(EVjR6t#;qr$5{wE3uty`)D za?@A+5b@m&C?#YPhcLZYxW@1RBD#3t|EMIGi*WauZwSgkVNdmf(#C9F;I2ble@S?0 zT!clD^LRf50hmy-=?}UPdX{;|tJEL;5Q~-k32(CIq*N9L>~}cz1C1 zJ#4@*=+c7#zF)2)^uNO($N%~gFw+e?nlV?wM(cV=;h{pUcP8=8CI1Tksog1TODDJK zRf`<@?}QEd_}vLGx&A5~2SVl$8yI*d@AsVl(NZU;lw*%EE;T-yB9?|C4e)ct@N!LF z->|y>&9eJeD~g@z{9b_nT;QLTDH=N$(@i&r{S{mQ>SXq-tfN3oEXc?M7P6{a1};sZ z3}FY;e=$=w+z8Yz6EIi?UJ=5gBv#zQ->W_BHF$+aSk1=Hirxcz_SiavGcmv3?--EK}JD}@cqm>0ajaX9s zTm;5s#xLjd0%572%03%^mqFW&aBqAz){!D!_ePXW1V>-^=;xtb&<2<$fl@CUn%@5Z zj4yx}U^hbN9A&~#WD=!qZs*NDwonxCK?HexGNReugtQus+>0%^`)}k5&KZTZm9$$uHx?M?AIY>fvmwzkj zu9|5xfL7a&S5L5T5|>W*Y1RQHREs*nVB(C7jwEtH{IkM3b}cj zET%x`Z`;c@x48pcyltk*3t`7RId?=o1Sp4pF2(FZ{y#8qtRsu3e)#Po8q87SX?6A+xtD^g{4Bb^7Z7zlo9( zHga6b;8;BHp#5Dy3|K>bCcTn-f%EaObG8j^424waH;nxNfJFHU(o@W_ajROwz2J7? zdma(%aavN|&-Lkmk6-cO^($|?j7@Z|$W35u8FpFb&&R^S6A~N-=^-MeY0;unt9z{6 zjTlFDLwW-u_d=(7GtUM|)MW?U?T&>UFzxAvQ3TJO6q|KaD(SpFP#6I3B0fLn+*&C)i< z*9srV@w)>b$o=fLOUt7p0KeTmZL9qSTdB3cm_4 zoR2mQsefhU8{eafGFJl@8&ER^i@xR}99{Fe8yz+KItbWbx?#U!&FpF_eV3#3KS50W zM{?BfXkGy@NKCh--mrNJ^2gtRKtTE&!UI7c0LMwMouTp#lzQy*(31NlKM;y*c)-j- zQ-C&LnH6CD4-(bQ{sU27wBfML@cm-wOwctMlQP!mQ0GSw)Y+Gz?+YX)mOG+dVL#d` z^q<-*u7o%eD+5GAHPA~B5U#n9O6`VKGf=PrAtw?*qptGk@YzW7#Ml`9^hJYiYSP&E ze8*9a$n#J2c?%{OR;!!+73d%3?ZY_o8{quced{-*%y)|=0l9-QKIR$=bUW!7yVC!T->}Eo@aU)N!)q`=!PC042h1ylFsVTOtM{nw$ z0NFDm{Yak+MF!KmG8^nUaASe9Cs=d!D(*C^+A!GvA+7{c<}O9V$d!fScZiRH^WCTu zmC{({X%Za||N8G{#72yAzP*dC5w1%bi179KB3e>!KMobuzbXJaeD1gEXv59^_1`X% z(1L&0pJ&#gWOwO9e_#p*CY2Y9P56FNM1S*yVRU@|{GHhjN%xS-#(=I~j4zf8l9Zb7 zL=?Gr*-Did7;(FehWM8CvyHS)rAyGfvpYQpQm@2E{F1y4#tSo&sZA0sr91FK6hf%I)9_5?w$>KkpCrj0eVem61kM=&9LwHc7(P-3r|nk zbjk%#fC7#KxhV? zQ~L8Mgt{HuzFE}{&Eg#`&u`5d!}z+m#*>_ffr0~&joYMoorIFi|DLFvZp%s?@1I94 zWbd^a5t%zM$o(#K zBMKdjEj+w`^HqOyXl8E*RPx7TdWWUyaikd-fousRTNM9}jQ{1$4IGYtUo3hzc&;}R zy@C~CgP3p2v=*-10M4|dC*6qN%Vq_fnZ4PT00Tyy?Vn`mn{L4O>t~ukZ*5|0d4jHE zhpomq;y1$O>yMrZ5Z?g^Zo~(G2A3q?&Oy!{^aA{U2q7Rix&YK`RtT_UTp+Bvq@|NP zzyEK!$tyB0$yFkI2|SZQ!_30Iiy^O+cR0^-NuAaFC*+u(V)%+eDaJ@LH{B=X{S8Fp z_-C-Wb(2CYlT$sb`rxd*-!8#jwebcsJ}hU>X>0yoi(S4;nQIb&95A4xEGF4wmiJij zI6Xl>33|M0F6iTTA)$rM6(87CyZKjQ*XohJcCllrT9IHJNM&Ru)T$Ug_ewDj!vl+* z76=-^+#zU)*z_~elS2D0&J@u_RQ1dev%!!6ps5=G7cIm`Rpa6_m+sLkqTlYK3%lM{ zh3RW^2L(QJZj(Es{Ac?9cQ+nv`X*&3|Dy_GR4y!6GSTq7FwmGM`A*AW0;=5a%HQr? zkk+N=!v9G6H@^|ky-*l<0bN^2@H8U5+ilD{@1gm!3qbDm}7U;FU}w&st8D^VSoK zVkidy0Wowuj+}U-IF>GQ>44Y}A2QvR4x2F?zX+Ln_y9ZWtT%>0bBz+|&Xpc7f_C}H z)+l#JUXB{@0@!?PMt0s}%=?W(Zo@N)UY@*vVO4uSR^+OG$XYh;U`%>Qf)@)hwJy%p zfYO^q_kaDp&9d<-Z*t8K32-4x2jL$A!lKSA)>Ls{X8O*PC$^Yz1fTRGL9zn2m7dct{;MzG@$?2a~by*kdGz`fFEt3FVr!ZXy zPC60=rVGVm8ULJ(E)>*j>8pLIYAOYp%jIe>ADcZA20IZ4^n(7g*Rt^l zLX)`rW!c|mp(;qect@T_Xetk%dpcwr^PhzeP#U8G-l8DhrF=%2Z1m#m`=epw7!@k6Rh7>gSlh0hkyXVIJG8T|*%=BK>Q@2VM)IAe&c z$<-c|t0UT2dR?F=lW#o$abR_@063aF5VtQft4Db)b`BT-!-?|!7|JR`$yI)3ytg+J zjH(_!eIohAP0fv=Y(Verz1DLx`pSRCU(j<=5fk9zp`&MY>JopiFx^p7gCaGiPuGe2 zMW+GHU%ea`?O1Qh40{mMEy}9ni=c3nopaj3>KLI*n|F9a!TbG_f_?hpfjzWv$iFyM z6bsqxR*Ej5|J>TK5Eg{#i4rLI#4w%t*|d}fG!uFRgJeg{q5f}NaqAx{+^?n*F9d_k z{r7gkW|wA&>UAJW^v z3_Gou&g&2$E4D6@-`1i*VD&;E1e}Aw?dkGph}}Q`+yi#5yq(LW48KxoLM>%!GjOqa zh+eOixUw-aH9{;JGy#Fvk(S8}nZYOzwvgQiG5W+B%W?#Rbx^(lysrqC)6p5%7_ zEU~PRM8q$_W4abrb~|!1drbkN$JC83^0C71yK8;I>8a1naQXC%TiC)9OtT#wdRUKtDjaMz0;3=~Ojt|?s3Q05 zvr*z_B`yExy#2}pw}|x^iW3r;ES6`gh*qX9sg!eC$6^o1thXTgX1Mg$I@KGIZa$fx zjQA&rA1x8+Q{=f`dR?zax#NeUiFp7%n{-A76?zQEsWIy-Db)Pq2ZZ8d%Y+ZVrhHI%V{M|m zmQM8Wjw`|^*YU}D_PVbCP6P`5HxP+9XFO9@nk*OAu=dDKNpAheVA*&i*Nh^XtFF;T z2_IwGkuHE~R36{n133RoeliehH5tGqv*lR<;Y2Cx$+2J)51x)*{}+}=vAzC+A2Ozr zE-m0=SBPKXL2Nk6^Nw+5@di0T1?klvwjC6udlODWEumcst1UexuuqGiAHnZ4ofJhu z4L;U6GxLSW6Jpi{hGb05>T%wE^QLZ**E-f>3!u=_h-%)4>l)pG^UW|Bk~7T zND7Uiln3vd_WDjA1-2FX%L>ma+Go(z*k+fwD`4kK)`}bz3~$=@8(1XB!j=l(7Czw6 zNk1b^_+)?DZTmZAEv=sTSe|o@^VPeOtM*}8MW(!!5DHkA6ydjSZ-G*ltl)NCRSZ|3 zWr_#wB-%{3$+akPW%o?eFxeptqoAOSuVUhY;VGk>FUs-B3k9kE&$`cG8*eNLrahR< zKgkmleBjHYRIWK88w1^m13h1)1_I+0a?0!%Rme3xo#u*Bb|$-pTJzmeH$!0KM6&EV zD7`qZ2w}>XIQ6H$KEPfKt(NrOj}@=H5r`~ifqm7{7x(E)^CB5myLnKe-9{VB1B85A z*is5fgLHTrk!CqPr{5bozoSX{)GCH{*e>Ma8IuxX?Etzr0V`~n9&w|Tg}e)soya%` zTxAaH_eIM)?dn&##W)=Ux8>;PIx z0Db03B*5XPP0X%j(g-a{nq$n{U794SRNCLZ)o_pqak<0_s6DkpKX#@gn^B1}x^ewQ zfbCu8zr8xUihI`vp!^^#ce`!c4?;vcj|%thA#mMQl-SBFoozo?z)$5J?I?7Oek;9W zI<5BTnWj8Jxf0JM=m&t4q zT%I|*g+p6mei$v=n(w^;?*4*{8L9jSkfi*`i(Gq;?rV&MEhajJ26Lhe{~`%F2EZ0# z9eN#i1HClCOi$k|-H76#XHO1piQKQp-~X9xzwSnyTO`#2va*d(3pLtnUE!uGy8bC# z+VC+Tq$!KY3Vbfvo&oncXgWVs6Ttnph*qdzwV*<7=m0!;3i60zf8(J)O|=1G?7`VfN0;Ys4M^odO%@|?fvfxB{x9|y*DNPH zlu@y~?9Ad-KqrUr*muUU{?QS$gCTJ)yCAe%dOs3b5qo%BrlzC&kEq2W-}5cXc}=j` z#-nyT;>)_#Qm$+Ch+^S*TY+a5h;g~QvC769(I!ov2cdcuinRl?jIx^H#YDUq`2esl z!0(z)tt~|YI*lRFRAkcW0N2d;?nm4;!^H<7?BlmM%G!ogRO$sw9yLh}j|VL~Ug20) zSR6)cuh{|JOaKe0%`KDHvuYA=*rU4y<7^+r+G+d##MZAV+YuLH*=YK&A9A z(vSL+068B%FsqPF%=-sIQnA@APrID`xNl!2h4KO6WHrBPxyCDLwETjtiCvk%r$j?# zAA{A*6*-d!CLPIN09ta=lJNAdBQ>{MYY@7?8la`b6kjO#sBd-K5tHK!`l8U)E$od& zd0=|he%v-~Utg$~JCLl1yeQO0ph&rIta2!!0e@ZFW=`5SMst?!&19@WO=u6$v<^BA zb2>3`;P%MEZ8bw^j{!cui1kKd!YwaD=Lx;J@fQ~+0w=SoYvtM;KhI&bHbS{VfzhN- z5jl=(AgF$%5kcZn;rLqQ?QC02@_jx@A(gnT8#4B{vsCg^b~7PqKlr`>ilWP#AkeTjrsZYcn?IMvz!$bw5tH6d{axIhlREsqT4D0ceEy!X%{yayq{);PvKA z8W-?DXqqs0yx!BnH``uYg@-^s$zf#p9_InKqG|Q~xKF&YE_KKb+E0Ur{07v8>lpEv zB~GPrqG!1r*wCygC@NR8>)Ry+4-vz)4Rg23@uC2P_zwf??0GljRI1~CY#+oFo%lux z0L{AjkJx@Wkf#yR_`u38Sk$=`TutBlUzS1#)`t;JJzzsA)oAao0VFIPr`V7{56b;? z=qpz6(TtYl_fEOue4m83ySEvK?RyyGYL4ltr<%Jm0TcSSp(e*OhS$d=pN$_VaaGNf z%t|>thobWtq%A_UyJ*i%EU)f)S%1ak+z*%VLJbFtW}=xDzydF_Hap~g^^cgl!-Fbd{Ih^Y z+Bww@MZSd+^f8~@ug-w6GHib#^ezQ|Ei%p$xB8v<5ly8Yk=(gnu3I6iqCIqpFj|p` zn`|^&2Z~H{W*oQMZP}V|O;3!2k47ym_=gC0Cx?Jtrk0NlW=8E{9cn z8>sUS5=rp+cJlHCC)o$(!~4F@G|`#%@D3t@nMv!K?}gz+SAB*PrVjeD=!n97Yoesz zA|zw$RZ*V%?TLt?tDSRQ?SE}e(eY98-^!+W(aPQRFI5jAft%oJgO%K!7JmQkVa9~$ z-)wKFU5%Hf&u@-4^CM7q9ZSq=50^}*ggnQc^&*2_V_s={7&ND-clFVWWV8t(9Sh$v zHO%B%Q4G7@C4TBSLe4kj*tDv9cORp@#Q;ta=2tym{i7KSEQ3H(nJFt0(l1{T4N7yF z-*8$GHze2s+m<>_%b*sn$-7}N8V}ap~wDmTtbU2;?H;Ah8dEg#V41ze9;CkLUap%`0NyrnJ26+6oKY+0EGA`3%s%b9YOK`keK&>I7@krz%h zzY=h?{KT9!6}xErp-tOe2h$|?#*2OCr`G>Qf1dsU%u-opzR#3cu9GI3M~?aR#;)~z z7zTLon<1X;g##DvDgB3@2I!UL9!9oo*`I^jtL6Nl*D#XQK98uZzK zTnTWzyzSfyo1=Gp#AYl7?Msr)wB2cKhC}Y(FUoJY^nwQ zL^oIqRlQ>uO^u8_3&+CnyJpw86cZe|GP^y1$^>kP&aHl#q;kc0SF<4QCQpi`j&yS4%wxxshq~Pb)sLB`~y?M4hNtN)^D_6*%)i5#s+1~Dsz1asFe%o8= z!XDzc$7Ga^DdPzFb9$=C-B2o+brC!*ixbQlzsZ^~bQQ0S{bptmyA|rU@RU3t+<`zs zdj>1RNCSCPh&Rd_YT(#;ze;FmIMd+a-)0FYFB3hYr^w3WFYki%tdE-IKPKB4gUn2x zaL&QD>&($apiS(0y(r-sYf66OW}w+X#%*Fo=;#-V3z*N-J~hbDM=mF{-qD>)!StxG zDZ|-eJt)fQ7r6KLVZ(Q$IL55K;Ebu0N5qpL3R4o0d_Gd1O%AlVtC+IkC;dvXfDS7C z*)J~!Jr?LhjMg?$2dy0U1H6(w9yOpAmB{EZZUXDFRX4z@T6D+CpMb8lhqJ8BibCFX zT8?L$=SXj){t|mydQxjF>%+G`pjCA4PST{Gm=bO8{jmHA55=U;WmyZGK8p)v<;BFc zpxiFu;LIHs%(F$wK}S-SAFO1IJ)MA7?Ttn@Y3sA*~YR;Jt@ zpo}nY9&wWEl&uB73^6#c`V6&j)~EkbQBtG&l6^{|ePZmkZQ-4@>S@tbph@^TWFcl? zmM7^cj8tsH&o5E*Vq5Br^zhae*(Nw`&BPsXRva7)x?`8;rj-Q}||I}>O_c@%d zyWvo=;d7RB1NR8XLRQ}P;&MbhXOk$H4_KcSnxW3!LlJ6=EAL8kU|q?%^f<)uwHUaM zEpu}%ffyb2Z71>=;@w*kuHyla>fgN@7$}8}`So}1 zvv)^}n^p-e{i0>r`;K=4Gsll2Si)G|u5m(FK;`ce;+w7&P}tZwCi?=JgLQdfZsuh# z=IEgBrB+}3Ydy9Q$rs^tR1HK*Axhtce!d>&1&katoG@`74?Rc<#`e$31-FVb=2p87 znkb~wmEb_9`aWb@0>T;e#cg}g25imz;AA|s-A~~h4A9QxqupcHFFDifmlj6seSPM5 z2Fcs2(Q+{El|gXM(=V^mO1}%tQgMC2Rl6}`c#PI`dP1`s^VfG=1 zxSMYV3TW$+L08gb1Wo~YeWrL85JN_rS@hpt$_(G60zr=vm<{~{Aasq61N}Mo2mc#; zHM7#&zW7!EcK{qf{@G{)J4i9cg>V82IO4&}`-rxs;OzkxJR6Pjt^8=+>nU0c+jd*l zB*_OIKZ<#1%(@{dWwx#b&tlUbIYhV&!=l^1OO5%EKK^4Ler<<2fGi~atr?DDQ3m4ukoFMg`&(Lg~mCLJ~Lf=CV6 zl{eQBwh2xj`H1MJ$2pzurgQoMgh~DNk~m7$&4R(5x_Z`4gH}D6BGPp2WZ)^{bMrr2 z${QW&eL(r0$!pL|l9y|-ZRvnFXjb}zFrxo4!JpXYQvWd1-&dBOv)%)*#aF8wjkZA` z-(wsJ0JPm$CLe^WK?VPTRt(rxl%+=9`zvN%Fo+kG!#j`jPRmjs)@d zJtpCtMTFULuF$)atxVE01}s8iD>(I9KRosB!biWdo^C z&{N{dGrGn@JA2Yxco%gPL=yK*crP{4JXux{SYU!9(To7?L~*5fw@r_n^AC&Nx61vK zKa<@XW~zn*tp@Cd1*O_zQmBw1P<#JKWZ|9!$`QQhPCn`c4@+>y+j^Wf(e0zgbX%qF z(i0G%9zZq&u5N1Z;pMUWt|#4r&AQ}qcuplLWO_Yfx8qjktORf*&Rx9`mk6(Wx&7Zu zynKF4R2WnIQ~bTH+V3Ldr(J+I2sAAf zNMsI{Q^r$1%&_Zz{p{8Fs-;Vm@8NpR>yQKpUNNo|vuTNy0U3~x^yNZu9OfTJ zs0MPyAa2*Z?nv}E>+%8VYh1%(;KM1)vwVgiW`qQp>a`=<+`aKYi|N?WlMNRQnU6NA z1IIkWZ~Q(`=|u)qHq=pSgh%**3TCi)^ByT9xG7>O2)>uH^!OTxBKOY!{l}ox1g$1C;fiZy4W_-EjId9(0 z=I~b3>(r13&58&cn1TQ)(G;XL@`lSlo|kxSlItiTB^GZu4RC@;UcldQo1m(%{pHRi zHUTu7V={6I6_U>tek;BaA{mog5bO057D4Ci{G@`Mj@zs4t~@MvxrB3T^SvgYrU|?K zO58;W3R|O7h4%b}if_y?p^sAK+tBTvJjD^J&!2UGyu;@F6;RS+u#H&l7N*vusjh|5 zJx2jF|L2$(N?*71L5HJTZ*+S3Ox7J55g{j7f~XNR3E$w$=_{km0aN+Ek{tn_$!mHS zQ_M>CTXsTkAMm_b01h4VE86nPO<9mOKvAwf=FL&0)#`r6gb;FZcj>+#i zP0!K1r(URkKk@PE>nafk2O>&|`Zz&(>t&(kEZaqq`s{+xA8o1*0^goPZ;HdzSEk&) zsPrTbMUZRw^sL3mg*2%b0!K)Vj8gF!+lzV?%gE_8=XDjbqI8jqkuB_Tm$>-H+G^^= zc%Ya4Uzu>3UgwkGEm4^G{CRGehM{#(W_Ce|2bjc)#|R3Q(lzkGKpQ#~KvDNMHSnvH z9a;I1k<+hghM~yE;WIf*@rrAVP>cfDByzTq`{+s~?9pRi1lArQhk;Lnc`J01PzKeq zEKFL7wm1b}>4C}xj+jt9FszlP=YirA&5b65H)5E$mw@si?qwQJf1ffnfOF?r-x>%# z_!AUN#|ATC*9#BF-YS8k0noj%>%0AwAB}lm#vq22j>KSbx)ziRB>SBTI{!h;c;70b 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