pax_global_header00006660000000000000000000000064146542445230014523gustar00rootroot0000000000000052 comment=3848ed2c17de5bcdead487417dbf14c5dd017f8d soldair-node-qrcode-5d87b5f/000077500000000000000000000000001465424452300160045ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/.gitignore000066400000000000000000000000531465424452300177720ustar00rootroot00000000000000*~ node_modules coverage .nyc_output build soldair-node-qrcode-5d87b5f/.travis.yml000066400000000000000000000001231465424452300201110ustar00rootroot00000000000000language: node_js dist: bionic node_js: - '10.13.0' - '10' - '12' - 'node' soldair-node-qrcode-5d87b5f/CHANGELOG.md000066400000000000000000000046261465424452300176250ustar00rootroot00000000000000## [1.3.3](https://github.com/soldair/node-qrcode/compare/v1.3.2...v1.3.3) (2019-01-16) fixing security vulnerabillities reported by users of snyk and `npm audit` major versions of deps were bumped and should only impact development of qrcode. ## [1.3.2](https://github.com/soldair/node-qrcode/compare/v1.3.0...v1.3.2) (2019-01-16) ### Bug Fixes * forgot can-promise replacement ([2514445](https://github.com/soldair/node-qrcode/commit/2514445)) * replacing can-promise ([8197d78](https://github.com/soldair/node-qrcode/commit/8197d78)) * security vulnerabillities and a ref to new Buffer ([a40c757](https://github.com/soldair/node-qrcode/commit/a40c757)) # [1.3.0](https://github.com/soldair/node-qrcode/compare/v1.2.1...v1.3.0) (2018-10-01) ## [1.2.1](https://github.com/soldair/node-qrcode/compare/v1.2.0...v1.2.1) (2018-06-06) # [1.2.0](https://github.com/soldair/node-qrcode/compare/v1.1.0...v1.2.0) (2017-12-28) # [1.1.0](https://github.com/soldair/node-qrcode/compare/v1.0.1...v1.1.0) (2017-12-28) ## [1.0.1](https://github.com/soldair/node-qrcode/compare/v1.0.0...v1.0.1) (2017-12-27) # [1.0.0](https://github.com/soldair/node-qrcode/compare/v0.9.0...v1.0.0) (2017-11-08) no breaking changes. promoting to a stable semver # [0.9.0](https://github.com/soldair/node-qrcode/compare/v0.8.2...v0.9.0) (2017-07-22) ## [0.8.2](https://github.com/soldair/node-qrcode/compare/v0.8.0...v0.8.2) (2017-05-23) # [0.8.0](https://github.com/soldair/node-qrcode/compare/v0.7.1...v0.8.0) (2017-03-30) ## [0.7.1](https://github.com/soldair/node-qrcode/compare/v0.7.0...v0.7.1) (2017-03-17) # [0.7.0](https://github.com/soldair/node-qrcode/compare/v0.6.0...v0.7.0) (2017-02-27) # [0.6.0](https://github.com/soldair/node-qrcode/compare/v0.5.0...v0.6.0) (2017-02-24) # [0.5.0](https://github.com/soldair/node-qrcode/compare/v0.4.4...v0.5.0) (2016-09-19) ## [0.4.4](https://github.com/soldair/node-qrcode/compare/v0.4.3...v0.4.4) (2016-08-25) ## [0.4.3](https://github.com/soldair/node-qrcode/compare/v0.4.0...v0.4.3) (2016-08-16) # [0.4.0](https://github.com/soldair/node-qrcode/compare/0.2.10...v0.4.0) (2015-09-17) ## [0.1.1](https://github.com/soldair/node-qrcode/compare/v0.1.0...v0.1.1) (2011-04-17) # [0.1.0](https://github.com/soldair/node-qrcode/compare/0.0.3...v0.1.0) (2011-04-17) ## [0.0.3](https://github.com/soldair/node-qrcode/compare/0.0.2...0.0.3) (2011-02-27) ## 0.0.2 (2010-12-27) soldair-node-qrcode-5d87b5f/CODE_OF_CONDUCT.md000066400000000000000000000064341465424452300206120ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at soldair+qrcode@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq soldair-node-qrcode-5d87b5f/CONTRIBUTING.md000066400000000000000000000031301465424452300202320ustar00rootroot00000000000000# qrcode Contributing Guidelines - Always search for a related issue before starting a new issue. - Always choose a concise, helpful issue name. - Always stay on-topic. If you've got a new bug report or feature request, put it in its own issue. - Always be polite to other people. - Never post private information, such as torrent or tracker names, IP addresses, etc. Issues that break the rules may be deleted and locked without warning. ## qrcode is an OPEN Open Source Project Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. ## Rules There are a few basic ground-rules for contributors: 1. **No `--force` pushes** or modifying the Git history in any way. 1. **External API changes and significant modifications** should be subject to a **pull request** to solicit feedback from other contributors. 1. Pull requests to solicit feedback are *encouraged* for any other non-trivial contribution but left to the discretion of the contributor. 1. Use a non-`master` branch for ongoing work. 1. Contributors should attempt to adhere to the prevailing code style. 1. Run `npm test` locally before submitting your PR to catch easy-to-miss style & testing issues ## Releases Declaring formal releases remains the prerogative of the project maintainer. ## Changes to this arrangement *Thanks to [Rod Vagg](https://github.com/rvagg) and the [LevelUP](https://github.com/rvagg/node-levelup) project for coming up with this model of open source contribution.* soldair-node-qrcode-5d87b5f/README.md000066400000000000000000000535441465424452300172760ustar00rootroot00000000000000# node-qrcode > QR code/2d barcode generator. [![Travis](https://img.shields.io/travis/soldair/node-qrcode.svg?style=flat-square)](http://travis-ci.org/soldair/node-qrcode) [![npm](https://img.shields.io/npm/v/qrcode.svg?style=flat-square)](https://www.npmjs.com/package/qrcode) [![npm](https://img.shields.io/npm/dt/qrcode.svg?style=flat-square)](https://www.npmjs.com/package/qrcode) [![npm](https://img.shields.io/npm/l/qrcode.svg?style=flat-square)](https://github.com/soldair/node-qrcode/blob/master/license) - [Highlights](#highlights) - [Installation](#installation) - [Usage](#usage) - [Error correction level](#error-correction-level) - [QR Code capacity](#qr-code-capacity) - [Encoding Modes](#encoding-modes) - [Binary data](#binary-data) - [Multibyte characters](#multibyte-characters) - [API](#api) - [GS1 QR Codes](#gs1-qr-codes) - [Credits](#credits) - [License](#license) ## Highlights - Works on server and client (and react native with svg) - CLI utility - Save QR code as image - Support for Numeric, Alphanumeric, Kanji and Byte mode - Support for mixed modes - Support for chinese, cyrillic, greek and japanese characters - Support for multibyte characters (like emojis :smile:) - Auto generates optimized segments for best data compression and smallest QR Code size - App agnostic readability, QR Codes by definition are app agnostic ## Installation Inside your project folder do: ```shell npm install --save qrcode ``` or, install it globally to use `qrcode` from the command line to save qrcode images or generate ones you can view in your terminal. ```shell npm install -g qrcode ``` ## Usage ### CLI ``` Usage: qrcode [options] QR Code options: -v, --qversion QR Code symbol version (1 - 40) [number] -e, --error Error correction level [choices: "L", "M", "Q", "H"] -m, --mask Mask pattern (0 - 7) [number] Renderer options: -t, --type Output type [choices: "png", "svg", "utf8"] -w, --width Image width (px) [number] -s, --scale Scale factor [number] -q, --qzone Quiet zone size [number] -l, --lightcolor Light RGBA hex color -d, --darkcolor Dark RGBA hex color --small Output smaller QR code to terminal [boolean] Options: -o, --output Output file -h, --help Show help [boolean] --version Show version number [boolean] Examples: qrcode "some text" Draw in terminal window qrcode -o out.png "some text" Save as png image qrcode -d F00 -o out.png "some text" Use red as foreground color ``` If not specified, output type is guessed from file extension.
Recognized extensions are `png`, `svg` and `txt`. ### Browser `node-qrcode` can be used in browser through module bundlers like [Browserify](https://github.com/substack/node-browserify) and [Webpack](https://github.com/webpack/webpack) or by including the precompiled bundle present in `build/` folder. #### Module bundlers ```html ``` ```javascript // index.js -> bundle.js var QRCode = require('qrcode') var canvas = document.getElementById('canvas') QRCode.toCanvas(canvas, 'sample text', function (error) { if (error) console.error(error) console.log('success!'); }) ``` #### Precompiled bundle ```html ``` If you install through `npm`, precompiled files will be available in `node_modules/qrcode/build/` folder. The precompiled bundle have support for [Internet Explorer 10+, Safari 5.1+, and all evergreen browsers](https://browserl.ist/?q=defaults%2C+IE+%3E%3D+10%2C+Safari+%3E%3D+5.1). ### NodeJS Require the module `qrcode` ```javascript var QRCode = require('qrcode') QRCode.toDataURL('I am a pony!', function (err, url) { console.log(url) }) ``` render a qrcode for the terminal ```js var QRCode = require('qrcode') QRCode.toString('I am a pony!',{type:'terminal'}, function (err, url) { console.log(url) }) ``` ### ES6/ES7 Promises and Async/Await can be used in place of callback function. ```javascript import QRCode from 'qrcode' // With promises QRCode.toDataURL('I am a pony!') .then(url => { console.log(url) }) .catch(err => { console.error(err) }) // With async/await const generateQR = async text => { try { console.log(await QRCode.toDataURL(text)) } catch (err) { console.error(err) } } ``` ## Error correction level Error correction capability allows to successfully scan a QR Code even if the symbol is dirty or damaged. Four levels are available to choose according to the operating environment. Higher levels offer a better error resistance but reduce the symbol's capacity.
If the chances that the QR Code symbol may be corrupted are low (for example if it is showed through a monitor) is possible to safely use a low error level such as `Low` or `Medium`. Possible levels are shown below: | Level | Error resistance | |------------------|:----------------:| | **L** (Low) | **~7%** | | **M** (Medium) | **~15%** | | **Q** (Quartile) | **~25%** | | **H** (High) | **~30%** | The percentage indicates the maximum amount of damaged surface after which the symbol becomes unreadable. Error level can be set through `options.errorCorrectionLevel` property.
If not specified, the default value is `M`. ```javascript QRCode.toDataURL('some text', { errorCorrectionLevel: 'H' }, function (err, url) { console.log(url) }) ``` ## QR Code capacity Capacity depends on symbol version and error correction level. Also encoding modes may influence the amount of storable data. The QR Code versions range from version **1** to version **40**.
Each version has a different number of modules (black and white dots), which define the symbol's size. For version 1 they are `21x21`, for version 2 `25x25` e so on. Higher is the version, more are the storable data, and of course bigger will be the QR Code symbol. The table below shows the maximum number of storable characters in each encoding mode and for each error correction level. | Mode | L | M | Q | H | |--------------|------|------|------|------| | Numeric | 7089 | 5596 | 3993 | 3057 | | Alphanumeric | 4296 | 3391 | 2420 | 1852 | | Byte | 2953 | 2331 | 1663 | 1273 | | Kanji | 1817 | 1435 | 1024 | 784 | **Note:** Maximum characters number can be different when using [Mixed modes](#mixed-modes). QR Code version can be set through `options.version` property.
If no version is specified, the more suitable value will be used. Unless a specific version is required, this option is not needed. ```javascript QRCode.toDataURL('some text', { version: 2 }, function (err, url) { console.log(url) }) ``` ## Encoding modes Modes can be used to encode a string in a more efficient way.
A mode may be more suitable than others depending on the string content. A list of supported modes are shown in the table below: | Mode | Characters | Compression | |--------------|-----------------------------------------------------------|-------------------------------------------| | Numeric | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 | 3 characters are represented by 10 bits | | Alphanumeric | 0–9, A–Z (upper-case only), space, $, %, *, +, -, ., /, : | 2 characters are represented by 11 bits | | Kanji | Characters from the Shift JIS system based on JIS X 0208 | 2 kanji are represented by 13 bits | | Byte | Characters from the ISO/IEC 8859-1 character set | Each characters are represented by 8 bits | Choose the right mode may be tricky if the input text is unknown.
In these cases **Byte** mode is the best choice since all characters can be encoded with it. (See [Multibyte characters](#multibyte-characters))
However, if the QR Code reader supports mixed modes, using [Auto mode](#auto-mode) may produce better results. ### Mixed modes Mixed modes are also possible. A QR code can be generated from a series of segments having different encoding modes to optimize the data compression.
However, switching from a mode to another has a cost which may lead to a worst result if it's not taken into account. See [Manual mode](#manual-mode) for an example of how to specify segments with different encoding modes. ### Auto mode By **default**, automatic mode selection is used.
The input string is automatically splitted in various segments optimized to produce the shortest possible bitstream using mixed modes.
This is the preferred way to generate the QR Code. For example, the string **ABCDE12345678?A1A** will be splitted in 3 segments with the following modes: | Segment | Mode | |----------|--------------| | ABCDE | Alphanumeric | | 12345678 | Numeric | | ?A1A | Byte | Any other combinations of segments and modes will result in a longer bitstream.
If you need to keep the QR Code size small, this mode will produce the best results. ### Manual mode If auto mode doesn't work for you or you have specific needs, is also possible to manually specify each segment with the relative mode. In this way no segment optimizations will be applied under the hood.
Segments list can be passed as an array of object: ```javascript var QRCode = require('qrcode') var segs = [ { data: 'ABCDEFG', mode: 'alphanumeric' }, { data: '0123456', mode: 'numeric' } ] QRCode.toDataURL(segs, function (err, url) { console.log(url) }) ``` ### Kanji mode With kanji mode is possible to encode characters from the Shift JIS system in an optimized way.
Unfortunately, there isn't a way to calculate a Shifted JIS values from, for example, a character encoded in UTF-8, for this reason a conversion table from the input characters to the SJIS values is needed.
This table is not included by default in the bundle to keep the size as small as possible. If your application requires kanji support, you will need to pass a function that will take care of converting the input characters to appropriate values. An helper method is provided by the lib through an optional file that you can include as shown in the example below. **Note:** Support for Kanji mode is only needed if you want to benefit of the data compression, otherwise is still possible to encode kanji using Byte mode (See [Multibyte characters](#multibyte-characters)). ```javascript var QRCode = require('qrcode') var toSJIS = require('qrcode/helper/to-sjis') QRCode.toDataURL(kanjiString, { toSJISFunc: toSJIS }, function (err, url) { console.log(url) }) ``` With precompiled bundle: ```html ``` ## Binary data QR Codes can hold arbitrary byte-based binary data. If you attempt to create a binary QR Code by first converting the data to a JavaScript string, it will fail to encode propery because string encoding adds additional bytes. Instead, you must pass a [`Uint8ClampedArray`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray) or compatible array, or a Node [Buffer](https://nodejs.org/api/buffer.html), as follows: ```javascript // Regular array example // WARNING: Element values will be clamped to 0-255 even if your data contains higher values. const QRCode = require('qrcode') QRCode.toFile( 'foo.png', [{ data: [253,254,255], mode: 'byte' }], ...options..., ...callback... ) ``` ```javascript // Uint8ClampedArray example const QRCode = require('qrcode') QRCode.toFile( 'foo.png', [{ data: new Uint8ClampedArray([253,254,255]), mode: 'byte' }], ...options..., ...callback... ) ``` ```javascript // Node Buffer example // WARNING: Element values will be clamped to 0-255 even if your data contains higher values. const QRCode = require('qrcode') QRCode.toFile( 'foo.png', [{ data: Buffer.from([253,254,255]), mode: 'byte' }], ...options..., ...callback... ) ``` TypeScript users: if you are using [@types/qrcode](https://www.npmjs.com/package/@types/qrcode), you will need to add a `// @ts-ignore` above the data segment because it expects `data: string`. ## Multibyte characters Support for multibyte characters isn't present in the initial QR Code standard, but is possible to encode UTF-8 characters in Byte mode. QR Codes provide a way to specify a different type of character set through ECI (Extended Channel Interpretation), but it's not fully implemented in this lib yet. Most QR Code readers, however, are able to recognize multibyte characters even without ECI. Note that a single Kanji/Kana or Emoji can take up to 4 bytes. ## API Browser: - [create()](#createtext-options) - [toCanvas()](#tocanvascanvaselement-text-options-cberror) - [toDataURL()](#todataurltext-options-cberror-url) - [toString()](#tostringtext-options-cberror-string) Server: - [create()](#createtext-options) - [toCanvas()](#tocanvascanvas-text-options-cberror) - [toDataURL()](#todataurltext-options-cberror-url-1) - [toString()](#tostringtext-options-cberror-string-1) - [toFile()](#tofilepath-text-options-cberror) - [toFileStream()](#tofilestreamstream-text-options) ### Browser API #### `create(text, [options])` Creates QR Code symbol and returns a qrcode object. ##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` See [QR Code options](#qr-code-options). ##### `returns` Type: `Object` ```javascript // QRCode object { modules, // Bitmatrix class with modules data version, // Calculated QR Code version errorCorrectionLevel, // Error Correction Level maskPattern, // Calculated Mask pattern segments // Generated segments } ```
#### `toCanvas(canvasElement, text, [options], [cb(error)])` #### `toCanvas(text, [options], [cb(error, canvas)])` Draws qr code symbol to canvas.
If `canvasElement` is omitted a new canvas is returned. ##### `canvasElement` Type: `DOMElement` Canvas where to draw QR Code. ##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` See [Options](#options). ##### `cb` Type: `Function` Callback function called on finish. ##### Example ```javascript QRCode.toCanvas('text', { errorCorrectionLevel: 'H' }, function (err, canvas) { if (err) throw err var container = document.getElementById('container') container.appendChild(canvas) }) ```
#### `toDataURL(text, [options], [cb(error, url)])` #### `toDataURL(canvasElement, text, [options], [cb(error, url)])` Returns a Data URI containing a representation of the QR Code image.
If provided, `canvasElement` will be used as canvas to generate the data URI. ##### `canvasElement` Type: `DOMElement` Canvas where to draw QR Code. ##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` - ###### `type` Type: `String`
Default: `image/png` Data URI format.
Possible values are: `image/png`, `image/jpeg`, `image/webp`.
- ###### `rendererOpts.quality` Type: `Number`
Default: `0.92` A Number between `0` and `1` indicating image quality if the requested type is `image/jpeg` or `image/webp`. See [Options](#options) for other settings. ##### `cb` Type: `Function` Callback function called on finish. ##### Example ```javascript var opts = { errorCorrectionLevel: 'H', type: 'image/jpeg', quality: 0.3, margin: 1, color: { dark:"#010599FF", light:"#FFBF60FF" } } QRCode.toDataURL('text', opts, function (err, url) { if (err) throw err var img = document.getElementById('image') img.src = url }) ```
#### `toString(text, [options], [cb(error, string)])` Returns a string representation of the QR Code.
##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` - ###### `type` Type: `String`
Default: `utf8` Output format.
Possible values are: `terminal`,`utf8`, and `svg`. See [Options](#options) for other settings. ##### `cb` Type: `Function` Callback function called on finish. ##### Example ```javascript QRCode.toString('http://www.google.com', function (err, string) { if (err) throw err console.log(string) }) ```
### Server API #### `create(text, [options])` See [create](#createtext-options).
#### `toCanvas(canvas, text, [options], [cb(error)])` Draws qr code symbol to [node canvas](https://github.com/Automattic/node-canvas). ##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` See [Options](#options). ##### `cb` Type: `Function` Callback function called on finish.
#### `toDataURL(text, [options], [cb(error, url)])` Returns a Data URI containing a representation of the QR Code image.
Only works with `image/png` type for now. ##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` See [Options](#options) for other settings. ##### `cb` Type: `Function` Callback function called on finish.
#### `toString(text, [options], [cb(error, string)])` Returns a string representation of the QR Code.
If choosen output format is `svg` it will returns a string containing xml code. ##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` - ###### `type` Type: `String`
Default: `utf8` Output format.
Possible values are: `utf8`, `svg`, `terminal`. See [Options](#options) for other settings. ##### `cb` Type: `Function` Callback function called on finish. ##### Example ```javascript QRCode.toString('http://www.google.com', function (err, string) { if (err) throw err console.log(string) }) ```
#### `toFile(path, text, [options], [cb(error)])` Saves QR Code to image file.
If `options.type` is not specified, the format will be guessed from file extension.
Recognized extensions are `png`, `svg`, `txt`. ##### `path` Type: `String` Path where to save the file. ##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` - ###### `type` Type: `String`
Default: `png` Output format.
Possible values are: `png`, `svg`, `utf8`. - ###### `rendererOpts.deflateLevel` **(png only)** Type: `Number`
Default: `9` Compression level for deflate. - ###### `rendererOpts.deflateStrategy` **(png only)** Type: `Number`
Default: `3` Compression strategy for deflate. See [Options](#options) for other settings. ##### `cb` Type: `Function` Callback function called on finish. ##### Example ```javascript QRCode.toFile('path/to/filename.png', 'Some text', { color: { dark: '#00F', // Blue dots light: '#0000' // Transparent background } }, function (err) { if (err) throw err console.log('done') }) ```
#### `toFileStream(stream, text, [options])` Writes QR Code image to stream. Only works with `png` format for now. ##### `stream` Type: `stream.Writable` Node stream. ##### `text` Type: `String|Array` Text to encode or a list of objects describing segments. ##### `options` See [Options](#options).
### Options #### QR Code options ##### `version` Type: `Number`
QR Code version. If not specified the more suitable value will be calculated. ##### `errorCorrectionLevel` Type: `String`
Default: `M` Error correction level.
Possible values are `low, medium, quartile, high` or `L, M, Q, H`. ##### `maskPattern` Type: `Number`
Mask pattern used to mask the symbol.
Possible values are `0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`.
If not specified the more suitable value will be calculated. ##### `toSJISFunc` Type: `Function`
Helper function used internally to convert a kanji to its Shift JIS value.
Provide this function if you need support for Kanji mode. #### Renderers options ##### `margin` Type: `Number`
Default: `4` Define how much wide the quiet zone should be. ##### `scale` Type: `Number`
Default: `4` Scale factor. A value of `1` means 1px per modules (black dots). ##### `small` Type: `Boolean`
Default: `false` Relevant only for terminal renderer. Outputs smaller QR code. ##### `width` Type: `Number`
Forces a specific width for the output image.
If width is too small to contain the qr symbol, this option will be ignored.
Takes precedence over `scale`. ##### `color.dark` Type: `String`
Default: `#000000ff` Color of dark module. Value must be in hex format (RGBA).
Note: dark color should always be darker than `color.light`. ##### `color.light` Type: `String`
Default: `#ffffffff` Color of light module. Value must be in hex format (RGBA).

## GS1 QR Codes There was a real good discussion here about them. but in short any qrcode generator will make gs1 compatible qrcodes, but what defines a gs1 qrcode is a header with metadata that describes your gs1 information. https://github.com/soldair/node-qrcode/issues/45 ## Credits This lib is based on "QRCode for JavaScript" which Kazuhiko Arase thankfully MIT licensed. ## License [MIT](https://github.com/soldair/node-qrcode/blob/master/license) The word "QR Code" is registered trademark of:
DENSO WAVE INCORPORATED soldair-node-qrcode-5d87b5f/bin/000077500000000000000000000000001465424452300165545ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/bin/qrcode000077500000000000000000000070701465424452300177630ustar00rootroot00000000000000#!/usr/bin/env node var yargs = require('yargs') var qr = require('../lib') function save (file, text, options) { qr.toFile(file, text, options, function (err, data) { if (err) { console.error('Error:', err.message) process.exit(1) } console.log('saved qrcode to: ' + file + '\n') }) } function print (text, options) { options.type = 'terminal' qr.toString(text, options, function (err, text) { if (err) { console.error('Error:', err.message) process.exit(1) } console.log(text) }) } function parseOptions (args) { return { version: args.qversion, errorCorrectionLevel: args.error, type: args.type, small: !!args.small, inverse: !!args.inverse, maskPattern: args.mask, margin: args.qzone, width: args.width, scale: args.scale, color: { light: args.lightcolor, dark: args.darkcolor } } } function processInputs (text, opts) { if (!text.length) { yargs.showHelp() process.exit(1) } if (opts.output) { save(opts.output, text, parseOptions(opts)) } else { print(text, parseOptions(opts)) } } var argv = yargs .detectLocale(false) .usage('Usage: $0 [options] ') .option('v', { alias: 'qversion', description: 'QR Code symbol version (1 - 40)', group: 'QR Code options:', type: 'number' }) .option('e', { alias: 'error', description: 'Error correction level', choices: ['L', 'M', 'Q', 'H'], group: 'QR Code options:' }) .option('m', { alias: 'mask', description: 'Mask pattern (0 - 7)', group: 'QR Code options:', type: 'number' }) .option('t', { alias: 'type', description: 'Output type', choices: ['png', 'svg', 'utf8'], implies: 'output', group: 'Renderer options:' }) .option('i', { alias: 'inverse', type: 'boolean', description: 'Invert colors', group: 'Renderer options:' }) .option('w', { alias: 'width', description: 'Image width (px)', conflicts: 'scale', group: 'Renderer options:', type: 'number' }) .option('s', { alias: 'scale', description: 'Scale factor', conflicts: 'width', group: 'Renderer options:', type: 'number' }) .option('q', { alias: 'qzone', description: 'Quiet zone size', group: 'Renderer options:', type: 'number' }) .option('l', { alias: 'lightcolor', description: 'Light RGBA hex color', group: 'Renderer options:' }) .option('d', { alias: 'darkcolor', description: 'Dark RGBA hex color', group: 'Renderer options:' }) .option('small', { type: 'boolean', description: 'Output smaller QR code to terminal', conflicts: 'type', group: 'Renderer options:' }) .option('o', { alias: 'output', description: 'Output file' }) .help('h') .alias('h', 'help') .version() .example('$0 "some text"', 'Draw in terminal window') .example('$0 -o out.png "some text"', 'Save as png image') .example('$0 -d F00 -o out.png "some text"', 'Use red as foreground color') .parserConfiguration({'parse-numbers': false}) .argv if (process.stdin.isTTY) { processInputs(argv._.join(' '), argv) } else { var text = '' process.stdin.setEncoding('utf8') process.stdin.on('readable', function () { var chunk = process.stdin.read() if (chunk !== null) { text += chunk } }) process.stdin.on('end', function () { // this process can be run as a command outside of a tty so if there was no // data on stdin read from argv processInputs(text.length?text:argv._.join(' '), argv) }) } soldair-node-qrcode-5d87b5f/examples/000077500000000000000000000000001465424452300176225ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/examples/cli.js000066400000000000000000000002351465424452300207270ustar00rootroot00000000000000const QRCode = require('../lib') QRCode.toString('yo yo yo', function (error, data) { if (error) { throw new Error(error) } console.log(data) }) soldair-node-qrcode-5d87b5f/examples/clientside.html000066400000000000000000000142111465424452300226320ustar00rootroot00000000000000 client side test for node-qrcode

node-qrcode

soldair-node-qrcode-5d87b5f/examples/clientsideserver.js000066400000000000000000000174711465424452300235440ustar00rootroot00000000000000const express = require('express') const app = express()// .createServer() const http = require('http') const fs = require('fs') const QRCode = require('../lib') const canvasutil = require('canvasutil') const { createCanvas, loadImage } = require('canvas') const path = require('path') // app.use(express.methodOverride()) // app.use(express.bodyParser()) // app.use(app.router) // app.use(express.static(path.resolve(__dirname, '..'))) app.get('/qrcode.js', (req, res) => { res.set('content-type', 'text/javascript') fs.createReadStream(path.join(__dirname, '..', 'build', 'qrcode.js')).pipe(res) }) app.get('/qrcode.tosjis.js', (req, res) => { res.set('content-type', 'text/javascript') fs.createReadStream(path.join(__dirname, '..', 'build', 'qrcode.tosjis.js')).pipe(res) }) app.get('/', function (req, res) { fs.readFile(path.join(__dirname, 'clientside.html'), function (err, data) { res.send(data ? data.toString() : err) }) }) const effectHandlers = {} app.get('/generate', function (req, res) { const q = req.query || {} let effect = q.effect || 'plain' if (!effectHandlers[effect]) { effect = 'plain' } effectHandlers[effect](q, function (error, canvas) { if (!error) { canvas.toBuffer(function (err, buf) { if (!err) { res.header('Content-Type', 'image/png') res.send(buf) } }) } else { const msg = error.message + '\n' + error.stack res.header('Content-Type', 'text/plain') res.send(msg) console.error(msg) } }) }) effectHandlers.node = function (args, cb) { args.src = path.join(__dirname, 'images', 'node_logo.png') this.image(path.join(args, cb)) } effectHandlers.npm = function (args, cb) { args.src = path.join(__dirname, 'images', 'npm_logo.png') this.image(args, cb) } effectHandlers.bacon = function (args, cb) { args.src = path.join(__dirname, 'images', 'bacon-love.png') this.image(args, cb) } effectHandlers.rounded = function (args, cb) { const canvas = createCanvas(200, 200) QRCode.toCanvas(canvas, args.text || '', function (err) { if (err) { cb(err, canvas) return } const tpx = new canvasutil.PixelCore() const luma709Only = canvasutil.conversionLib.luma709Only const up = [] const down = [] const left = [] const right = [] let upPx let downPx let leftPx let rightPx let r let t let l let d let corner = 0 tpx.threshold = 100 tpx.iterate(canvas, function (px, i, len, pixels, w, h, pixelCore) { corner = 0 // is dark if (luma709Only(px.r, px.g, px.b) < pixelCore.threshold) { if (i - w > 0) { upPx = (i - w) * 4 up[0] = pixels[upPx + 0] up[1] = pixels[upPx + 1] up[2] = pixels[upPx + 2] // console.log('up',up); } if (i + w <= len) { downPx = (i + w) * 4 down[0] = pixels[downPx + 0] down[1] = pixels[downPx + 1] down[2] = pixels[downPx + 2] // console.log('down',down); } // have left pixel but no wrapping if (i % w !== 0) { leftPx = (i - 1) * 4 left[0] = pixels[leftPx + 0] left[1] = pixels[leftPx + 1] left[2] = pixels[leftPx + 2] // console.log('left',left); } if (i % w !== w - 1) { rightPx = (i + 1) * 4 right[0] = pixels[rightPx + 0] right[1] = pixels[rightPx + 1] right[2] = pixels[rightPx + 2] // console.log('right',right); } r = rightPx ? luma709Only(right[0], right[1], right[2]) : 0 t = upPx ? luma709Only(up[0], up[1], up[2]) : 0 l = leftPx ? luma709Only(left[0], left[1], left[2]) : 0 d = downPx ? luma709Only(down[0], down[1], down[2]) : 0 if (l > pixelCore.threshold) { // if left is light and i am dark if (t > pixelCore.threshold) { // if top is light and i am dark corner = 1 pixels[rightPx + 4] = 100 } else if (d > pixelCore.threshold) { // if bottom is light and i am dark pixels[rightPx + 4] = 100 corner = 1 } } else if (r > pixelCore.threshold) { if (t > pixelCore.threshold) { // if top is light and i am dark corner = 1 } else if (d > pixelCore.threshold) { // if bottom is light and i am dark corner = 1 } } if (corner) { px.a = 50 } } }) cb(null, canvas) }) } effectHandlers.remoteImage = function (args, cb) { let src = args.src let domain let uri if (!src) { cb(new Error('src required'), null) } else { if (src.indexof('://') !== -1) { src = src.split('://').unshift() const parts = src.split('/') domain = parts.shift() uri = parts.join('/') } } if (!domain || !uri) { cb(new Error('missing domain or uri ' + args.src)) return } const options = { host: domain, port: 80, path: uri, method: 'GET' } const req = http.request(options, function (res) { if (res.statusCode < 200 || res.statusCode > 299) { cb(new Error('http ' + res.statusCode + ' response code'), null) return } res.setEncoding('utf8') let data = '' res.on('data', function (chunk) { data += chunk console.log('BODY: ' + chunk) }) res.on('complete', function () { cb(null, data) }) res.on('error', function (error) { cb(error, null) cb = function () {} }) }) req.end() } effectHandlers.image = function (args, cb) { loadImage(args.src || '').then((img) => { const convert = canvasutil.conversionLib const canvas = createCanvas(200, 200) QRCode.toCanvas(canvas, args.text || '', function (err) { if (err) { cb(err, false) return } const codeCtx = canvas.getContext('2d') const frame = codeCtx.getImageData(0, 0, canvas.width, canvas.width) const tpx = new canvasutil.PixelCore() const baconCanvas = createCanvas(canvas.width, canvas.width) const ctx = baconCanvas.getContext('2d') const topThreshold = args.darkThreshold || 25 const bottomThreshold = args.lightThreshold || 75 tpx.threshold = 50 // scale image let w = canvas.width let h = canvas.height if (img.width > img.height) { w = w * (canvas.height / h) h = canvas.height } else { h = h * (canvas.height / w) w = canvas.width } ctx.drawImage(img, 0, 0, w, h) try { tpx.iterate(baconCanvas, function (px, i, l, pixels, w, h, pixelCore) { const luma = (0.2125 * px.r + 0.7154 * px.g + 0.0721 * px.b) const codeLuma = convert.luma709Only(frame.data[i * 4], frame.data[i * 4 + 1], frame.data[i * 4 + 2]) let yuv let rgb if (codeLuma > pixelCore.threshold) { if (luma < bottomThreshold) { yuv = convert.rgbToYuv(px.r, px.g, px.b) rgb = convert.yuvToRgb(bottomThreshold, yuv[1], yuv[2]) px.r = rgb[0] px.g = rgb[1] px.b = rgb[2] px.a = 255 } } else { if (luma > topThreshold) { yuv = convert.rgbToYuv(px.r, px.g, px.b) rgb = convert.yuvToRgb(topThreshold, yuv[1], yuv[2]) px.r = rgb[0] px.g = rgb[1] px.b = rgb[2] } } }) } catch (e) { cb(err, false) } cb(null, baconCanvas) }) }, (error) => { cb(error, null) }) } effectHandlers.plain = function (args, cb) { const canvas = createCanvas(200, 200) const text = args.text || '' QRCode.toCanvas(canvas, text || '', function (err) { cb(err, canvas) }) } app.listen(3031) console.log('listening on 3031') soldair-node-qrcode-5d87b5f/examples/images/000077500000000000000000000000001465424452300210675ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/examples/images/bacon-love.png000066400000000000000000006463121465424452300236360ustar00rootroot00000000000000‰PNG  IHDR™M Ý pHYs  ÒÝ~ü vpAg™W5¤€IDATxÚì}wxdguþWo�®Q×6mßu¯ôj Bï5` z'qø !$! ZºÁÆWÀ66î^¯íí]»«Þ¦ÏÜúÕßÚ•µÒH«uÃ$:Ï}ôH£;÷ÎܹsÞïœ÷œ÷ ˜3&ø¬mæƒ\Š©mînS{Nos÷Ÿõ¯™Nï6÷à\ ¡äÔ6ó÷¶YG›zPj¥´VZK­¦O1wç©Mj%µ:鉦w›úez›:ÑÔ¹æÛ澪¹Ç™{ÀYÛ’-Ù’ýï3u¢Í»Û‰f®kjêsfyž™þg¦Ónêîfy¶Y'šé~§ÿ…¦ÞϬ·§µ „à¸Agþ9óAáÔsgý !D¦ Œ1Æ!„šuœé'Î:Â\›¾úÓ§›~3÷yØÀ±¢ãç±™¯î{™û®Á£0 ~a�íÎK¶dKöçn‹w/3=رGœ¹!ˆfî0Ó“Ìúï,›éf=ñ¤îÍ…Š¦à±ø 1Ë#ØÙ8¼ÀEœ>ÂÌÝŽ]”™x1Lí9�J«™W°)RÎzË \�ù®ã”ë_Àûk­gv 'K¸²dKö¿HNðþ'z¹…ž »¥Õ¬m–·TZ�-'žw�ö~³^Û,‡‰æ³Å„l3Ï7…Ì‚­µ”RJ9+¼˜{±æºûY¯µi\23ÌšùßéˆäxzvÓìÒ̇Ø'Å•EÝ:Bs„ÇEÍ[X²%[²' 8ë—¾ò'@Â<‹à¦�O{Γ‚âÔYУÁÕÅì9�õšõs–Ÿ/h˜X!4}À¹´@Ü£�>)ü.ðßG½�-fŪ3_áÜWõXåÁ–eÉ–ìAl–C›úAÔt›»Vž3Mág>pZ؇ 5�Í—k›�™˜1€ã„ÊÌ=OȆ)5ëÍÌ„–¹÷„#Oùßã»MŸbîÛn�&�„Ç¢‡…C±Çä.™B…ãç† -=# [B”%[²?ß„Ø#X³j ggÀ€žoñ:ËÛ,Þ?ÌrÝÓÇÔZ£¹Þsaº˜xb>?·¼a6`ÌÁ•üûIø¥9Ø{Ì¡ŸˆIóÑ9ó† Z7 6‰C3¡q‘Y¯RœK¶dKö9ñ5�­švnÓŒÀ¬ anvë”è䦴ÅBDý¬Èc5ÒšÇÍ‚’™ÿ�N^aŒçòí ¿0ƒóŸö¼³ª¶fÕ3̬4;ejá•û u�]ÊkÖûZ$¢Ì…“¥8cÉ–lÉJ=A„Æ;ÚcdÁ±ðeN©TÓ ü#ö{S‡mžËBM�xï=ó|3³[!‚ÉL?3m¥”šâêg†&sk‹§afú\ÓïnölfôôãRI©ä42ϤCBàxññz°¹E©dSP`„g¾¯©ã̧“Fo3÷™µ¾˜‰"hƘަÁ=Ê{nn%ÅP-Ù’=ùíx¶EÏtÇ~×j0éh0cå:å0§Üc£öœs|Ñt-2‚h6m›dhŽyãÑϼU^'u‘³â‰&y8o–i¾E÷ØÌÍbM¿ž¹†žËDM¹þE‘]ð�ù”v>¥èÃÛèè„K¶dKöd@”Ç6]Ñ”Ö=¡åD�ôp$4�MÓ M@e�·4×ÍŒfQ#MÖbœrÓƒ4-Z˜ïÕN]¬¦}š§ôÁ<1ÞvvøùD9ú%,Y²%û_€1‹ùvŸÀšL;OÍëcç$ͦc�S.)žÙù1§=ŸëŸ�TŸõûÌÚ°™É«cÄÔ‰mÿS4ɱíDþ¿é5=%<›/[²%[²%{"m�XÀ­ÍG�4/;ñÁ…•G¦ˆíùš]Ð,êVVd>¼š�fŸõ¬™ðÐ4årRw? ªS�XÓÿ6 ›ÀÉ«šJÑ,¶‹õ(ÌÁö™ÿħ¿–8•%[²?/\Y �±pËöÂ<îb04+Ôš¡H¦f à“úÍYÞg®¾ÈÜV’¹®ü¤—c柳ÊϦ‘Ymó— ç”fV,2ÙWA°9÷ÒŸt]ðçM/Ù’-ÙŸ%-,»²€¬ÔŒtÖLç¿pòÔ³Ð,^¤iØš•ù.ÐÒ13âY 9qîq/ãxR‘•Gé.Ÿ0øSq*ó�ú’-Ù’ý_°cy0ÏÖ,�±@kàL5í>iÚ¹H=WseV Ñ´íqæƒs›ó›rõSªb\p!…Tò„ý\8zXZ³/•~-Ù’ýY‚Ácš²^X×ñ7~¼Èx�ÐgÊŸ+›+¨5Ýí1³kDñpc !S^S¯€2%Ö2Õ’Ž«Ð€›Kféê#„¦“Ws›.çBѬÊ™Zú³žgILΪ ˜ºFsû4>8Iîn¾º€&5r@k ¥’MÙ­Ùe|�ª-,)ºÀÒa‰qY²%{r.M¬iSý|™ž™cDfjÀÌ?ÍÏ©ÌRÿ�rå„�¦ öMç©(­fM¯ÈtùVÓù( „Ps“r§*Û5›°:ÅÏi>±²Åäîš¾€%[²%[²''tÍ÷{ÓìÎɉúÅgKfRè‹ÅóÕÏ÷ºXw?VÉœÅgºÝrÖràQvÉ–lÉ–ìI-3G­Ì‡+3Wóózÿ™ù¨i©)åܹ) YÇû\Ÿ»@ÑðÌ70cfÖƒÁ _ó ˜Ó“8oèÐL—~f9ÀÂâóMÙ”ÇCçñÐb©6wÉ–lÉþwÙ"§Ö7u¼ó‚Êwf*B)åÌÞY+ñ)‚É” ÓNû‡—iŸé:è¹ÁÍÜ ’sßðIgË?æÓæO:LmÉ–lÉ–ìÏZÀ‰J”Î7/ñ�ÝDÈE)¥ç\JùðЕããåg¥¿¦¨u!Äôœ’cÍý@OãÁ48=œÓjªcñ„�suifÀRóñŽ`öÌ®ÙuÖsÔ›gVX?="H˜ÕbrRh™9¥`VÙxSÀ{¬´¹H-~ Ü’-Ù’=éñœ8^åáÉLSóWŽMaQzæ67??k;©ChNÔÏLL-Ü�13O5 æ3Ϫ”š/s5w¬}ÓdÚ\`8Õ@d8�2¢h=ëé§z�¦ŸK¶dK¶dO|šë1\D¢¹ Õ¦Eº³|ñÜ—2k&ãܮ˦œKïÏšêxªKõùž57 ÷(/ÜÌ.ÓG€%Kp²dK¶dOFhyDÉüúIv²‹‘YžÖ{™U²5Ÿ.ËIeBVŠlªïRøy<Οà-aÉ’-Ù’=ÁPqÒÇç¸ò“8ÉÅ@jZa5W eîpøYŽu¶"ýÉZëç ‰žOyœ½?Uç¾°ÌþÌkºÄ®/Ù’-Ùÿú¤iáÒIšç™ÿ4´ÌÜ-~ý¬©‹Méý)5ÉY-,³†£4=Èô)¦e(§l*‡ÖôŒ yœK+DYª$^²%[²ÿ5ö6e£æAÐü¸Ó…X`Á†ö¹TÊ\Åû¦Æ,2æ¤)¦&Ϝҷ¹zþ3!÷Q�Ê£(&~dÏ]$¸.Ù’-Ù’-ÞŸ€9êì‹ñ`gF…š�½hºŸ«ñ5+g5—Ì7@eú,Ó;O•)OõµLms9˜é®—“X³~‘Å*ŸºS>!/ à©âÓRæmÉ–lÉžŒ0ó¨y_æ¡Læ’9S0Å�ÏìS™zdáÕôÂN|zÐ8Þtyáß,vi"Ör"ŽžµœÕq9k2<˜Gº�”â,|ž Ç.Ë<ɹÇY Î�ü�BÀ%ûߗʘ™j>ÉS¤€éÆ €Zª¥Pø·5%ê›V5ÙTæF ;'gxæ·™MóÜZ³1–�ìžž5sÖàLЬøxîp­0|nŸỄ<²B¯©Îž®êÒw`ÉN)Œ^¼‚Äèxwœî”Ó, Â·dK6o¤²À䯦8ÑÔ7Í›�´3ñ¤üÿæO›ÓH@ƒÅU?ÜÕUO%hÖ´'KöG9 ”õ/]¢%[lúkVOÉÜÂâùVÍMï¦ÎzºBLJ šÍmœšC¼°£?é~&œà�OÌ>-ò{204�ä¸ppóˆ¡eÉ–ìÑç7NŠ%Mc÷™K½¥;sÉ*ÓÞ|ªxVúµiKÊIïÈ…ÓJ³¢™¹æÁœöûGPgÝŸˆ…ÞŒ�e&³t«-ÙŸ ÍüJ.•þŸ[�;®Sò`¨)r<âûf¾ãLÝ Ó%^“˜ófÐÒtŒåâ#˜&M0'ãTNá‹×¬vkf)ó\îýO˜ÍXX±fÉþÌMÍÜ´–S۬ǧÿ5÷ñ©m¾À}ªpfÛºtÿüŸÂ•S]£é²®)k:¸wVd°€/^xPã"}ôã!©òÈö™¯k4«ïšyæV—=Xü³¿¨Ô�³=V¯óÿÜwøQ\Ÿ¦¹ë¹;5ߦÐe u´<æ,â,j?B=8-}îK†À‰í ÓuYóñöóÝMUÓg…ÏSÅÁÇ6¥¦+‰§Ê´æ‹BMú¨i#Ë|œÊÜ’â“F' àÐܩƋZœÌ/ݲKvÒ$Á|_Õ…J)€@pÅ™d1�B…Rñ©Mi¡´Ð@Nm§ *Kö T´ÖRJ.8\1E«ÌÏ­yŸ›¼š«j<76=Åë¸\ j'3*æjÏŒæúôé©_ÓG>a*À´LÍôt�yÿéïŠzj;)ÂM¿#š:Åñas·éQ(´„œÃ�h hÀ#UTM@.ôë<ö8P€ P‰ÂÂðJ\c@ÄR@ a ƒÀ—ªÁA t#„1"æÌçÌW2ÖœÅ~Ö|(5Œ¸B„Hæ×AX‡<aÄýr)ÃPžðjÊkÀ8Ž'ŠÐ�`5 c¸Ž Ôq Eãzul0(*c#Ú€PQq ¼(@¤ €€)¨„š±HI¥ ª^5ö‘Ç¡ h´’q¤4“"b±§tƒ(Òa$C �B+¡•�’sq1sÀ€<¶i%¤”R+õd"´´>6¸Bj¥µZj%¦â¥\J ”‘€B ã(¥™”\i&5‹¸ÇAì³F¬B�7˜ jõ"«P÷èj¡>Ô/ËÈBÅ¡ b âˆÕb^•Ú‚)JêÛ­ã ë0¬Ãjá–«~þàm¿Q­ïC[oÿíµ¿¸ìW?ýîžï¸åŠËo¿öjä—ëcýãG÷AhæA+¿*eU�ô« VSÚ âa€0ŠkBGBG 0¥c­âoD�1¨ë2 ¡ % !XjÎxè)†A= ¼©hj¾üÞ’Ë~\ãã©�+‹Üà<_¬‡{àg¶¸Ïrß3�ûÜ!ŒM—EMË‚O8ì<Ð|"•s#�G™(<¥Ý#YK�5{aHMå!”Ò dD¤”u¯æÚTŠX2¡$OÚŽ)h@Š¥¶fQ°J0c×à"†A ` ‰“JhÆ!pD Ú«—©‰¡*f*¢yì• á<,QaÝ(�²lD%Ž 2.Š*å“q©x÷½`bˆ ÷g¡°½ZhèUxiÌ,®•ûa‰ˆcÉ‘PT@JÅM“" Ï7 ‚ZEœaJ8çAàGQˆ ‹{sd@“+(˜ Äàc×P#ÒÒ)ˆDNù!(ŸT_àãý�Zh¥€žz�`¨¤D”p%8Ø04Th¤Ùýwݹ÷Áû--u­â¤ê•E˜…iƒèJå²úÒ]¿¹&¾æûß»ñ~tßï~»å÷¿¿í××ì¹ïÞúÈ ÅXµðÀ–­ý‡D½ºå�øã�×ÿô¿¿wã¯uóõ¿þÉÏþçèÁ}÷ÞqÛO¿óí-·ÝZêìI¥;m7|‹"·ýþ·÷ÞõÇ=;ºëÖ›÷ìØ¦Yxï}÷¼ó’·ßs×�Š¿¿þšÏ_ziß®ÝA±,?®VM­±`˜ †(Š¡�”sSÅ|¢T£RÆ–kU4¤D!,! ³�ã<Žã¥â²?ïHef ýÜ.'°¸zâ¦@²°X“fø“˜-Æ³ÏšÆøØP�«Ç[ˆ4(#€ÐZ€06Lw\¢a„°ÐJj!5S.u"‘ç¶©°Œ!3Ó¶`±2IqD""ˆâ(0 CEžTqèוd@šy #$4æB€p�BdD‚•Ýøc¥Ñýï{çkþðÛŸGõa¢«ÖÇ=JC¨rä®ß\öÅ÷½ýËxÇ?ùþo¾úå_þû—¯üê¿^óÝoî¼åw°2‘@ŠÕÊØÂœè1…DSë BSÇV±´°™²“aÍ·¨‹!Àà!3M(ª#`'¨3ÇtLl*…ŽxAˆ!ÄP#¨VHA¢Ñ€(€4D¢'UÆpú»ƒH Ðh 4„CD �IR±ˆ8gÁÃ{wýÝG?0¼owaïîïýó?�=ô›ã#C¥Ã}?ù÷¯ÜpÙey¡&·ïøùWþ½‡P7hLìÙ}dë–hdèÞk~sí.ûá—ÿù†ÿ¹ìðÖ-wÞð›ß^ñÓ¾ïÛÔÑÖ�°yiR6jÝùì3Ï9ë9矻yŲÍÝÝY3öØn·i¶Ú´·3ß–tÖvwvæ²TÉZq|Ë�·WÊãŸùÄGÓ®uõ/.7¤|íK.žsý¿~µ£è[}›d¢70Ú õ²§<ïç=ã%O{ÎiË×<çì 6v­Èa«r`¤;i�Äd¹xä( ]9{Ýòü…«V=wói l} Ç^¨ýÈB„‚$"€¡"@j.ER+ßó2ŽÛÚ[k�*ÐÀp¨¢Z)€&Šâ ™’rª¤afÚ}zàö4Y…õÃÔOP™béô”œ4³NW0f: <Diƒà/á Ë»–oZ»vÓšuB)BÏì]sFïše‰ÌY+Öž·vSŽš]-­Rj7™°n%ð¢ ÑÓšoI%L 2–“såÉIa¢q£–+¥þ�`¬�¼£#¸ì�<<´÷@y`¸26!¢HÅ\kÉylriŨxx`òБʑ�á]û&¦ ¿Í0‘X\:”¸µLjRB!èêh�|ߤhÓºµÙL2Šýî®öž¶Ö Îñ÷ãu»ZNMR�D4ÆêØ7‘X¦:løD"Û°D#øé·¿—O$_ÿª×ä©j¡�M&t/kɯíèŠKå"9ËÞ´n}oooﺵɖ–ŽU+.xÆÓ;Û»:Ú:W/ï={óé+;»-B×÷®I'’Ф“L$RétVq™´Ü´éŽî·4± U±PLø ?Š"Œi:�U‘бìLçÓ¦«=FBeÄ\Uê}î,õV†G�ìÛ§Ã(ò|óRqrlxp™I¸®iA­r¹L®5W ê¶Cs™Äš=i“l¹í»î¿§::ŒXÈ}O‹˜`Èc¦„DX–úÈ–ªÎžôé¯cÔŒŽú¦É«¦•WóAÈ,ö~ºsÓúñþ÷^ýhß¡”A@BÎÓ®¤ò½`Ê-¹æ?cPiʺO«ÙÏÕ^@‹e&¢Ì­ú�YÝ æ“5·Ër&Ô=âv°G< YUÛcîeš0Ó1¤ÒŠHøcCiÛìÉg×t·“8xå ^pÑÓŸ–I&ölðÇßùúÇßóŽûÈûG·=xzKîôlêœÖÜÆ¤» Òëü3N?gYײ°ê¯2^’�tô,È ¦ÛݵlíÚµkW¯Y½jM*�îêêZ¹reÒq»Z;ÛÒY‡6×.5Sv²^­²(¦”"„„’Ð@ÄÀžßhËç•R{6»²»cë=wùõªí8šsÁ¸Vʲ, ÂxÉ5ÿƒJÓY 3}î´dS&æ–&+úã=�³ÚË!„3KŠgþkæÑfŠ»4É›5“o™•ˆ›Y=_þm‘”Ôç *}-fþñ ü“‚Rh€RBB%µ’‰F-,Næ Ó+I¿"nF¼¸}Û‘¯ýÝ?]zí¥«þá·«½²;6Ðë •óÈoTPŒÂªáÓ ‹}sS "%˜’�� ˜"  ÛÁ©˜J§!é±S=ŽÕŠ*óB¤9 &Æöï‡@Q“´¯è9ãùÏÌl^—Þ´!µvM˪ÕV&·qý9«6žž[Û»þ9žñ’gn؈ "Q¹T*$¨ÉâeÕá­w~ñío½ýß~ðW?sF/Ìæž¿¢÷Ë–w±ë÷×Ývùe·ßzfWϹ™üééìwþþs°ZæµIÔ`XµBáÀ”Åä®Nb¿Œü ,âž”"Š ÿ”éøðJ!   \­ZJ`¨�ŒF'HÅ£Xk ¥R¡ð½è7\sÁó.œœ8ºãö›ê“GyiÈ?r0U¯÷{G%t˜Kˤf­H%¼FÖÄèx‚sìùЫe¸ì´GâVtj§%\mŽ0j”Y¾ ·æ›toìÍvæ–­_“ïl]ÞÑqxûö[®øÕàîÝ[o¿cÛ½÷î¾óÞûn¹õÀ�=úú½B�4j.Šr¶½º+ÈØ¨£Õ]±Ìîìˆ a-‰„2.¥”*b"²Z vX9ªÐgšÚµb¨¥kV¬úão¯×^‚ˆÜ44g€S@*%´– YoÜ’=æ”ûc¨cÒ¤iq&ƒ2!æö9>†�ÎÞÙÜÌü‹L ´Ò�»³˜[Ý4ǵøÄWÓj·¹“1•jª¥IûÄ6&GÇî¹ë®Âð¸Km¿\ÑQX¸îòŸ÷ïØÝb¸­‰t{6ÛÝÞfšf©^mÄ¡2IˆaË .Á” KD!ccŠ1ÁÔ4¨ƒJ*­£(ò}H ÌX†~ï׸¨q¡,VÌÐÅöÀîÇ×€ ŒÁT'»VhŒA�F#Šcš´ÿí«ÿöÞ÷¾ç§>Õ¡4ŸLÂr}òÐÑ 1p$…b‹ãº£�»¥ ;ö¬ÔÚDÀ¢Å¶ H ‚ ÀÐIÛ^ä‘ Ìçr<ãÐê5¯Z±)5 <<Ò·wï=·ßzpÇ¿PRÕõC^(�ÐóK…£{vØöPÿ®=ý»÷ ™1ÌåííBŒ`"áÄ2ÖHçs™ßßt£e›µJ‰ñÈvL)€j:!?Sèv)-ögé̚ÐæŒô8ÕµüÜeøIÜô‰ rB›$hÒ9¿˜ Øc¥UÕü•ïÉŸ�ÜúÑãʱ÷�* =‚€áÐÁý{öïÞ¡™p©›1“kzVt$Ü6×Z•ÍvZ©n+›B†¬¢™€X†m'S†›¸äH 1‘&H´œ´ ‹ ÅÈBÐT ™T“��ŠÒ\ÄR)„ƨ´ðW–))„ÃV ¸Àr†«£»yèÀî-Ûï½sË¡ƒG'Ë•ƒCCGFF'ǪåÒ䨰¬WV¥“ÁÀ‘¯}òŸ{ÙKÿþ†ÓãÎ~ïg_þBNÄk:ZòIclš"€Ž%g‚s!Â(’\ð(†ZSj$ÓÙÖžÎÁ‰Q3icÉtµrçUW�Ûѹ޶»¥\o:çdó«ñwúô[.±}üX €Ò>I¾k@ëé/�à\ e `¨Ps�DÂM'J•ÂG?ñÉü}÷Ý»ã�w íÜ ‹µ5¹‹k"tÚJĵøÌ‘8˜¬¢X•Rj›c‹‰ŽL–bŠ€Q9TiÖZ½iÕ™œÉcæ×j"tšZÃ0Ø·wÏ}[úwí.Æ•RÞ¢] Ç嬣厵ÐßCÑÀXÿ–‡úîÜ2öÐn5Rˆ‡F‡wìÝwȲ³¥%á:, ªµr*áæs™ûî¹=�MÛ&öj%Lð|AüR©ñŸ ¨Ì¢Ff¶ÖÏì·Ÿ¯ïäáv–¦y¡G.&ЙUîNeÎÊâmk̦É�Gr—ϧä?óÂÆ,Æ‘,à�ò®í[€àÙTk*bYš(T‹“¦ 25bis”·Ó+ò]í©VÈPT�d LäX�€¡BP#0Æ”PÓ0m-¨D!* BˆeË„AJ4Òˆ`bP�4¤Hj1`"Ž9SZPˆ¨ÓéiiëÌås‰” pÔð'GÇŽôÞ¿wß�‡vݳ·ïžá½{Ž<ôÀö[nnSâœÎöM–Ù‹Ð*‹œÑݱ®=ŸÂÚ…˜×¼¸î‰0Ja§ñB¤´!•Á5šR:82\hÔ^õæ×UÃúO~ð__¼ôÓqq<)£$;lb3?ÍÙJÇ}Þig<°mÏÝ÷§ J%97Ÿ45ªÇɤ5Ä„ ’kÁb.™Ô"d^Ý+ç2nڢûw÷ ÿ˜ â3Ú»“ ã�K�!3aÔ&ŽC�8ä  zz<ÂP2ÎcáGa¨XH4ÈÚ¹Õ�ËÎ\×¾vN¥â$‹B¢´©d ¥áØdýè°.Ur&¥²¹Hbœ¤±†¡¥T›a´bJjžQ®· �0k·£‰êØöý‡ï{pð�ÝáÈ/†ƒcõÃý¨Z£u¯z¤Ÿ�M´jت-W­J]�M l}èÞko8ôàƒ á/ïìØ°z•_)C[¸>¼w‡b�e)#.c„<Þ½z"_‹æÙ–ìÉ*3S^sì¹qÌb¼ä£¬åmJèÇ/ ¸|:aétêX²Ø™`Ç?J)çŒbŠ‘ÞþÀ½^­˜M%™ Ýd D†R ™r  b �BS ¿ì™’´'ó­NKX ˲ÁZQ¬1�B…µÂc¬TiŒ!È2̤›hiÑ”jÃ0Žå¸Ô¶€I#¥€A“ -ÔÉ£TÊ¡†Ì/ŽF,`qàÚÆšåÝ ŠƒJ9c™m–“ÃFRÁ´‚f™a��%yœ—8‡ˆ!¤W«c ‚B%‹Ìvhg±#åp`1mG*£q»á"/0˜J“ŒØæ³ŸÿÜL.“ÉdÖ¬Zyöiío”ǵŒ“ Bˆ¤@¨Àëíèºýw7AÓm”«±'Õ×íØ-¡‘–Bqa`˜0M‡ î{XÄI D½póå?ùÖg/}ÁæÓÚ!¶ý�Œ…q±0“^(÷B!�!6�µ]�̲•ƒ8ß³ÂnÍ­;ç̳Ÿý̶u«×\p–rŒ E�ä!ÖÊ¥81‰XñÈQ̤ܺà cÈyàûŒEÄ$)… ôBKê4Ä S\'B‘æ + i„áØªy¬X4ƒÐ¹+UžX9‚mÎ`£êµ¼AZB¯.jåvLÖes=–ŒÞò€××ßJ¬M==Q¹¬}†A\+=¸—P8U&®õÔ63‘0%£°dOzP™¯ƒ}&­2“ˆ^ Y²©ÚʪÆóµI.‚ÿlN˜ÏÝá$Û¢Ái&Q¿•rRe�Eb*†(ð|Ça£Þw`wÚµ ”X!7•møÑd¡V‚FìKÌŠBa‡RÇÄ�XÄYcH „ˆ!$ˆZS�h¨¸LòÈéép_p3‘À†í3I© #À4M‹H+#Ó¤€‚2œ 4A 5–@s¨�Ð‚Ø mØTê1[’)‡’!IjP!µÐÕRJœM·J¢Z”&–Á”ÒJ5¥_Ç1‹"F)lš 2?ö½0›myñ ^dš–*VV¶´U‡G»³™ö– 2A%(Gˆ™)Ãp Da*“¼íŽ;û&2Y æ“%R9¾üFK¥„RqÅ"ÀB†ŽV ÁJ鎟ýìwßûîóz{[8OhÉO*fš†eY–e¥R™îeËV¬ìmëêL·¶,[¾2›Îµfr­+W­méèéì]»öìóÝŒP`;±Ð1qû�À5 æ×c¯Áß«V‚ZC3aµ\ó<_ä3^ŠOÉj½—ÊXrÆ�kC"„ð¼°T´�îη$1VaÀ½š¥xÞ1)�y£ê@…yxˆD”4±ðïìéMåZbÍIÒŒaŒ„\˜§ �@±!˜ „ bÁÚÀC¡I‰‰Z® ��s  Eí”K-3RÂIçòÝȲˆå˜ W ¨!‰€Ž ¹�bÓX$1T&RP™ŽiX¦µìÖÖV‹Z cÇŠ”({ €ˆÔÐM¦ ÃB ×Éä0 ¯ó$Õf¤ ¡¥çù¾ÏãZAJˆi g‚3Î"@[[[*‘„\¾ýy/þåW¿µówwµ¨Ãtl„,ƒPÇ€yQ¨ØÎ¸c¥Â¦³Ïl[¾Œ$\�0ÀOŠ®ž‘/�C¦µ&†a˜a¥¤<¶¢èæË~ø¹·½ý®ŸýìÙ+z7¤Òª\ ý:tqW{6—¶ŸrÎéËÚÛëå‚â±aâL6µ¼§#›td£.ª5ÆÝ­íë×mÔ˜x¯Ö‚0’ùT[e¼ ™Ðf:-¶kB¤XŒ€Êå[μà¼5gn^±yãæsÏéZµ:ÝÓ�_µ¼uÅŠTG‡•ÉBË,F¬‚ÈrÐLI� ¢˜hQÄË}É| ¤k C— Å~µÀ¼z:i¥“–ïUâ fiÕi':©í4B5RŽ7Ž/r%ÊÃA˜HéU*A½¦8‡ÎöºŽ%{‚âñé‘*“YƒÞf•„5¥¸›þ²°ß<)a>‡ô81Dx‡ü,2rz”§˜%³&„i©ú�îîèZZÔ�Rû� ‘HnÜpšV¨X)“q£­+Ï çHDD4´_S�°�N ˆ„AµiBJ¥ÖJ) *-µ€PC©cd[2�ËzÚº;ÒÙÌêõº–¯Hd²k6®_³a#2 D©�L0L\jJ‰i)12ù–‰r1š¾=AШ{ @m ɸ�Ü\†CÍ”f\&R™ºä\Íð%ö¹ö#¢”A@ )@m©)W4æ”+‹k3V¦e)�Àß¹mûÏ¿ÙÛ^úª‘�{ëý£AY©Žb¡O'’q;–‘jIŒ Ÿuþ¹Ÿÿ×/KŒC ñŸºjhî�M)%Õ°8Z« þ‡ë®ÿøûÞ{ßu×w rþò•ݦY>rÄ€:“ÏT˜Tl uÿ]wîÞ¶•yõñá�þ¾>°eïž�ûvn¯ŒŽ{ÅÁýïÝoPÆ‘†”›B“û1¯G¬Ò&�=tø¨W®úõzÈ";�X¶a�•Ï%{:Ó��nk>×Ó½ùœóθà‚u›6o>ó¬ó.xÚ³þâÅí«z#&ëõZJ�A!% B15�Ö’E^�W¥¥�PJÉ£Ðkø~ͱ)P2lÔ…R ºê!+, �íܺU†aÖuyûBh Öô%ÿ¬@eºbozjÖܼMSw?ë;ó°ü*BcBÈT§dS¢©zñ´ŠTrJ.éÑs*'Lë‚@¸@ªCˆ!œIÎŒQffáŽMj™UÎ0ÕìšvSs5”ÓÓô¸ ¦´Ø2%ÞC÷ÿ1aÒ¤•4� ØH"¥ÐB. æˆz);U“šA- ’ H-ê@�„PÄ0¬¤…Ac “IœÍ€\Š´år]krݽËz7¬Ü°¹­w•ÛÙ•ë^¹|í¦¶¶v pײ5ùž5±å&—õ´õ.£ jÛȰ¨6 N-m'h2 aÙ¦4 †€´0#21r ˜0(µÖ”R!—",ßÞF\w²ZW ßFÀ PÉHÆ!ó<¬�A-jŠó0æ jrØ�Æ\qÞé6¯9cYç¹��²VêìhuS¦§£’1„T^ XÍÓZËz�ËåúÆŽj“KèiÑ`" <Æ?ˆSJ€â@s ¸RyløŠ~ Ös—(¨ †B(ŠUÍW^ÄAX»éòË®ý¯Ùh�sWu¯ÉehÌ•†Üu+Z !Öæ»â¨±s׃åá¤M’@d‘ÎYЄqT*Ê8 &Á5°Q.îÓ¶‘\ÝI’NšØ¤Äí*0"�ϸÛvܱûÎ;ºÚ²8M|(¹€Vòý‰Ò¾?Ü:¶õÁ�;ïÞºe÷<¸ý¡¸Võ†CÈÚsÏXqæ&Ž�òB1VæÅªL3À‚ !ÃÐÀÁ†©pT‹°À€C"�Š•f:ô#-4¥¦M-Œ €©’€@-½R}lÀ�Q[࣑‰Áí{lD3nRø¾û�£û±ô´l ¤Ð�B‘DB ` 0¥™š—£”�Z(À§ÄžÐzF+ì¬?gnKöØðÍÍ6š MiÚ§2·»~¾ª°ÙŒ€'¥îO �8òm2¤,ôç°b�ùz"ÇÈãgZC-çžç ···cL—~Vj ±B˜IY�¢H(l»V*£-[—!3TÄГ("–²S8•K­ìM®X•[³¾}óæ¶ ›Ò½½¹•½mkÖáÖ´Ó™w—w$–wÐŽœÊZAÕ-0ÁV¹_ðjÃLG{ª³Íʵä{פ—õäV,_¾iCïi§w¬\ag2Ô¶ƒ(rI‚‹8ÒH)Å"ŒBÄb ©! ¬Æa µÝ’®9Ù¨VYm»v-AQ x E X X¨bM± h UÇÙlº­-ŸI' Ðq££xøP_q|Œm›”"løD�l2Åcf9f&“’1{ÏÛþ*‰‰©Ú@˜sA1Áp.-Ë’RbŒÑ´ö�F�Ç Ž Mer\p®4´¬‰‰ ƒ¢”…P~úýï½úòŸŸ¹é´„ã@¥=Ï3\“P„kK$l­½ÉÉÉÁrÂÈt·®€)‰ „¥R)•v�ƒ9•�öC¡Q6ܱg®5�y89vt²4XÕÑú°$l˽wm»÷¾Ñ n˜’¯hË¥\çŽn¸ïλGú‡P-Vߌäøá�Òàhm¢°û¡m÷Þ~ûÝ÷Ýÿà}[ÛÚ»^ñŽw®»à<îZÊÀQè3F<Z0û±ÉØIZQ,¥B˜Ú‰TŽK($P+ c)¸V\j.…B )¢8nø¼XkK$ÇŽìÜö@KGÛ0™K”«¥ñá’a$ãXp&1†�+.€¤ÂRc9%Ã# Vˆùä9ÀRºìO©Ì†¹^M{Mï?kÏGÖGù()™' Q¦F3�@5dúA j€”ŒïÚµ‹‚ "æyAÌ$1Lb™Ä²¨›Êttµ¯\Ó²buª«'ÑÚAÒmF¦�d;h¾ÓîX–ZÖ›é]—^½Nµ¶™l˜Ë¢žnºj9îêbÙ´g™QÒ\£aè  úµA¿R’‘o¨ˆc(•¡¡’¾4“‘©”ÕÑ™Z±"ÑÓåv¶:í™eËÚ{W¯9mcwïÊLK>×Ò–méÈæ;:Vöv®^ÓÚÓ“nïL´µ·®XÞµf­ÓÞžîîZ}æékW Ë1ä‰(Œ¨Ž� çá„�éÈw®XÖ½²§½«=“KÛ®Õ’Ïh%·?°u÷Öû«£c{ØZèφK‰�4”Â@È@ÐB$帢HÆÃ£Ã+º;Aþ峞M‚ÐÖPF�� ‰QÆB„@Äb)åñO죂 K¾«ÀB9cRJBMEéhµÒÞ™/OŽ`æ}ñ£ïÚ½í)§mtöJµš0X2¦ZªØv&ðôäD£X ‘@6´a¨°BZ*©¦( ƒ¨Q1µˆ„b¾Ku«kÕ†‡X¥°¼5…-ÝVð†ÝupÏŽ¼c;P ïÝÕnÑ®l꺟üpèHàqµ8iÔžm1 UŒ›†áû ¥Y"ãú�Æþ½î¸ã®J£ÑzΙÝç�[Ä‹B+iÇ’UjU3ai¤«a=œc  Á5ÀÄà\òXI®T¬…’ h‰JH55GFÌ EZC[ð}Ý{p÷ÖlʬW BFA-‘ ýÐ1m-c/¨péQCI$5” I=%ÀÒZ½!O"P™ÏƒÏìS9¥â(p¢@ä|ÑÀ,¬jzC<&Ðò(³d�"0<�:®ÁÙ€z”5Î.4†SÁ¹_­3ÏójU¯R ªUÄ9 b"T  ”HàtºÀ$g�‰qKÚlom]½&]#“íè]�îê²ZÛ2+–Ù]‰=Öu¬[Ó²by{ïÊŽ+Ú–¯ÈttØé´‘N¹ùl"ŸKµµ¤ÛZ¬tÂLºÐ¥«šïMLŒ ö×*e…@Ç�W,Á{;:!aÝk5 ›" WBh •fQL©D>0Q"᜾vu·›üÌ{ßÂ+ @)Lƒ(­(¥ è©É53oÍG&’¿�8�³¥†�Zq ÜT2AKÊúåw¾V:¸û¢³ÏÌjÄ:ç¤'j~¢½cõÙgÅL'ãÐ}ϲ¬ŒC° ÃzQËXÈHh Ä�E*åX „eä×kã¼V§<éÛ{x÷ƒ†ôê¥yÉ„E€Î§2²á……Â=×_7p`w6Iò-6‹k8erCWX=&JP™Pcž2ኖ´_.Þ|ÛÍÃÕbþô fwgMé‚@ÉXËñ‰‚Æ#ˆ#M�FRAÆ^5´æ’‡2 5gP*-d,8RjT@‹(a”ƒ Ç[¯½®qôðÚ®Ž´EƒJñàžÙ´ËCÏ@(éØ@i-%@µP#}ìÛ…ótÏ;Æ{ÉW¢~núkQÔô½�Ç «NÕ /òD�¢p±p2ßPäæÙ W¦¼:Þò­•€PÅ¡·í�ÒIW Iˆ†qÄ6lD¨ÐÂSZš¶°�RFm”̹4I%pÊIW9VHPMŠ �µiƒ0 <*��c …�†aƒR£68V=:ÒŸèðG ÁØdy`¸0<âJ^©R)¹j.„gh›Ê±˜…Ë‚ Ë0òY3߆³Y˜ÍȤx<òcÛ–Yg,–SPœ,Õªu­`±áÑñ�¡‘‘Ññ‰Éb½îK¥Rµ†!À€ˆhb’°-$„…P>™„aĪêœcaÁüØ“HQÇ�*„™Vcnk$,àš+׮Υ’çlÞ�´­0ðÕšàJk†¡P:–Z"¢°Á‘Ac¢ KPi)I%€bJÆR1%-…ˆbD@*Œ±€ºú±P\C®`°Z±V-T˜ ˆR„1*æÕKã#^±½ ,Wj“õ‰q¿Q ýZ¥Zª”‹žçE,vÓil»CåâH¥i- jg’v:ð¸T)7�8 ccGöíÛµ{|pX1n"Ã1�t"•pR®�píD¶%ŸH¦-˲ Ó¦¦…)PKiœ´-Ç4 P˜h $W16 ±ˆÄ0Æ(&�C,m§e办͛:Ö¬†®…-ªX¼n劫~ö@QÂq4ã@KÁ9!$Œc¡”Ôwh£Gt/ÍfõÃÙNp|�Õ %5&TV¯Ûaø•Ïüí™]FÀZœDÎDµ±}ßáw¼÷ýÅÊoùƒešÉLÂWaÉ+¬¤ŽHÓ¢ÚÀ ÀL[;�ûÊEnÚ†$a=ÂÒ0‰;6Zª”½(T91Cå«2µöŒsG˵rÅ�#Q™(õ´tˆ(<äqd[×ÜrlÄ&5’Jb¤qGK—mÛZ Á„�ƒzåŽûî»æî»FÑæ—ü¥êîyMa7×åœsèÕÃr†@†PÇ€ ” 5Ö(‰€ÂcŒµ–œE" !Á@*[!ê‰në[o¼ihûvGÔ[U <ÀZ‡^ 8@Øš€�&À©� û¥É�•鲱ū’/Ùc©ÌªŸâágõ‹ÿ0æ)}Ñ‹D‚Eêz�jjñðó(3³sÁfÝÓÇÐw:’ƒÇUý�Ò@"´…‰ÑÎÖ¼à )í7<аmÛ�–J%/Š™‚"I‰"„C"bH@Ä0MÛµ,Ç Ä2̤“TŒSHR–“4,Ä�ଂ@”H¶®\¾bãú®5«³Ý]4›Ž(¬+q©ä‘Šø¬Q�êe¿Zô‹ÅÊÈÈh_ßhß‘Úð˜W¨FÇÇG'Žî?t¨ohh¨4>6ê…�Áí<°m{yx¬>YªNLˆ °°IL*¡SqÄ�ÆJB4Ä! DaƒB‚…RS5„^èAŠìt2†².CacmÒ˜€šŒ„•e’t:ÝÝe´µ¶¬X¶æ¬Ó ‘™L'RIWsvÛ5×Ä^�b•”£!šb¶f(�]~Di .µ†DÌ@Ä3غÿ×7Ê¡±5é¼É0�µP=pàðßü¿ÏZ+�ÌtÝe&JB+7­ì1’9Q°‘D4á3�Îu*hpO€@gPÊbF§±¢¶‘lÏvOLÖîß¶¿Ä@Ù{˵W¾ç}/ü«w«1ç�šçÕÐÆ¦…m(–ÄJgµi—¼¨ n8•øÈªk:Öˆ�“–;–í£wåªM^°îÙO?ﵯyÇÿûü :“7Òyêf!²\'ãâ£Î¡iCjImì¦�e¤¹d±#B…ˆ(@¥–žïRÓ±“Ž“,*&@–�{î¾w¢ooá衎´Sâõš“H  ‰‚@¬OX>ßå%{„ 2_¿È\Beîøú™I³¦mös%x›{Þyº)åͱp)Ȧò2QfýKÊ©1SB †Z5êUÁY¥TÔZ¦3ÉF£ùÁÔuRr%€ˆPH©ÆP!©A Ó´�d"�Mev‚b(5HØ " „�"j(B°m׎)L#¶¨HX:낌›ìiÏ­êÉt·Ù×r­l2™°m$Š@E�4‘v´…2„, �ر·8:Ž4Q\�,N ÷UµÀ M,Si„* mÃlɦ-ÃJk­-Ë2McJ© JCL°AbjÀ(F èˆ1&ÄZ´û #›j¨¨È6©ëÇ®ÛÖÓ³lízè$B©*Qk�oo£–i¤­5ÿõ¯þû=wÞ%CB%Ã(DAù\õâGQpÚt1„ ¢„ˆ¸SÌ QªV,\󃟽|µÃAk*…|´Ryï§>½ö©O9´ßo®¸be>Ÿ·lÍCÓŽKM¢�NPšµÍc!Ë�dµ¶w®è^½ŽØ©bÍ£v‚&S�g=홥8êýÌg?o¶´ß¤ÿ9¯}CrŪ¡ÁaEh*•$%mÇ&FÆM‡õЫÌWçý““N{»pÜþj½±oÚ}ÕZ�ãš©|ÛæMg:Ä8óŒ3.~í«»6¬-SÊRéÏ~íëuŽhbֽд�¡ÉZ8\¬MVƒ¡ÉšËX¡€kEÀc?ò‹ ÒHC*KjS $—*†�08<::8Œ¢8ªUA÷ï?€?ÜwPMÍÖ@#ª�R%�I­çl°„(2PÁ7eãgÁÉôƒsÀ¦#›YEÆ"ŒðÜ_J«™'`â’3¥$g–Ì÷Å>–|;>Çe˜™»-ë,f›Õ±µB@C­J)ιbJÁ[-”œ 9cZ))� Q*°J�‡u×4ãcC–•`B‰„m˜cÛq8À™šØi+“¤) L&` `)à12uê±np"«ÌE)Ž„ib+Á$b 1¥55C�bHb„=¡j@OòXºFì•6«ˆ¹D¦»U¥Íæ8OÍ‹ƒÈqiKÊ‘Q=aj ²6ò†F~)!ý'‡8­—]¿ž”u—W;,`Å>]ùLÂ&RÄÈ!(aHÅ k\Š(�,håYvI‚‚eDF…,@ÙŽÙÚN2-±k›--ÀJ¤ÛºQ®%JØEÅ™aàÎVœLæÛº“™vídP¾ ¥3‘Òš8RÀt:­m“¥‘u)ûYgnúá÷þ³8: ÔZ+LÃR`ŒÕô]¡4PèSKÃB§¦l»91:V¤¦nQ ¥Æ ,H Êo |é3oµœÖtk5à;‡'÷Õýç½þM§]p!âo?ùñÍ«Wæl£^ÇDs¨�aJdÑ” êcÅs”GÆŠÐÓa¯]Õ/£!Ä'\<@Ô®z/ë L»"Ð;ÿé_2ç=åÕÿ̧þã[O¹øe‘Ð};÷ljïvË�1îYÕ¹ª[nËiçm©?8æ½ìß¹øcû²�^ú¦�ýÛ?ô¹7|üKøóåìò=±mpbÛþý»öì01PÕ†+Ìœ&cØ0þê#yÕ>ø”×¾±–ë¼g¬Ò}ÑóÞü¥/½ýkßxõ—¾öš/ÿçú—¾e"$"2 �çÒ>àUŽÀ†0¸m)ÛÆ–R%¯¦”šOT ­gløË�|àÅïý ^¶ùŽ-û�¼ ¡A‚þ£»„ŒcÜ÷ã(`q Y$ª†@1J´dgÐ*­¸ÐBC�´T3ó�y•¥Øã *RÉif~Fï jÊ 4-÷š2ÕD5LÍWô5ß1O)ãÙ¼ØãT  ¿zâÙ¥_N]^JéT[èôãSŸç#ÀY¸ßž8ð b–J%ÅSÝõ¶a†!Jh©¤‚ÇQè# ¨I�fÊ¥¶òxt² 0äZI 4ÂJ Îc¥¥”D)µmÛÂVÔ"/Ô\éH±Z(ëQ’:¦åZ¶+„ÂÔðâ˜#¤m#·bYGïj#“Ítt%2Y?ˆLÓQ ¥")ÜGH¥v*•´,ë3§…A±ÖRkI[ 7ۖϵ¶æ»:rmÉÖV+“Êõtu­éÍvw¶¯Zž_Ö;à"ÓÖÖ³jE"—³.vÌL[[OoïŠõë;Öö¶¶¶§’9j8†éZ–�‘R¡ÐXA¢ÅIJ,Û¶©E‰AÛÛÛ/»ìBjYS7'Á(…æYÀGN®œ |:ñC €Â@ÆQ$Y¤€š,‡'Çk{ïì;(ÛÛÎ{Ù_>ÿ ¯Ê+^¦Ó‰/ýç7{ºÛ…’ud²¼ÖH‘É9�|B!R¢(δµõ¬]wïî]7nypµ~(d÷Ž�=ó­oyõ'>lmZõ‚÷¼ÙÌ¥@¶ó-«×­—ÏVdpǾ.3Adˆd $kÔê[ØþÚ7¿õE¯ó§ÿñËþÇÏgׯ‹mÛ^µ¢ýÌÓÓkÖÐÞU­Öþõg.½ä£ëZ½~¢\9÷)OIµd‹‰Ö¾B7ÅF-™ÜƵÙMkßøé�üõßò™¯~O8¤£Õ]Ñ-“‰•O¹�ô,ïóãþJ½çŒÓßò¡ù¶¹¯8V`aƒG!£…á˜Çn:u´€¦Z²ÝË_ùÖ·¿ù�ï»å–»ìëî;š6`X)�2ˆ¯c¦Xœ0mé3Hk!Tlª¢�Rª”bœC!Òbêx¼@fIå剕‡%#OLœ;NxVw}Óq³ú]S͵xDYüd—?á�îÌ|1"‚ Ád ³§d´ÖB%"ظox`Aèº.BSéÔ÷‚J¥Â¹¤”º¶c¦mZ™TÚ4)¥À•«F+“�äÐ@HD01pÈB%ç1g±”B EQ„QF>ׂðH èl”½ÊDmèÐP±V™(M„@!“‚PšI)ÇäØÀ‰´“oC¶£©i˜¶iš­-y?jÄ"DTBˆ­‘©½Øo„�„ÀI&2ù 6pÌ£J­ÌXdš´µ£=ÛÞšÊç cZ™$M$h&\“¦SÒ4ZJÓ”&� .^- * ¯\¯…RV^#Œ8B$•6²yËÎPÃAÄ4í„í¤”Æ¡±€ë€«H@® À–a˜¦‰P¦ÓÉ;vüöÚkã H%’aJ% &ûxÁþˆqj �ZNqÅi¿^H›‰¢4ÓÖ–ìêºòÎ;_þÞ÷½åÿ}áé¯yã9q13 ÒÖþÐþý‹+ ¯2?ˆ;Z{L줒y Nñ¾�~’ÍLÆÑ˜ U½ko¿gåYç_ú�o½þCŸzÑ;Þ{É?|éŒW¾š·æ×?㙤1Œ*ŠÒ¶ ê�ÊÈ0äa9˜(…Eš"V{îï¾ñwå2áX »Ëlo-˜J4x$MÂS¦ ªUˆIfùª—½ùͯ}ë[Ž=úÃï|— ¤p9s˜L€\¦FU˜2A‹»sÂ4C€I"-HKds½ý’»FLJ…*aƒ._þö¿ûL�âÁZ±ÎjÑd>‘Ì%еBkKvh`øå/|ñë_óú7¾é­í­kþù¿VœØwßÖ¾î·e£0¼Ê¢E¨…ˆ˜k& ä�Ò¦‰XI.€:–ŠÇ„@„ˆ�A3Ø%{܉úYy-¥•TrnD2+¿4‹\96y¢éC�=þX!Ê©Æ+O@óã´„sÓ…-š*†Q aä×ëwÝqg£^OØN±XƘF\DŒ›Ž›Êæ\×åœK¡•�Š ÉcÇBr©…4¨‰ó�µF•K&�¤–B()¡" RPIÉ600¼ÿ@_¥êg[;ºV¬63-f¶eÅæ3ŒL[É#ƒ#…RݶÒ™u –•ÆÄ bU ÉdH*e·äCr]íVK*F‚•hK[Ù„²h¶§ÃiÍÚ-’LHÓH¶µt,ïi]Öᶤ8P^U�Éb¡ÒðJ^½‡‹Â˜M–Ëåz£ìûõ�ilPÃi4|q&2©EuÏ B&âQÃ%v’Ø)l»Ð´¥q$“HC"¬ÑÐ0Œ©H…Z”1ÖÓÓsË-·ÄQ0Á*­f”+ Õ£ù”�ßoj*Û9UZø¾›L%…Ø–%!4Ò™K¿ðÅ_ßtë¹Ï¿¸Ê0ȵ;Ùvˆ ÄW\qõ7/ûåšsŸ>㣠x È†Ý] nÝ{ôþÁâËßÿ‰½õøH >ò�_ùË¿zϳ_õÚç¾ñ-«ÏyÊÆg]tþs/Þtî3$ƒ–›¥¡ÀA´çÎÛÝ{�+ïÛW=ÔwøÞ{’HU'‡igÃÆ5ã…‰RyòÊËúËËú««.ÿÑ÷¿uÃÕW}èC±V0Ö÷[Ô6´â�áÁ¾_\ù‹£ƒ·ÜrËÇ>ô! àšÚ.±l_K§½ÍnÏÖd ,LKa¢êUˤ¾ï�¤M—w]|É_]·åÞý£cýð»ßo`J¨VŽý#�È7 rp÷žs×®»èüóÖ··õæ²/¸à·]uÃß|I¥¯Uå#GLî÷m¿�M!ƒ jD*Y ¤AÈTV‹b‘æœOOyš™îÒ�u!Æ’5•¦˜1­åuªÁÁÌêá¦é¯GYÍuª®üIÅ×�ÀµÌ¸°Rq)КÔÑÑ� .L–4@Œ+¥€T*$$ôüPiȃj©â€¥Ml˜¦­€.• Q^#Ž#Ó2”årÙ ü(–�UkÞädill²XªT+^¡Tî\¾êÅ/å_½÷}/{Ó›^òÆ7¼þƒxõ»/9ûùÏ9÷™ÏzÍÛÞöü¿xi‰Ñ�QÂ�?^¤¡ÀL4 Ri90“U™ŒH&qK¦Ò$›Kvw¦—õØííFk‹ÙÞŠ³9³%gä[ìÖ+Ÿ#i—ÄW²X®Tëµ 8“!„R „¹®‹)A”h bBE02 ¢¦4DÄ ¶�-%‰&4,…i$u#޽(ŽX̘€\"©5‚s-ÆÐ4MÛqlDzm“±ˆ…¡`j€ šÑY¢æüò(¡ Ž›BÊ0&#Œµ†‚ËL&çfóØI&ò­"ì` 5R†Ù¶êüç¿ìoþéAnX±i[9^ÿ¯øäO¯øà¿ü§±ñÜÜi¼çÒ/(7“ë\¾f㡊K¥q`›@20VØëÝïºèâ_ÿýüïŸüóßúý�}ôêþÒ=—ÿì´¶–ÓWôØŠŒèNd{ìduÿ�Ý7Ý|è7¾õ¦kþë›ÿö¡÷åýïýö§?ñ£Ï_ú‹¯þó¯¿ù¯—ÿÛ®ýïo|÷_?ÿÙO|Ð1ðÚµ«Ï9ÿ‚Á�aÍ… |Çõr‰BkT i×¢šƒrÁ<¢+“õÁ>ÇT!¯I“½ì=oþÕ ×._¾{ñÅç?Ëhˆ•m]†a®kÚ©JµÑ¨y '\ã¸O[¾üì¶Ü%/yéW_ýÅOþ]G¦ý¡ûªOV'ú†âR-ª•c¯š4±ˆQñ†6Âj€5€ZMS\K³Wþ” 2—�Ÿ«Ù4Í53cÖ´Æi1ózg s�â¸ßSÅŒ?ÆÌ@ƒÇûì´Œqdžå\ôÂ%Ó™Á‘Qj:\#j%"¥Z£P© �M+Õb±\(”Êåªd2�H€âˆq¦X$½ºÇb|b²pdßÑÉjµ\óûÇ µXbúBU‚ÈH¤Î}ú3Þð¶¿zùß°æŒÓPÂÅ©´¶�zxR¹­mùîn�ÈÚ3Ïyã[Þ16Z8º¿G*!‘ðB(U£á�–«CÕúD,öMb7)“9ÚÚ“è\%í|9ÂÊN;íÝ �B�{a)Œ€ã©´²ìB£qxtD!€)¡†… !Ô*¥Â~½Á¢˜sɸÔ{qXiÔ#Á4¢ÀrdÂ6ò9;Û0\ &j«Ç<Ð*€:,äqÇAà…¡ÏxÄX†>cєƗcÛŽãL øÕWb¨µTðX¨~Z࣊TÀ±ê½ã(Zj-¡VŠqÅ9‚@ÅFá2é¸qP‡H2¿¦£Z<1¤cÚ›Œ'dµžNµ0!ßù‘�¾æ’÷ü¿¯|õ¬üE,$NçÂ/~Õ+ÝDI $'"r�¢0nɘqiH5Š(ô€W»òûß}êÚ O_»Î üMÝm§/kowñézÑ5æüÀJg!ZÁµ+{Ÿó” –e“nZûÊ /<¿³ÓŸ˜|àþ±­÷ Ý{ç®®Ýö›+·ÿîjo ïâg?+ôƒR­ñê׿áœóϹáÆkÕ"¨$ˆ6 äILõõ¯ï³ÿ_ŸûûÏäýóæ7üí‡ß{Ûï~c;㈇ã&b×ýìÇÔ¼èÌóhƒˆQ,{YuëµPÅ4œÆzl‚KY¬Î9}c†wÞÿ °2÷mÝ=Ò?Ñ«—í±U½‰•@DXˆ¤å˜˜ð ÒBB¡$ç@*J1ZDGä’=. 2³škzDüt×\xhÂ�€EÅ4Máá‘�Z™U¬µð¨®?}€2·Îm*ñ~üË´ BBÉZ­†©¹jõzjØ}Gû+ ïÈàpÿȸ€¨­kÙêõÚ:;ÓÙ 5 ¿î��ŒÕ+ÞÄXqtxbl¬°wÏáÆ&«ÅJPõy¶sù3/zéK_û¦W¾åm¿ö /yÝ_É»ßþþ¾ò­oßxáSœövi’p4ÅA %S‰d6�kÔ= €ÈH$^þÚ×îØµ[0>pèpab|Ï®�{hÄ šnŒèXÕߺ·o¨ä•ÝàV(Ýj€J ]õåÐdy_ß@ÿÈÄx©V(7Ž ��MV½€KSS#T"b1grª PJm:¶i[Ôµ­9;ŸÉõtf{:’m-fkÞîlEm-îŠ.˜KTYT  Q X#ÅAŠ … Ô*Œ£ ð¤äÎŒ5BP(ÞÞѪµ¾òÊ+ã”Rç|úS˜ú<ÕòöÄeTZ+…¤BAÍ€æTÅDÅ R#£f­ FIi¤¾ÿÁƾ-zhoußƒßøÌG¯üϯ ú8ŠªEPú7_ý‹Ë¿ò¥·þîw?ýî¶[®Üv× ?þÎ7ÿö£×~ýß¶_û«Ÿ}éó—¾ãÍ;w�)CïÈÞúÑ} ZÀ,0— S8ÐÈ™Âà8�+qm¨R( QL&œØ´ONbëõtKÞgQT©÷äò§¯\uþº�g¯[³®»ýœµ«Þøâž·rÕ+Wj¦ Ù(V:º»^òÒ‹ôßߢ~Ù÷ÿó}—¼õçÿñïŸ~×;ÿãØúëߌl¹ß¬×6¶´>kæ5Éì\ú÷{ÃëªûwÓÊø|îo]üâûÿuåOüŠ—½|Ùò•åR#ådc_J�‰•4̤â¨6Qw€ÝžÈ7‚Ò�ÁÃ/}û[¾ö‹+ÿúsÿ¨�lß¡ÁáCÃÝù»Ë¾þ�/~úà½7�ò8áŒW*&c¤PzªIB 1ýS�86i UÿH#Bfõ”Ì^Òôë3³Ü¥ióJÓ c¾™+‹G”''x,†¼yX'ÆU₾ï:n:›•RŸqÁ…Ét˶�»¸�N*ýòW½úŸøäÅ/{ùK^ú²W¼öõ¯yÓ›_õÊWoذ¡Ñð E¯î…+ÊË/záKÞüæK>ö©¿ÿø§.}ë;ß³ñŒsÚ—­ìê]“éêqóy»¥ÅÎfp* LƒAÈ¡æ@E’Û–m`ʼDÌÂf.×㘸‰ugœÑÒÞ6Y,¸©ä¾ƒûvîÞÕÙÝõ®÷¼çÍïùë—½ê5¯}Ã[,7}tpbûžCwÝûÐÞƒC£•�{úöìByú™ç¬\µÖ2~ÀÊ劔#Skˆ-Ù†„RâfR]�íí�éL&ßÖêfÓéÖlª=A…’¶“KsŠ K"ªWÆ#o"hŒT‹ÅF�)­1 XìEa(¢P°€Ç! ýȯ{õ •–h ”œ…Q„®ë*¥Òét*•ÒZÇq,„0MècÆtúë‘%cO «å±û(z:¨ûåb}t`¬¿¯2p$,ŒéZùà­·ýë?ø™·¼ñòý§ÿùÂ¥_ùðû¿ÿ¹¿³«åám÷|ã>õí/]úO{ß?~ð]ý÷߉KÃGîþCqïý;n½îÊïü{­o׆|Ò;²ÿîßüªvx'ç^sõ/>ÿÿ®øÖ7úw<$ÊÅg_xA¹P¨x~¨Åd¹ÈdÈ"¿41I ÁbmYgº^©m\»9…W X$ ÇŒq A Áya|¢^­ú�ú`ÿQ*`qx¯GÏ|öEë7ž2+ÇÞòö7üç·¾¦XD•ôÇFˇoêèzúºM- ¶#Ú›Ìuû•>Ë.{Ý›>üòWa¿þì ÎuL:66zÿö‡zV®ìîY>9^Ôbj9nŠI$4…Èâ ø Qãþh½ü´—^¹vd™Ÿø‡ÏŸwþ5Am²>xhüÀ޼孝xÞÓ¿ýå/ÞþÛy¥ ¤Šƒ0Ž"!%* �"„L{›©Ž­—‚•ÇT¦»Ff實[Iš ÝÏY?5ìd&6àã6kØ×¬Œ‚hz›‘‰>áÏ…™‰…&?Α»Ÿù”¹sPæ6µL§ØÕÃÐu|ÓÓ ¦4�H­� HÐ☤””šKuL M(sÁ9 ŒB­¥”\A�ñ±ˆ1ŽÔ”š ¢—¿áÝó¾O¿ííï{Ï{?¸þôÓ”–"0ÓHµžÿœ¿ó£ŸyÓû>òWúÌ+ßüž÷|øïßùáO?÷e¯[¶ù ”ÉÁdR�@Å<€P+.„b@d#,6 „c¦}ßAŠP6ÊÖªZµ ý�p B�ÅMëMó>š²%бÞpás_ó®�áÖÕ1viG[Ïëßóñ¿ùÀÇ>òº7½yýiçœ÷´‹6œõôóžñ³_óº·|ê“O½ø¥Ïj$a°Ö|w6ßÞ²lÅŠ³Î²r-Ù®e½›ÏZ¶vS¦µ[a;™í°Ó­ ÝV Áþ¡âPÉoh»¢ÍIìzÉ–z*;æk@Ò§�ö”3Ï}Æiç>½ÁÔ=[¸÷ÁKµZ¹\¯=Åa©X)” 92>:Q¯(ãØ�`†QR!×#¿L1°EB)C¿ D¤Ã8ª{àÉRYA(µR@*À5`p„ÖRJÍ™Ž¥b‚K3V—q@�y£€•‚‘~G d~,÷Î×}îͯ¾öûÿ™‘þy«Wt¹™µ¹Þåî²3»6œÑµòü5+×·dÖfìÍ-ɳ—µmjÏ­mmY�o]•i]›i?»gmg¢qÕ•k}êºM›R-®_o+áW†3–8ºý®]üÝS7­~ɳŸš¦Ö²ì²\²Çµ:·=™Ì')„�…Í‘‰‰’ïs zZÛ]¦h=p¥lÁf£Xœeª…q>ÕÑjwÖGbÙ²Ÿ±vuµ0’Ì9Ô!Wüògžqš#ñæ•kVv·�»yí¹ׯëéN£:Yt“Nƒ5&jc¦-ucäìeé‹N_÷´õkO_½FÄ~°³–wW&ÇvoßÕÕуSi严j# $àD€h"„ðc_ÃäúÞ w\ÿë»o¼üúŸ|íº~mÏ�¿/îÛ=º¯Ÿ�Õ{­–7=ëiçå“Gï¼þНÿã§ßöš¯ýõ[>÷ÖW]÷í¯ˆÑ#€Õ�æ1�™–š)p Pä5 ”LñˆG¨%)°Ç½úkîjkÎã¤uV‹ËØf·+>>2ø3§l->NÒÓï<¬›ùðÓ„J©´VR*1¥� 5ãQù€´ï7Â8"!„ J0€J J¨c;¦i¨X*¨)÷üg=ÕmÉD€3 ¡I�¤­TFZYÙD*Ÿ13.N9‰ÖLzYƒ"–¡ÂÚp(±($PAÅÃJQ¨MÓ°7ª”úöí>´{gixKi`\{ðŽ;n¿é¦‡î»·21žÎf!T(7e -—¯]-µØ¤/å¸ï¹ä]H„a¹hHmBl •rgŸyÖëßôúç¾ð9ñ²¾è/_xá3.$šÌ_¶i͹O;¿èW÷ ö —&‡‹cÅRÿd±olòH±|´\;T*í½çÀþ{öî}àÀ¡ö5k_{É{.ùø'/ùØÇßñÉÏ\òñO¼çŸ|Ï'?ó¡O~æ�ýþ§¿à¥ç?ã¹/~ÕëßÿéK?ú…|Ó{ßÑ+_¿òô³« –0‘Y¾îŒ žõüg¾ð%10GKý#¡­‰¢?2R =Q¨ÞÿÐÎb¹þ¾LbS#„(TÚp\(�‚¨îùù–ö0 ÁÊRÓ‰J¤Ð0Ƹ”ÅÒ€U«‘׸þê«>ö‘ßvãµ*m­PµÒ @«M>ûη�l¿ç/Î=ã…眽¹½ý¬å«Ü˜=çÌ3^páy矱aͲöœKMÍå3 Ç"JD‚„M-ƒXMÙ®E0 ¸äa$¹ æRÙL"­„¶M'ªùT¦3×n!¢C6Ñ?t÷-·‡‡Ï^¿þY^ðâg?ûÏzöÙ›6=åüóNÛ°öùÏ~Öêu«:»ÛÛ{:z–w¯\»bõ†5fÂŒUÜÌéÈv®ïÝxáÙg>ó)¨=Óvæ†uÏ}ZËéë²ë{a­ùAWGGax)%ëZÖå$l¥”å:£…‰B¥Z £@ér=´¬,%.÷D‚&å¤h*kfJź€vÕó®ÆjÕ-»v¦»:dÊ -cÐ«Ç Ç3ñ(F%+hù´g=íâ¿èà®]ÞüÇúàÈàþA‹bÅB×4Vtt¬ëìÙÐݽ*ÛR+mvn¹÷u/}ɦöÎòà ‰ |�4D(‘J%ê• Цæ…ÿ�ʬH夑~ÓŠ—Å—u�$ó0ó3…ôW .FåtŽôrS™t Æ ”Ð@ ņE"DçÅ�ûÔó³mkÎ9ý¼=ö´ô<ãìžg\°ö9OÇùÌš�ë[éÛËæõëžöÔóclß±óÝï¾$•IŽãd²ÊtŒ\žfÚª‘›h$ÕAPW^•×Ë ›‰ˆƒr#ÂN %’n[{÷¦�VgÈ¥+{Î{ñE=g�Öû´ó6>çéO}ÅÅ/zÇ›ÙÄþÝ;»œD ×d¢ºÒÍ䨕MºÉdÒ4M¤¤ôCHGʼÆi.Öt´v$�U-¹¿|êÓžºvݧÞõîhb"A©4°…êµ �*ã&©†<Ž@K®ÿ‰•ú®Ýzd�äb*»šÆ.�!mÞZNÈ›¤Õ¼ufGÕ´L¤R@@B( ¸Œ¸=¯jÛA%E\˜-Ž�YB)‹(E®ëØ&EÇ“kR1ˆD*–~ûZK% @i9ThÇ^û\ÆkÓ"ÈÐ1" ÖtìH!VÇGÆ�:¸sÛàá¥É‘Zi²§µå¼3N[ÙÑÊêÙ¨uµdÎ;}ãÚ•=Ù„å ­YÐb›aµ´cë½[ï¸më]·?xϽ§�¶ùÌ Îݰný}·ÝzãÕW_õÃËî¾þú{®¼bï½[r†‚ðžÛo“±§UP)�þ·Ýwç5—ÿô殹þ7W^~ù�Æ'G_üšW�vÖ­ím7n¼øâ‹_ÿ†7½é]—¼åÝ—¼ûC|ïG?ò¼¿8×Ý (¡†%•j>ãQb¹Ç V"d“œ$ì ŽL¦$1$µ¥kœIÛ�–ës-[QóÙñ’wÿõß<ó¹/øð‡?ö™¿ýìG>ü‰w¿ã�xï{ ÛLº.ÅšÅ"bBˆXkM� %¥V–ëh„PÓ?<ý)3.‹0„ÿõ�¯ßtã &Æ=í›×¯Ù°y�ãRÕA­øÞ—½äšo|Å)¿üüÍõ�}IuºŽ®6Z‰Ón:6S¶Ö²VA�—ÐÀ‚šJ…×!CB!%u#¡Lˆ‰†P((àk` Œ!bŒ…~ ¥&ˆ & ÄJæÇ�¤á$ ·-×¢…¦€„õ ö"-‘m$065Dµ†wèÈà¡£ýîØq×–î}ðÁCƒÃccúÚ·ÿŽ?ÜvÕ/¯øÝõ7ìß¿_”hk-26y¸%»lý:ô-b橨áŸ}öÙÏxêS^óê—¶·æ‹“…§=ý™kO?³}Uo×úÍ›Ÿþ¬tϪöÞ kÎ<×ÌuúÀVÊîìn[µªmÍêεk7]pÁª3N_yÚÆU›7’T¢{ͪ՛Ö÷n\# 5Y/�7J#•ÉñFéŽÛo;¼w7,×Û$ÎxŒWl©…çcJ,Ë¢”RLç6�ÆE½ž3LU­ÀJù�Ï» ßùÒ—@£æ¦Lµa›’3¤´Œ˜�É«ò„‚Ê4w2_t2W)r.0��Ð�q*i:.U" ÂZabÔ´i5Õ’“°ŸñÜg­^³jÃÆ5¹–ô¡ÝÛn¾á×w^ÿ›ýÜ ƒjÚiª2D{•‚‰TìÕ$ ¶©ç\ò°äÁLDÑZ" lƒÞpÍoú|ÙKÿRr¡¥ªWª?úÙ�_ùê—¬?þ®·ŸÞ‘»°wEo&Q:’°-Ë2¼zÃ5“TÖ`&5mÓ"Bš¸ÔJPKÈ®be"“hL4¶°I4V±4‰iÛ®ŠK-`Œq!†n:“Êæ^`$ !j;"ˆMbZ†� bѽbuK{7×8™j‰bņÔQÈ4œ 1SX›A¬& åªDðjà�•즠¹ûžm×üò×mÙö8dÕF¨°181Y¬ÖN²»£Û0¬Ãƒmío|ÍöìÜÅ£xãúMQÌ“­íéΔ˴m\wî ŸŸZ¾bÙ™§ulÞxÚsžqÚ³Ÿž[ÝÛ¶zUçÚÕ†ÔµMÇݳwÿØØØ¾‡Ú¿sÇﯻv| |èha¨àо}Û ªÕœ�hµê…I³˜:RS©«õ:ÄȲÝ\¾Å²,Š � †£’»@Õ‡úŸ¾qÓUÿýƒë/ÿ‰`>�ic #ÕJ-¹þÇTN˜Ø8ºi‘ûï»øïã4˜kñS,ç…:¦Ô¶›¶ï ¥”Jr…€@$�ke ¢»nþý/~øß–RÏ>ÿüötª:>zpçöï½{ÿöícG�Ö' Ã}{÷öíÝ3Ú´Q,Ž>ºãžûî»í¶wß¹ûþ­Ûï¹û¶®ÿõÏzùÿàŠË.»ëúë>ôàÈá¾áƒûvm¹ï¾[o½í†î¼é·GwíDžßBŒeéÌÆÎ®Uù|“œk§-ƒùž_.΢z}rhHÔÞDaâh¿76á�OÖFÆT¥n4¢ê‘ÁÚÑ¡â�ÃÕâTß»uûÄèDToØ&‰¶5_–O¯êìÈ$ÜÖLNò±xâð¡_~ÿ») HÄL ¨®Æ²Úô$sb$5¿-•nMX$ ≮ÕM¿!'&ÃÑÁhlÐ¥{üÃïnùÅÏ®úî·ñ�oþáÊËߎ=Ð(  Lu\ì»íª_^÷Ãl½þ×»n»åÎ_ÿ꾯Øñà¾ûïºòGßÿù¾óûßüòÒ�èëÿò¥ë¯úÅ¿ó­Ÿï[?úÁ·~ü½ÿüÅ�¾»ãþ»¼Âðá][o»öŠïýË¿ÿå/l¹ñR+f0‡aÍ¡š(#X�xË!Ð±Ò ­ â0è?Ò÷æ7¾I0!š˜(h�1ƯzÅËwÞ~«(Mž¿¦×Œ#¬µÔJK@ÃãJaê¡mØœK!5EÔX0­K(²l+Íb 4ÅÈ’ M#á:)0×hª“; TbU C3•b`Ó ™äA˵Ɖd°¤ 6uN&'4ÈôÂØ0„:š˜–“q“-n²…»5ÓšMd[²­±ÇDÄWu®,�•´/Z[ÚÆ&'"©¶ïÝk%SB¡ ›N÷¼Ð¡‰Òx©Ü·{×ÄÀ•ÒBøAαWwv®îîêíì\¿båÊŽv ‚‰�þ�ûë…IÈâî|®«5·,ߺ²­}e[{Þ2 ÆãÁdÙˆ9 cÄ lø¥êDÿ@\m(?Ta¤ý�„Ì– «IÒ,¤|²šàÔP�Ãbµ26^ó+Uéûa©ì�ŒG£ãºZv#aOŽ%4·¢ Â^-¥D8>rtÇCw^uåž;oßs×÷\{Õ®þåÐöÊ{wïúí�Û®¿nÏÍ·ìûã­÷\{Ͷ›oò†Ó@ö$œ3W¯ZÓÙªüº‹•,a¢\ÆÂ_·nyÊ&=­éÕ�­I L¿6¹ï>üÁoÿë¾ñ¥Ï~õ‹—9° ªj€RZˆ§&v̸•Ô J>6Ôo”Ça£Ñ˜œ(æZÚ¢ŸùÔßê0þåÿ÷3Ï<£1<ª½!C¢‰£°©‰ÆÌ¶ÝF­žp\¥4"Á–TAŠ aaC ¥4ÑÀT’B`fBCÊ$Ô†„j¸Ù¬™Np ^m¼ZB®E-[H-!²“) Q¬ €ÔLf+qÀ ¬4<ˆÉ”ˆœiØ@ ©“HK©¤PB¤F Bˆ¢]«V?ã9Ï›˜Ìå[GÆF­TŠQœYÖ}xtÔIg´Vö¬AÙÈ选¶|K¹\,– ˆÓÆU¿ê¦ÛÄ€ÅÁÁƒ÷ßd÷®±Ã}µ±QBÈY­PhI¦MˆË6ˆ™Ëdx¨†­‰dg6Ÿv”ÒXËi ¡ªçb$¨C”\q. 1¦¦cSÓÂOLŽ»I‡óXDoÔÖ-ëÔ~1F€”@"JK%¡A—tZžP™Ýb¢Õâ9‰¦ëúSM[5A—é°éq¨þz˜ 9±ðlîó=qÖ ›¡�à”¨”ä�ç…õº C JWuuå“)æyD)£Œ“0‚B8†ášÖŠ˜q“mÙ–L2ÕÝÖaœM&r©´¡�±E‰cm¹lK2™r�”mgn.•Ì¥Si×±Lj›ÖJD!ƒØ•jy|²11Y/�N�ú•JT÷D&,DXÍÓAŒ¹ŠËu¿P–U�•jÊ [l×/”½‰RA¡BÀÖ‹Å´a–G‡½âder<¨5ª…Òøè„L„aÆr6¯ê5„´a~8:2®%@b —µwÕ‹e,u6‘ ¼FE’ ¼›HSKÖ=V¯«À�g( ã�û\~et¤<62~ðж;ïzàŽ;Æ�¡QÜ›o9cÙ²5¹–<ħuw=ó´Ó×uv®li9suow.…â0‰QÊ0Z“nƶm mŠ3 §«=ïX4™rlPw·äò Çú™çžã ½¬5—±éÿ|ï;>°!€„S5p3«5€@µä�×èìh·m»X(„5Ä�]=ëV®ùçϱ»¥%‰ æœaËÜLkÕ !5MÇÕ" ’‰’Å\j%µÆ5L›R  ãȱ3”ØÓJ$Y)€Äİ!Bd�MPÀâzàgÛrA€‰aXË–­€˜Tk× –ªX+!ƒ"ЍeJ))¥AB¦Œ1B„EQµZå1ó!ô 0ZrϺø/:W÷îï?ʰIÛu‚‰–ìùÏ~V±Ñój ×JH5SP€J¡DL8F é:¥ò¸ÒLÉ8éšI“nùøåªTÉ›Ng"­ý0IÍM½kt×Ëå•Ë–i€lש{�ë&'�4ˆÉBF©É— ›†™¹´•JHˆ¨Šq$5Øu“ˆ@Ï1¦„R/ð%�j$eÒqJcc7Ýx†Qä1?‘IaËÔB,©?A鯦jÄóÃ|óWæÚ©Ê®œRØ´ÀnÓ2Ž ä�˜1 eVD27‚�SÓœÔ §Æ� !„j…”áXÿ¡R˜ìhms,›Ed™NÌ”T€Ø¦Æš&Šº0‘ÂR@ (4mC0ž°“Ì�–á ÕJÕK$³q,@˜Z €I±‘¡ÑÂD±>Qž­*aͯ�—ëe^ €ÏC�ùUO’{qc²B4±0$îjéÄšøµ µ­ÓMeó]=À²;{W'ó­ëO;½}Uï _«!Uô=Ó´¥Ç©Rk—uQ.ͦ�­«>ñ´ç±›6mæ=mmTk d:“$„ÙI’nK�¤%ÇÒÇJ™¦ÂF¬a=ŠjQ$ ³!tM¡a�;Zq +‰±€m +Á1ʱ rxb`o_e¢Õ¢âàäÐþ#Å£CCúFŽÈH>‹k •ij@MOñ�…Ž•+¡‚¦“¶)¦ ¤F# ²™6â¤í]Î9ëg¿¼¢P(h)€’1 Us€Gi%"É|�àî]» !��ŠsI›JÖ‘L´;è/Ÿ~aZkRJ`‰TÆ1m+ÓÂ|n„,�1Á€Cn$DHÄ¥éZ jÌ×¶ááA]ƒa †(g�¼UÒalQi¸OÈrZºê¡®û2`˜ËLç±ÛRlÄÅF¬‰ã3P¬ÔL2�¼€wå—׊uÁ´B* †S¸óºn{»N¦'C’YÔÚ™X·þ´g¼àÜ‹þò´ç^¦R£ŒOF¬Á¹“J«Aà9Ïzz¤¦X]�#ir¦ÚsÀ¢É¶L€™4U¾+ã&ÉÊî6àU*ûwî¾þ×#wßAÊå¸X2±Õá¶ZÂp�#càù  d¥ 7+Ý”r³:ÕÂÒ¹(™‰“©š’ !‘tP&RÊ©Uðƒ†‚!µ"à ÃÔHè‚XSh l2J T˜Š8 DC³À?½gùw?ÿP­;ÀšBE‡PC ä|bTScÔ—ZX³ô×I£‡%{8¦�'\¨éŒ1Pj©Ÿ˜˜H¦Ü©A�©1'jÃ5�tÒplb–eY–…¢”h­�¤`J Ë&I”�ŒsÎ9/—Ë### ­�àœ‡‘ŽŒ…ôàPiÊa¹VŸ,Nb΄’>�PÈ ©\6�Ϲ™”‘t•I€k¶,ërr3“ÜtΙëÏØÜÖݹö´�é–ìÆÓOËö´¹ùlº­eí¦uOyÊSÎ9çœç<ó9]�F ›,—ÜtŠXvÈy"�‰™0“nÀãR¹¢5¬×ÛvMÚ8™œ›ÉG6bÖÒÙ‘Ìf{:»:Z;ËÎeR®ma{×öæÛZ�t2™Î©Œ“É$²ù–¶®|{G[[GkKG*‘e¡±pmH­„N%Ү嚵SHV«”µT*æA­Ñ–ËI°€õB]„<ídþ?{ïe[VU�ï|ò¹ùVN¯^Ž�s šn� "&’H‚ ˜…Ϭ¨(`DÉI24t74�»_¿~9Ô«o¾÷Ä<¢~FÐñû´÷Ø£F�[·ªNí:gϽæZkN™IÀ5â0вÀ/A@m?L„öKÕbèxJ#)Ðkâ1ç#üç ŒÒZ_`ó/¸tz¡Ÿž9sÚs¬(Š!BJÛ¶3žõ{ñF³—¨¬úè4uû™Â !¢(1X¶k9n7Šs ±»qžl…e`9Í$é)M ÅFš?€…ÂZ ×iÑR²­U3(,—ÆgìÊð¶ý‡ ¢ ´Úë[åúäÞ}œ¹ëÝX[~82füpÇ¥— ÇÑž¿ûòË´í Ê&¶ï †FÝr½81•#K3ozǾ—\qàò«®yÒ“÷_yõìUï¼ñŠÏ?tÏßò£s�•Ù‹ö”dž=}¼×íÆÝ¾Œ“Š‹ÕBúv?*x eAX´à8 h” fà™'—×ÖÖz�ÎöÛ*¥0–±"Š8Ø+ú©È2™—«%”cÙaàUÊŠ멌ɄÄ“¹HãT Eô"çu nÈ Í’ !"•Q"BK¥ŠR&(�AI’aJa@Ïv ÄþË?úSK’$J�Ñ€`…ð¿§Dè?Êç?>¾*ÿ×âÅ åñUû×J´ÑZ"¢¸ßí¶]×5Æ!0%¶ï1Ï�”Š%Òd3€$PiA(2F¥ ”`©r%2„ BƶH¹\. ®ë %•Ñ@ �ˬ’_¨…•JX®*#C£åRµXªÔGÇjµ‰‰úôTm|´4\c¾ë‚‰Ù™é�ÛF§Ç'fgŠCåòpÕòm¯àwzí(êk-ûÝöÒêÊ îkVWW�TCµZ9,¶{à’ƒ;÷î¡a€\ÛXÖZ»½Òhh‹µ’+øÕá‘N?®Ö†³\3;Ÿë“‚yã»öÃcØ §gv@�—Ï-Ø5VWÝF¥è¬.ÍÅQ·R® ÕÇJåjP¨8ž ÕÚðØÐøÄèx¥X®Ê#Õ¡‚ë� WËUd�m»[”@)2 eàØÛÆÇ§FFˆ4¼“\åݘi˜·#[áÛ½µ&Î%Ö¸ÛîcÄZ�. ‡(QZb’pE‰M .Õ÷Lï(X�Clc ÆßáXzáÎ'µ·6]›yŽíù®”<ÉÇsÏïõy®Èô¾ËXm¢)IBà {Í>—©T"ê1¯(4î§JBKR9»Pók£Ú ¥ô aáðùyP­±Ñ‘>³"Ï[Éy—QU©l»æš~àÙ£9“õÝ{R—g¶£R¹<5{ÕSŸ¶÷ꪳ;GvïÛ{Í5;¯ºfÿM7ŽÚ7¼w×ä%Ç÷ï™8°gÛeM<°íÀ¾K®¿þàu×_yË-´XšÜµ{dv6žÜ»×jt›oyëŸ}ê3ŸÄÕj­DÔm=x÷Ýá½»vož_ínëüâ`s£ßÚ:wúäòÂÙ�¥sÙ Óo¬7—×çækëª×;yø°JS�¹�_ª×‡]ßW@,°‹¨Ï°KRË£ˆá8�¢~[ Ž�¡Fý^¡Pp§Ñh1@\æX�Ü1ȧNÑ t&Pn€ó„A;0eÀà°Tµ]¿g€X®_Ô 8ŽëÚÎŽáÉǾö� ë A ¤úÛô?¾»â~ú-€IDATj£ÇÇÿT¾'Ë÷¿êð-2 ~ †5øºÇ F+µZ_]ZÊ<ƒÐ!a„QH°‚Fåi”¥ j!sm$çÐ ‰±´¨aD3ª(Ñžƒm )‚Ï.„¾ï9Žã8Ží8slƵ˜xa­l—ŠáPµ0Zwk%88tY)0.ó*E·zE¿X ‹AèÛŽÌyck+ÝÝjè‘öúFg}ó±û8}øÈêÙ¹µÓçæŽ[xìèÙÃGÎ=vôÔÃGN<ühseÍfÖÐÐÐÅ—\2½s×èŽmû¯¸|l÷ÎáíÛÆwL9¥:ÎÄìŽÒÐøÌνCã“n¡‚ƒ’_Xó*U�ðÖV3êÇi£™µZYsskù|Þk®Î�Y:}ráÄÉ�óó+çÎ-œ:»:¿Ðm6¤È)ÆcÏµŠ…Ðv¬0ðCßaŒx®�Rhž;Z �h«¡QwyuýÜYÝí¦[M5ˆd¿‡âÔ3DÑÖù�dKss b@¹Rñ !ddx¸N1¯×ç&Y¿H¢ƒ!’Røu»)%„ðÔ±£cCuÎyGQs.{qdÜjô‚òðUOzjqfwæ•‚ÉíÞ𤰂4…ƒL瀦€vrÕù•Í�L ɰՓ`µ539¾wÿÄ�ƒ¤VÙvÉ%C»vyccûøã£#{öÎ\vÉÅO¼yòº«ØpÕ©áJ|¬>¼cvòÀnk¼ŽËAarltÏöúöm-�§Ç2{“å‰31å;.Ù]�ªµyתx(`‘Œ'vL‡K …T'jµâf*£OþãÇŽ;òŠW¾ì9?ôO|Ò–Ï÷úíbÁ›Ú>]¯W››«Í¥ÅÅ“'çÏ·—–×Î�>õèƒ�=tßüÉc[K‹ 'Ž�>üÈܱÇúk­õõ�åÕ‰‰ Û÷�e‡ªí-H¡Ú˜AƒL.2Ïw]×íº„"ǵ’4ʳd´^c.-@‰"�›¡b-t¤ áÀc~`û�À¡È%³�D € s4$‰”™2¥Ú ¬Ýé[ŽÏ\¯3ˆêÃÃq¯ÿ¥�|¼Àl'!B�ùwT~þór¡ÇÇ÷€þú7#Äÿh‰×÷ªåÿW1Ê7Ã}AìÖ„ç|ks�”Äñq4)e–æqsοŽMZ" )‚ A6’Á”Â<i„²å“ÜRÂ5ª@IÙ¶|‚BÛ¶"0„‚ C!õ,àQezv)Ô@†\ßQJ-’h Òqn¢è¢Õõ³<|öÁGgæD£½zô¤h´Cóõ†iõÂ8§íA²¸f2YÛØ<{¾¿¶yîØÉ{o¿³·ÙÐ\¬®®&¦gÂJ ;ÖÐh�¹–a¹®¦ {²ÝD¨\)®€R;Êr!M’æÆÀ¼7òÂmÁ(ª:l< ì,£qì&©EpÐëo¬®/ÌÍŸ=yöä±óg�ÏŸ?³0º½µzþìÑÕ•óÈð,é%ý®Š(ÍÅ Ê­­óó�Å'¼ÙR�¶‰úºÛAÑ Z[W½.ôU§íKÍÒlØqG‹Å¤Ý|ì�ûg'Æ]‚77V´J³¸‹T>39ÂÓþ‰G±ÐZj-�Òcà7•"“hP*,Fûý~±Xô_J¥!j·»…J5¨Wƒ±Ñ™K.™sŒ(Una@µ¡‚» 8Γn—hé`Z–��Gi½ZÛl6 F±«�–qqmäÙêë­!¤•Éò\)庮‚bìú^’$Ø,A`ye/ì÷#Œ)¥V«Õ±m7ÏO¹k¹Ä²‰íDY)‘h‚¬0 ¾g%–Ö„–ä6ç°ß�†Üj4Μi�=Û>s6ZXŒ–KKÑâÒÆ©3�¹¹�3g¶Îœí.,ÆëëÙæVÜhš[rE�¦è˜–HÊe¡%EóÌùù#GÏ=txÏÝÿHóä9±ÖÈÖ6D£Ù=¿à Y‚ÈJR;ËCm<¡Ë—(3Ó̪½¸zò�Ãs��\;7â¡Ã 'N†˜‚(ñ.¸.c 1Òèu¼RÉ Ã(M�y–ÕÊe ‘Ì¥í¹Õ¡á Tv<ŸK#¸Æ�5×¶WL*’e$I<­ª fZètw›€çPäP¤I¯%Ód±Š#ÇhË(’JKi3ˆHž Ù^�YŽ(ŠÇß×ÊÕÚ–RGšgª×&I$ZÍx}£½¼7¶öo›¹ö²KÞ÷·o§JŒU›%ýv¹äEÝf­\8üཌ" 0†Rªµ±, ƒ�eYœsŒiž‹V³­”\Ù6+” k­uc›É]Óз¬R8±{ûøÞ½³—]6yÙEå=³cöì¸âRR­ŒØ[Ø69sÙ¡é‹÷ï¾úòËžxCBL‚del8áI7‰ZýÖ ‰9�⨕D©b„FYà<ïP”+Þó˜rpF@lÑÜ€ ‚db´¤²NÒYo®Îo,�é¬ÍèkYgƒêdse.é6 �Z[ËçÏŸèõ6;ÍeKÞÛŠ6®Ü1;[ ¿ô‘lž9¹qꔓç5J‡-;élñ¼Ï\D]â}°…IÙ}Ëó-H`˜y®ëX6BˆafÛö KÃĵR¥ µ’ܤ¹Â–KmÏ@²ÙêraÊ•¡f·Gw�¤ça©ÈlR’p®(ÑL¢HKÉH”W-!ÏŽÝ™W)æÐøå"°ˆÂ�…^¬øÔ�½#Ûgzi¢ tÃBn”°pS¥—=ùÆŸûÕ_|àðÃÇŽ<€J£ ÄÿÎÝãñlÊ÷2RùW"Œÿå0þí¼¸h`„ Ïó†cJÈ,M³~$ÓœBdAlAì bó\¶ºñúºéta»Û�lu-]\ëë^”øIîôcÚéçËëÝÓsí3ç6Ž<¶öØñæ‰3½3s½Sçz'æÚÇN5ß|ðhÿø¹Æ£'��èžžïœ:·zäØú±Óݹ¾´‰·z¬ÉõV÷ìB{nEñˆ_`9/Û¶ •BDbT`³A»©�ȳE´ô1eJó^¿ê…CAÑÖ�·û¦Ãn²üÈñ¥ûw�Ÿ9úÕ»óf»ìûýnÏõÃÕÕÕ4ŽëÕJàXßK:fÌØð�rdtìÐå—Û•áv®S`uíxe%Ô òLsÁ  ÆX3 US¥ „ˆM¸*R+€”·z$“v®}D@ŠØö!õÄy®zýÆ0ÍJ¶§âÔôly&N†‚bHXÕ ‹Ìj¯®�8|øøÃ�îÛ±ûÀÎÝx×{Ú«ýFƒ!È¢ —Ê…õµ5 4!„„p!­"%WJ1Æ.œ²ã8æ\†A±TªŒ�jâ¤m0ç ŠxWbí‚òìÄèÁ“—ì­îžð'*]«� í�v&‡¼é‘‘ý;½±:,z[IW0Ø×‰_ \ß6HŠNž÷  ×ÖXç<îúfF†؆[:7qO¶7‰ˆ\jdÚ;uôðÚÜ™…£�­;Ö^XÙ8}^wú,ã%j�ø%eD©ÖúºÌÒN³¡x¾´¸°º0’Ø7¦·4·uödo~¾7wn �Ã�u�Ÿœ<»uîlɵ´ÆAn­(6CŒˆ!q²ŒÆS© AX*“F©k¹Bä (Ëw3Á£$Oi°%4fn�87Ø …¡!0ÁöøÔ4µl¯PÄ¡[™/N�¶L n×pTòKÓc …ÕmÅ©Q{¨ ›¼B½ŒŠ-š¥ J�BEï’ë® «Õ¥••ó )0ÁhýìÖꉹ3S;·ýâ/¿þÿüÖ™g2¨Ç·þÿnP1Æü›ÝõÿÏaÀ÷xü“&•oäT0¥RK¡Ò"Ë2c ÐZK•§9Ïs‘dZH Ã(6 êôÚ+«[çzë›ñVC´:ñÆV²±eÚ]Ô‹­4wrá É¢õN.�8޵ÆÇÇ«ÕúèÐH¹\JÒ¾ecËIÚ¥6&‘P¥H@:Y²‡N=Ò—ƒNÚ^´ìJ�œÕÖFmr:ÚDh)tnY”Y8‰zFqÁã3§�-Ÿ;K´l®­¬.ÌÉ4î7ƒÆÖü©“‹gO¦�vÜj´7×VæNŸìo¬£$)SE‡ÖTu´¿ÖÔ1¯‡K‘~wÐï<ÇOÓÔw=•IªUHcÙ�»ÅН4ÏÒ… ëw««Y»ÕXZ†Ð‹Ô§ÆÝJ‘z^®”ZJ­¤–R!ÂÒ\dBÆœ[„‰,§ChŒQŽíRh�!¶ZÝ�Æ4¬Ô µš[(SÏŸÜ>Ë9�ȹìăòȈtèØ®Ù‰½»IÁ3žUžuj%o¨"JKÁ莙±í3Š  RJób¥72¬–ûy¾Þj¸�Kqš¶z]EÌ¡k®xø±ÃïzïßÏîØö¾~àìÜ9®r¡ú—�ÅÿS‰úÿVPÑß° ùz·„B€�Ðê›Ssa^xƒþ¶ÕÿºýÉxþ=+ÿÙ=ÿ_¼-¾Ã.þ_ïGù†çÊ׿ë‹ðM›•¯ˆ¡APA´Dœë\•J%™s“)š‚2µ —YÜOø Ÿ÷˜Ã[K«ÍóvdäR#_o$íSº²“.wReó %½K”G0ŠpÎKâAäñÜôz&˜, /…ÖVo³ÕoP{�FÞ$ë[ ;�"�Ó¤ŸóØ€˜œHä##²<é[Ð(“^ËäñpÁiDâ &™Šc“ †Hš$IPö‚4I<ËÓ'R¢3wçn§ˆž<{nj÷.�  BÀ3Ja<ß6IŽ!¡Ô’Û5Ìîç¼—g '¹bÙ†9Š1ÁPŠäònÖ³ ®å³A2È9B)ÛÝ^®tX*[®W­V¡«çCD7Ùj¶»Ñ Ýï�[X\ÙÚˆl�eе¼b8Hb©`–›45Y† ñ«Â…‚„XËEžˆL�IÝ�Û^Æ<\¬§fÝ‘ 6<ŠêC²Xò‡Æ”x•z*ÐüJCCJXÐAh_ʾ”�x°Ùí�ÀHÞŽ#`{[½¨Ý‹›ÍnÒ‹»ë›LŠ"Û뵉r±ìQß#ÌVnÈüÐ AE”�Bb†êUßw ÕòÐĨW)Û*•J<Ï’N—H¥¢”GQ¿õ‘¼ Ðêô:�^šå³0 }ß�Ó¤ÙëÄ<“Z e,ßÍA–#)¨©Œ ÏvŸR:=>™@ƒ"Ç,�$#´Gˆ®DÔîÊ8»üС÷üí;ÓN×sɹä\n ÈÄi– ®ŒFŒjtáùõ§ú;k<ßu¢þñð?D¬}‰‚j„ÄTi€ˆ`B[2ªŒ×]×NZíµ§Û§P£[V$Œí¦V¢Q¬À€ƒ”çiª‘âYœe1癹ä9£*‰¥ä —\É\J¡•2@CõŠr¦�Kl�qÍ4Z*Î�Ì7 f8H„*+½ÕlBƒJ%…H0w=ΤWœÜwqi|º4>¹ûêk/¾ñ†ÝW\~Í“žxõ�7Þð¤'ÍlÛ¾s™éý_²ç’C—ßü„}×\îOŽª£CãÛ¶íÜg ™(Z¾«M%ĶA>vó>ç1·ˆ%¥Œâ®!FA%¡Ve&õ!qÆ&†wï›ØàŠ§|_m÷ÕúüÂÊÎÝ{î;P,‹Åâä¶™©³Ó;·OnßTËN!(Õ*cc…‘a·Z%A¨,+HSoi«u~uc­Ñmw#Œ,×õ•0T#,�L8“ˆpE…"Fo®®¤�â²LíÙ¡1ÓO¾ÿ¡ÑÉÉ�ÔŒa϶ÃÆÓ<‹bl´æ©L2€aLJ V,g§�mqc)dêfK†¥…8}åDõeÔŽ;QÜo¶¶¢(θ°\R¦rÂ"2hki$Â$‚PFmÛ-Ýr!ª;Õ ý‘Ûë““Ðñ¼J-¨ÔÃÒpX)ÆÂp [b;–Ä;VX­x¥jmlÒªŽ‡ãÛÉm´:š{EÛöúÁ‹ªû–§fµåçÀ.ÖÆ ÕQh‡–_)ÕÇýáá±½{†wîT¾7€pcùõ¡�ÒŠÚÔ)F‰ì¶’­åM, Nòxs ÷,O)…�P:žEË ƒÙm»†kõbyvr:ð=/ðŒMCÒ¥8°0�ƒV+mµ›‹Ë‹'O­ž›÷ì#šå"ͤ*NÒ­VÊ\‡¹N*dÊóXâÚN!ÐXE/Ç –3T‚ž]ªÕJE˨R¹j¹ž ¬™s帬XÚêõ¶ÍöfI}ÉþƒïüË¿8wô˜èõ6žç ��…4d„C£ßryýzUçòÇwÀÿ<¨üK)èÿœÎÊ¿“µüQ€ù'’6^WF"„<σSjå\ % A„´ À‰ûî[z옧ªÝ7ýp®ÒTs‘ Ò,Je.ó,SJð4‹ûž¤<Î ×€+� (’J£òLIyáØ+„Hò,ƒZ$)‚Å”B,Byš¤ýHK%x¥ý(p™_ 0 a‘µ8šëuyèW·oßµgbûÞý‡.ÙéåCcãÅ‘QÀÊÚjžç¡¡ëŒ×††«µ±¡aײ1Æ¥jíà%—ŒMnßµ÷à�‹/-T‡¶Ú�V·µÕh(%Tc©âˆH¸Ì÷l�`È%§ ‘ó4KÓ´×�,/àˆlâ”Pîû-£&ì[íw/¿úšo¼Ñµ¥¤–\È<Ï•g6%£Õêö‰‰é™‰R¹@(”x�?42ºkמK/¹üàE—oßµwß¡‹w]t°<>n•‹ÁÐp}zÊP«44ìVkÅÑÑpx¸84T›ŸÝ641Qª;AR†-æðZ ëÃ~eÚa©>^Gv0Èu'É3L†…‚®ëÇýØq¼ñé¯T²‹§\*Tëa¥V™Ý6¹kgqdxbv¶44D-V« UÊõRPµ°�4™‚æ™êÇI·×˵ŒDž+“fZ *•‰Ó|0ˆsžv»í~:hGýõ^»™ ÍÍA¯ãÙ–ˆã^»•ô{RrLI¦„ÊqœÀ÷Ó4^X]L3Ž,š+K9ÈÓÄhà°Lk¶è:�<µK¡ÐYÜo@™XF"#ëCÕêðP¬7x�Éå�–Zs±¶°ðŒÛn{í«_IKæ0 !-�PFb† Êhn„ù¦ÍüÖGð8ÿõ½ªþúÆPý×�‚Ž„ƒµòœ#Bbž¥"Ëun[¸ÛØ$Y*›íD8ÏÒ^A#m�Q�5à1çœB¥Y®R•vÒ¬ÏE"‘B<Îu®ˆF.@.Tk Z% Ê�ˆLéL !„J[š�MbI#YÆnÅ*:À¢Æ"Њd±Ês-§86¶ÿº«ƒ™ñÑ]³¥j…Qºµ²²túÌÚÜùsGŽœ}ìÈé#�ÝþéOÞ{×sG�=ðÕ¯,Ÿõ¹»?ÿ¥ÖòªÖ:Ž“8IêcCÕ±z$ÓX¥‰É\ Û«ëÝ­-,„IÒ<ŠTž!)ó^߆ȵXÔíH‘{Ž[£4t­VeØäHÙ6Û\^F’w·¶NñqŽ²ÕÆê®ƒ{â%/ý‘Ñó~òÅWÜôäOßõµ“+ ~­‘œ.�•½›úþ.±×Pi#P¤ t!9ÿIŽùq øÏ�Ê¿Éw}Gæàmÿ‰€æÿпÞÚùÍ?ê‚YÙ7[U €"Àh´AðB½Ð†k-¡ÑÐH$@Àó‚\iH˜eû\k[gÏÎ}þ«_i€| fËYo£½µ±²Š)„ÙêÆˆ¹˜CÝíD'Éë÷,žà<7IÓÜ1¤9…À8Ë’¶ŽEs^µZHHâ$}³¾Íì{Ú‹^zëK^þ„—½ü ¯|ÅÓ~ùõ׼䧶=ýC7ÞX¼ø"kÛ6Yœ;ýÀ]ü#ÏØ…Å~C–™ôÇKÁ¸çV5„IÇq‹' ÖŠŠ¥-…M0”Ûž)U°íÙ½Ðê„ô�Íù¹µ5L­šã•s5£Éâ_ëŸYÈ7›e  ”ëy¿+ɨۄ2É›k¼½Ó¸µ0O{ýR’‹ù¼¾FóA´±­-�:–Õë«F{¬Ph­¯÷]jLˆ¨e æ&È(×p'Ø_#&4T*`¤Vˆ" ±˜2<´IOf–ë« ÛkC7^yÕÊæêç½oÛS®kÕÜQ3² ‚Zð„œÕWùH½2>>L>ôŽ? smœe¹ë[1Ï”Éw^¼Ôý�lëæg�¦~ˆ Ìl’Ἆx䃂�¨Q jC¤{½­ªäúÊú#ÇŽžZžÏ‰‡½L šks>Ê“œ:vÿâ±ÅùãqkcmáôÂéÇ€ˆ²´óðÑûçWOm5V—O¶6»ÅBíòË®»á¦Û®½ù©{¯¸a|凌�ªÓ\ý¤ko{ÆÕOyê¥ßwÛо½ã—^5yå�7|ÿóžüc?}ý³~ìš§ü൷ýÀ¡ko¹ì¦§¸á¶+ŸòÃ?øâ_¸úi?øéûɼ‚54ÒÖ8!ÖÃ'Ž�83×j&�¾ÞuåMÏ}Õë^ü³¯ÿìg¾üñ·¿ÿþOõ£ùž“wÞÛðéOÿýƒ‡og#düš=t÷hËVwŸ¸7Á]»ª3³¸ºù¨’­JÈÝ­$ë´A_2Òï÷×Ο¿ÿί`‹Ì^|ñÁ›nþ‰×þê�'?ûÀ5OÝsñS.}ò ®zú‹®úþ\öÔg]|ÃM7>çE·½àÏ}õo¾ñmï¿þY?uÝÓŸÿ»ñ^á=ù/~ñ+Þð¤§=Xed×YivïåOÿ‰WýÁ;Þuûß¼ýCw}åîT ÂZ0ý°äbÊ)èrÞŽMÚÕRÂptè3_¼:>`„8V‚ HD‘­¸Ò€\i¡•Bgri¸1 ‚Ç=í¿›’âÿõ¨üþ�ÿZç­�È|»t ‚2Æè\`Fëժͬ™©I`tÚTªµ]róÿX–·ŒE*£‘f÷Ÿù¾½ð¹/˜©�ÊNLsÁ2m5,¨4í�-  M-E €Úv,„@’dCŒ‰QàÊ‹.q¢RÁs\’g] 3™õHÒI'``km±ÓiAŒºQ¼´¾~öÜâ¹³‹÷Ýsx~eë§^óú'ýÈ�>xîüÜF“zD] í(ÕÄ*ŒNìÛ1:±{l|×ÂBó‹·ßsû—¾Öhõ rNž8ÿéüÂØ¶éíû÷‡ê¥±ñÂèÄÄî}».º|j÷�K®¿zúÀ>wd8¶ ÝYŽFxa±>6<1S�Úá—ǶíºxvûÁË.{ÂîË®¥ÅêÔ•×�¼dÿÍ7ßöã?þœW¾ìÊïÚž‹®YÞêõ‘ãneôú'=µ>±}rç¡ßùÝ?-ׯžý?òó?óš]c;¢�¾ì�;6zùôþK/½éûö]zõ ·Üö´yîÂÒÚnÿòðÐÈX}bîÜÒ#GOÏo´æ·Ú{.½òÚ›ŸrÍ�·ÞvÃMO{òS~äiÏ~úÍ·þè>ïÆkn:xèŠ4“iœ1¿ B#b€!v,¯d P×e–‹ "Ô® ¿é-oCX¾/’ÜHh HaÇìEŸºýÁ›žø¬³Ë½{�.�켸“ÁµÍ¦QÚ&ئHç±Î+ó»÷Ì.7Ö6·V9”OÜ0àFµ=@/8íÁo*e`€ y\•ê»/)~Q€ùw¾çÛn5 !ü&%©ÐFh…m{vvöÄñc2Kg&Æ™�‹Kk—Ý|ËØ׿è×~çUü¶g¿ê—^øú7Þú“?}Õ3Ÿµ8lô;ÚÁ‰Ì„"Œllhk.p£�.nFgV;� Ùì5pе«×=ûEÏýoßú“¯Ø}ë3'¯¿©véeážý‰ã%–Å_8n ` ¢„c �‘Øp CŠ"e‘5Í>ùƾá—nyÉ‹®~î�}öè±Ç¶š-ÂŽ¬4Ö2|®-Ïwu úgzù¾[ŸZ8ph�/Ÿ8Ó³ƒsQòàòê#�ÆÁ§=uâ ×ÿäüæè5W~õÔé¹�æf»¿¾±Å4"Ï•Ž…Ôž{å³¾_U =‚HÁ1PY"©J–Åû}• ž‰4Ë×­¡áÑnx‚eûƒqë ~ü'ùWV£Ô-�Ô&¶S`èWêÓ—^uó¾«ožÙ{Ù®CWßò”zÕÏýê+^ñº×½î ?ÿó¿ú´zÞÿÔËî½85Á1Ž 0VJ'QÆ,‡8¢È`˜J))MT„a×CÔÎSa EÄ“9âå™Üâ)HK"ýÜŸþYÔs&Äu/}â­/|õÏ?ÚyÍÕÒ" �íár]qpä¡ÇN?vºˆ'§KÇJNõg^úš›nzAÚb" ¡¨‚Èù?¿ög?÷Ò_;stý‘{Ž\sÕ¯¾þÉOÿ±=ïå¿°ÿ O †f‡Çwùnôøé{³�V½º:RŽ[’ ©çH…XF@`¨0€„%ÁÀØ` 0‘¹Êº}ß÷ —Ô±t¨_Q)ÐûÑŸ|Ý›ÿúãO}Þ«·]ûÌŸ~ͯ�mÃ�—K!�,éXy/ÞZQY‘|äøÃ�@ËszY¿ŸEaµ SZü“‡?ž£ÿn@å;ÜÚ¯¢û·R)( .ˆ×|+Û`Œ)­-ÏË£È÷ݱá‘v³ºžïårí±ãgõR;�•=5-gfvßvË�Ûn}Ú‹žß†êî#‡9Áƒ4³lß §Ë3ÍnõÀ¥—üÀs®ý±ÜüŸ½üºñë®Þ/ýÚOþÊo�]ódU/î¸èà“Ÿvñ÷=ãòëoaC“Ä.)A|·%¢šPC„S€�èë„F„ÑêèˆDpϵ×ÎÞpãÌ“žôä—¼ôx’¬`bÆ·=ý¥¯zéÿ†|Á­/xñoþõ»®{öÿø/þâÏÿîï?ó§_òÂ×¾öuògoø‹¿ú•7¿åÀ-·ÊBy]©Ýk÷�·ãÆëðøplÓGNŸD”XÈVÞø8pýg¿ô%w;²õ7âÞF¯Ùè4¸‘ÔèÍ8N)ÏLOíÙ“!pàš+7yöèÒü™N£OqÁÓ­Ö½ós›M\~åþž�µú;ðÂJÁñL€ª:k„ÖP‰ =7�­uš¦Ã¤ß ½µºžõ“ɡɿF+K08¤ËebP ðB«)˜kÂÒR/¹ùÖ§äÊ\‰¢@a@\'¬~ø“_¼ÿØ©žÕ©Ù=—\}ÝŸ¹}ÿ•A÷^}Ó®K®:tåu;ö¼îú›®¹æº§<ù¶_yý/¿æ^�ˆ�¤I7J>û¹Ûo¾þ&Õì³á è¾¹†*æ)'0ØÕÆ ½j9¨Ù†ˆT(Ù¶éˆçÔó²,ënlbÅ]ÉÅÊŠœŸ3�&�Rg Ÿê^’µ; ßƒ®¥4LI–¤,,%BiÀ rt ÔwYû*4®Õp­ÃÏ,ŸþÚ½4Ëf¦'Š QÃ](AÜ{Ãk_½pâøX­xNss£µ¾©{É—?ôÉwÿÑ[�~î«ÉÜÖgÞñ¡wýÁ[?þWï=qÇÇÏ=p iGüÐn1v¡06�« u¼ZûôÒ¯¼âu{×>õÞ¾þ'_þK/~éßþá›ôú–-µîÇ&K°Îažš<5Š -×KbY€Y†P€�0À.–¶ &J( —¹R0ÒKc`97îðìôÅ7 V§þø�¿äµ7\t}ëô97IÇ-jõZ‡F‡®Ü1;U ×Ny”¥]ËÆN`õ’Þ M¸Ì!FA€ „ únÌAð8¢`þõø—²A_o»5€‚fQd¹çÒqÜ^w°¾¶„EF¬Ã÷=œt¢R¥Î!Ì=«0X.HÇ*NŽ¿üïÖ~ö\³‘´¸¶ul½q:I®zÁ fäYÅ›op¯º´vÃÕW¾èOý‰Ï‹U,ÄRár%',1€–+v¹ „a¶gQ*sM@a€)$b!hˆ `˜0ÀâAÆ Æ…Jj¹»n¹åWÿöí×<ï¹?ÿgV¾è"Y©]ù}OÛ{! ‹}eH©tÓþ «ÕµãâR¹01I¢²œJyˆ\˜šxÖÏ¿âù¿ýkÏÿ�×=ëå/>ßnZØ®Œ.ϯŸ8yvfÿ¡ç½âgì±á©CÊÛgʳ3´TÚyùÅÁäh}ßÎÙ«.Ú¿óØÂù·¿ÿiü›oyóôå�ÜcJþf]ýŒÛÞøÞw_ýýO»ûôñ{Ž]ÞÚì¦i”寱#-b™c†{�€imâiCÉs™ �jàW*[í­BÑ ŠažçífseyíðÑã�~tf}s±×§SÁ¶YS._ö¤[±©­\žÝêÜö£ÏeåºÄó‹úBHФ€ tÇ®}×\ó“n}Æ­OΞW†v*;ö]wÛs_ñKš– -¥©Á›Aª6».0ÉÆúýŸûìù#»Z‘¨Ÿ­,'‹ ÑÜ<ÜØDë¨Û¦y&Ó"  „FÇ�­Î™szi9]]K; …T7n3ãF‹¦IQ«üÔ©?}ÅËþô/þÓ—þÄßüÂëO~ìæÜy°´ä z^¿�?wâ®/¿é/ÿã×¼ú¡�~ȧ0í4(3Ø"˜~‡·›`sãø�wýÊs_øúgÿè[~æµÿøoùäoÿÞï=÷…óò—®ùöÞWîXøÔÇÿü•/Û&³‹·OôÛ«‰X%7Îâºî®Ô÷x¥å»?õžß~ ?u¿³yvã¾Ûï|ÿ;ùÂ'ž|ù¾];v�?{þKŸøP é%²Ÿ‚8oÌÍÿù›ß:14²kf[‘ÑÛ®½rW¥x싟ùãŸ{Ÿ;cE�|e´ÖhÚ‘íUÄ#�vLžc%E–E­&�áX¤QžeQ·‡‘�@A“C� â­rÝåIÛb�pÉ%± #w~àÓŸü»¹ý¬f ;ló¸±%×ÊCyîÄèuuÔ7Y¸6f€2‚È /lŒèë\|üˆýÝ‚Êãˆòïªø2ü-,�B€Ð"£X–¥¥±¼ X®Ÿ=;ÿïýÐé³çkåzosóýýW îzDY:-‡ì“úà›ÿð÷Þñö¿¾ý£Ý{åÕ—ÞüÄÌv&÷ø‘Ÿø©Wþò¯N<”hC£FŠE ²‰S‰oj²¤Ë,èxLi®‘X˜M¹T”1À€(ó gJ¨µVJI)µÖq«[ðËŒ¸Úšy bt|z×µ×Áɱ1Ú³€oY.éºÔu\϶Ki¤] �g‘b`Z�1`ÙÄ.Ñ5�혚ºþš«žñ,hÚX•R­±ÖÂ<ý‡~ø_ôSO}Þ ž÷³¯Þ{͵{¯¹vÏU×zâM—?õ–=×]é�Õs!˜í¶»=ô÷ÿèÝúìg<ó`jzšÙî£÷~mxfâGŸÿcÛwÌ¢ Û˜-o5·ú`/J²”ó~n 2�+cÙpÎÜå~üÕc�iÏI$o463Á_ñêWÿê›þèßö?ûë¿þŒŸü‰çÿâk¿ï…/|ò�þèó_þ3W<ñ‰7ÞrË‹æ•Ï|Ösn{ÎsiÒïw%�y܉;›q¿!“¶‘qº¶Rw½]Ó+ÇNýÊÝI³#: 0NÂu·ŸmD–;Ô‚QÒzôè;ßð›o}Í«þîwÞx×ÿþÓõÖ·üÜ+þèå/~ÓϾø­¿òš?ûùŸyó+_öÖŸ{Å~çÿ|öíoûÔ;ÿâ ïyÇíÿðÎ÷üñoÿÙ¯¼æþø·þüW_ûǯ}Õ›^ûª¿ý½ÿãe}ÖëûI2wç�¯xÆ÷ýþϼdTó+Gk7휙¡è®÷¼ó�~öeïû�ßøÄŸüÎïÿÌOüÖK^ø™¿yë¸ˆÜÆÚ»ï� ¹îa’6ˆ›²¿©z fÁÞâÙ÷¿í�¦}¶xhg¹\”ಉ‰kwLòèóïøów¼ñ—¿øö·M |oÙ¦ù@å1d¸�¥#ιŒÌS7ë_63±Íeuží-…‡k4Ž£Íõz%ܳmzãô™¿ùÝ?HæH§ƒãøCúæ}³“W\¼o¸îWËVÖ[Ý=ZºõÀ®�ùÃW¼ìÕÏ|Êçþö­_ûð{Þôª¿æGžõ‹ÏÎ;ÿ7�=bE=ÖnúFå+óüK¿ð®ßÿ�tqÞ’‰Ø\þã_yýÇÿî/iÜBY?Tq¾6Ç¢öÏ?ÿGOßs§/3K$Çï¼ã#ûÎ#Ó#^±c@ÞìuNœ»ajûéOöCôG�VNY’«<6JI sÁ ‚æ‘Ê…yÁXìñò»HÔÿï&¾þ¯”aéз…*@�EÌH–ÄFi`Ùã3—\zµç—ºýÁµO}êÌähÚÝøÜßÿõ‡ßö¦üÉï½ã×±uøÈ/¶™Š�ú³�œ÷!ž'–¢Dn¶Îß÷ðßû¾¯~è²µx&›§¸Û2±Mrˆ2ˆ9¶�ÆŠ0ÈE.�’’+  ÔÒ(� ÀÄ`ŒŠ ‚#¯RIó<FJàùeÛ ò~¢ ŽÛí (Ñ@”ˆŠE$=ŒR )XKEµ�9„� ${ý¼3€„1BEž µo‹Ð¿äYßùSn[íZÍ^)(PÂsX¡¢�‚b~£—S¿�`Tž#¡ŸAm(&Ü 8¿æÐ¥Ìößsïk^òò?|Ãonœ=ÿ¥�|üþâ¯ïûìˆÅNœ<}ôø3Ÿù]~Ñ%—ÿþèSŸõêøÔr‡«#§œnE¢“!Ž*õ‰+n¹í'~õ—^öÆ_žM‹¾M�h0ˆ>ù‘�‚ZÍ™¾êr:;ƒ]™uü¡G¶æ׎�Þ85·ñÀá"4a‘Ö¦?h²ö i.ñÕ³xk¹säȉO}êͯü™?ðþÃÿøáOþÕŸýýïÿÖ]ÿðn×EǤ[˾ÉïÿÐû¾üW~Çßüõ¥�wM­´�êK‡ U½‘¸uÝhéÉû¦/™,]7=tãôðµÐßXj?øµÍûîX¼ë³§?ÿ1{mîâš; m%tõìð•µR¸´xן¼¥ùµ»ïy÷»>öÖ·Ü´gÏÕ»vm«– OzÍ ¦â}3õ‹gkV²‘-?4Üt`Û¡ÑòàªÅ'Ú÷§¿òZÐo0™€¸;X<÷Á·ýÙo<÷‡ßù‡¿µ·^(˜l²È,õWH=§X ·ON\¾kç¾±±"‚�åEª5…ÈvBC�mx£¢Üxn1éÆ%æ C©ÀF7›MbòÑ’ÙÌÔNßçÞø7¯ûÅ?xÁsÇ�Ðý5Þ_é¶ç-‡‡ÜßZd¦éU“Ã7ì˜:zûgïýðûFDzE½¶‹Ñæ#�¼éÅ?ý’ë¯å­·üÜ-Oøí½Pœ9Ù|ðþ?~ÅË~î)7ÿŸŸzA|êÑ;Þù·¿óÒG�>‚VW·zè÷ú¥SJ¾ã ¿ Zˤ·.Û+¶�m ¹PJEi‡\µ}¼ÕÚåùKwßóª[ŸºyôÓZE14 @(ýúýmmà�ƒÄã‘Ê÷rüKý7ßH£@ó-}µ@ á_þÙŸ¾ø§~ú¡‡š?~ xè¢Ë~ý ¿µßÁOüý;GÆêÛ·�»XˆÆŠÝmNA³+ö”ëuæZ�îÚwP`24³­•eÇ6æ¿xÇç¿ò•;¿üÙϬ?n噎ºw~ñÓw|ì#w}æ¿òùO}ø½ï¸ï«_Lû `2Î#d$$‰�´(æY ÀÀ„%B�@Ø`$1æÐt²».sÛr³A‚±�…¤ÀαÊA2àý–ì5��H11ZdØÆ�"D Äd)Q€R*Z-=¸¶ ¤À¶G‚R$œœºõYÏôK…Ý;vˆ¢vÏ@rf~åcÿ4fNXª ƒ¸6Ô±‚BhYlÏØôÅ;öÝþñO½ÿÍoýÜG?qù¾‡fw쟼lÛî'^zŹGùàŸ¼YE$å=_¹[iS¯ o­o®.¯†ÅŠí¶åC«a½V·-Ûõ*g/:P-—Jƒ~Ì…š;~¸ð=ôÒüÂ÷Þ÷…�|líôÙÎòêüáÇÔVóKúø_¼îuõk¿úׯÝ;ãWßþk¿üÞßyãÛý—ßþk¿tôóŸ[üÚÝ7mßñÄݳ»Ûj­Õ`vì+ŸyÞSoxç›§³ßû…ŸùÊÇ>Ð9}b›cMî WÎLÃæfÁK'\W#’w{6ÄŒË%4ÏNï® a²#,Ž3{»\?5ñ¼¯{Òî�7혽l¸¾'p'‘ÙºûëÅë¶OM`sã®v»ó¦×¼î¯~ã7?òÖ¿žaîþRuвß~ÉO~ñƒÿÀ�Ÿ©,Ãû˜¿T�Bs¥u.|„¥öÖ‡NLüÕ¼IµZBM–gêÛJ‡Ñ·m��ÿÇ@ó͉À^˜ßŒúþ¯ˆ¿­Õãÿ:¿ÉðïZÅòŸ_É·¿b€1@iõá\àRõ·wäh£/¼UJ©0rÅP™D¤©Ì„€H :~ù£wø��~â}w¾ç][‡º¨ZzðSûâÿþ¾/|ô7îøÈû¾ú™�'Ý-7pÏ-+'(!²(±À ê"©™BƒF�QÙ¬0Vim­‚| z›¡Šd{…7VúKs´×-;Ä2âÐÞÙ©±áÍÕÕwÿÝ;€†Dá^£±xò$FP( Â¾•A-(1¹R©" S�U"©@®!v¢ ¶«”J¡Œ1'ªq–é´9³�âÝ»ïøôÛÞôë}ïŸñãïþâÇßs×ç?üù�þÃ>ôîO¿ûíÿøwñù÷¿óßó×·ö#Ÿÿ‡¸ësÝîÆüòÜéÇ÷WVÏßÏ—?öÞ“Gîêæ›Õ}#¿ü{¯m´Ïžø®Ó‡ï»ëK_lõÛ×?åúWè1à •0ɸ¶`ç´ætã&ˆ;Éü¹[ì+A 4�²~ÂÕ‚7Q.Ö«âÛ¥ÀYoþôÑã�>°|úôÚÉ3®ližwÓVŠ\‚niµ±yü«Ùcw›ùS;Ë…‚Et'¶�Ö>ú¨X^ÖÍN¿Õèç=-ã:ã1ÎD™ó²�S¶[jšÚ“Œé­ÍdeiîÑïýÒ&V3Õ±„7ÎN>ûêˇ<|êÔCœÝ?=lGƒ‚1ª×{è‘#gOœU¹Þ>¹}fzçÈðÄ�_ 9Õ`L5B§DÅÃC™ù2-ÖH¹P²lÑÈ^âËaÔvÙÔpq¬ê"Ñ#ºïY²ðD!4½>mK'¨£Pß�ÈÐD�¹Å2´„L"1Ð4Û33´zßWîù›¿ºã¯ÿꪩÑ!Û˜¤ƒ @ð^8ðb,œ{(«2=ìœE–ƒhÑÕ�=0Bg¼BÝ1·P"¬`Ù†k&à�U²sm+… EŒí I¯ùðÙ¹;"XŽÃMcÞiŒ–­`Õ)ᔢˆŽ:#®¢HæÌÕ x<+FYI(ªxžthžT¸°)Ⱥ�På…¤_LNÜ/bSdÄq<Œ�"´ÆKÎt�‘öòŽ#çæ/ÙwàêÙ�k_½³Ök1‡–‘'íˆ2oH(a Ú8,DrÂ"Ó>ò©O[Jj̸åõ55!A›<… øqXùÏE*ÿ¡@ïÛM®þ¥ùÝF ÿLaì¿4½`ÀõϯAjÀ+¥Ð¦FŠ(êù˜ØôÖ7½ç¾?ÿÃ?þÇ|øž»îúôG>~ò±#ÛÇÆîÞ½krj´Zk­¯âCBJ^yùUã㓞ãXÌ�I.$WÐ ®�2š+©B”Œ5B‰TP–q‘KhJ�÷£æòZE�•ÕÞúZÝ÷&*•;>þñ‡ïºãƒïzû™#½û/Þ¬º –öYÚ·yÄ’.�1Q=$ÛP·¡n�¼ò6�½ÎòYqϤ4ë>h�?ýÑw¿ã þÀ§>òÎ÷¾û/NŸxxzjô²‹TKeßq«A9´}¬ ÏÜ¡BÕ%¶�˜ƒ– ßìyððɇ�ž~äèW?÷åõ…ÕJ¡âYî K¸QÜ(ĨưT.�Œ�ÖêÃs\?ðËåD)`1Û¤Ô–åd‚{�ïúAuxÈ Èà „D–÷;]žfiœdIJ«yžï…Aµ>D(… %©maJDÎ]F‹–»¹°ôÀ_}ðޝ»ÿÁÆÒjg³ÅûIÑñ`&–ÏÌ{àáG¿vÿÚ¹ù^£erÁp!©ÅJ¡èØ6c, Ãr¡X.– Aè:Nèz¡ë8„…Ô®x¡£‘£`ºÕŽ7š0ÊH*.Û¹ÏÊÔ‘¯|íÉ×Þ8VÍ…èDÉZ«»wß¡B¡~úøÙ‘ቲW\>3Ÿ÷” ”ú�²ÛmS›j¨¡2ÍE*�6@#¸æR©kT€€£¥§¡Is(ÔÆÆ@D)àØ>Ávž¡ W¸K·P)�8ž´a ØÂ,~ÑÌ(�Û3%÷ÞO}xéÑ{>ñö·¼ñå?ñ{¯yÙo½ü'þä_ñî?ø�Ͻó-÷|ôïïþèßßùþwßñþ÷,=öÀùîzôŽÏûêígî½óüáû:s§VŽ?ÚÞœ m³cÛXµÊœ{–[J*å²|l¨Wda‘zeË/X~Ù-ÌÔÇG µ™ÚØÎ‘mã¥áÑB½Tmhs.˜åÄq:èǵ]Û³ ý"µlEHŒ$X"‚0C€,,¯ MŒOí˜�˜ž’ÀDYÂ<ϳ(V9¯K•BQ ™¦)!Di 1  &€Pƒ‘åyvàA@!t,TA¬Œ,Wš廆è(  åZ³üÉr}¢PÚ5rP07>±Bm­\©àeÛ!\ò()Jq&êã“#»öàRåê[Ÿ:sÑåãû/ºú©Ï¸õÇ^ðï|õ�OyZmt’ V÷JWž4ž�>A“ç.a¡ãÉLØØ‚P ‹–O5�Ḇ}jùÈò¡�R©4<š -•.”ŠÔbnà#Œ0ƒ †@ŒF`‚PçQ§1wúØÆê¼\))¥„ ”P@C1Hk`Jc„ 4ZK¡ÇF" �QŒ1ƒ˜*ÃRQ–jöa®¥”Ûví*•­nwbzææÛn½þ·‰èJ3C„q0U\c F p»û¥pŠ}MZ¹xðèq©ŒÈr‹`¡2@`0ÒHk¨Í7*Œÿ"•ÿRûº}»Bó·_F(%×ZS†€§OýàÞýµW•‹�͈mÛIž¹~V«‰†ý\ @Ü l;ÁP}´ÝîóT6Ö6’þ€Ç) åQËÆi¸4¹�I¦Óp ¤€d e$€PhÛVà»Å"ó}hYÄB„B@´†‚û€*Ë…ÒÀ¶= �ä¦ZŠRAª!CÔ7Ð6Ʋ½2sJÌ+ùa(¤sU*”,ËAˆXÔE�"HÄŒX ¬VÆ%̡ijCÀ¥0ê5µÌ·MNX˜t»]!c,ãy’$Bˆ2úOÜ·qÈ ¯™(­4ÀÅØC”r£ú©§­z±šr>2;›üá�âøá£Ã~yîÈÑû¾|§Dc¥*S ìø:ÉuÊ-Ä AÒØÄÒ¹ŠHͺ™¾÷ÌÜóK�®¬Í5šÐr‚ ÀaB Aà î×ÊÇóôÿM ò_�Sù¿bÉ÷0aó/zóuIðm­Ž_ÿ£ É{ˆÍÖÖú�ûŒÒi’ „,ÇÃÌÌÞêö‹µ¡òðpuh˜uí�&– ï§jW�À†w²3°¤¹’½ØDï t?6QB¸` ˜TêTD��æÂuý°P²ƒû®$D¢0tÀ8–2ÐñÜB¡%f!a!´�q¯;wòdg³¡SÞÛj©n¤»iÖèg[ÝÍY\CK–ëcËVÈÇÌ1$yH,ÕO, ,A ¬X ê¾B‰¢foÐlÂ<Ï{ýÍ¥…^³!’Awcmkiq}þü©“gŽNz-‘GYÒƒ2Ë;í­ósÍóçúKkºÝoÎ-Vm·j;:N²n/éuUÎ=‹Q‚�¶1ÊuÝ~¿¯4Ðù¥Òf¯—!ÔH³®Rʲ2 ¡cc˱ýÀöÂì\(ƒIš lÛȶ%%E‘ÂP@c‹EñLRDËò}Ûs,æX®Km‹Ù¢Lƒ1ÖZSŠEÔavà›‚.hH#¡¡Ò�K¨4hcŒÁŒFÔb€`Ä( R‚qn)às€ºÑÉ{:ÿèñ¹c'ÅV3Ë2LI}dtÀùøŽ]³—^vèI7]ñÔÛÝðÄ‘Ýûh±ÚˆD" AN·�ŠqŤ¦™Ä‰†±‚}ŽzègäÌj+ž^h Î6ÚÊ »M¸¸¯@nYÅ©±•n·/ñ|§T.�ŽjFW–W×[­X™âÐp+NO.­&¦ºâRÑ®õ hÄIމS¨´¢˜C”)Ü“@{!(U`¡B ·XG–Gœ åÆhjY^¡P¯�Œ3ËUI€µ!R#¥h@åq"ÒÜe”aE®yšÇ‘á’ Ñ…j oTÁhýuÎY ¡Qhƒ d3‚ !1“¥ qm!xá Ï:I =þÙù% ÀpP‘Íèô=÷©Ng¤RÁ %ЄYy&ˆÖ"2Í�0Z€(•] ×¹ºñÇžÿ[oÇ;?ó™?ÿ‡H¤\æYbCŒ´"ƒ�A� Wú8NüOˆTþ9#÷߯\è TJ}“mû毖Zcˆ„ÚH€L³µá»¶çXµJUk@A„!Û†Œh È⤱ºZ¤Ë…¯��å8JÓ�Voytb4ÈòÍV´ºEãÌô#ÓOp.aœË^,zQÒìðî@F‰N¥ÇlÇñ˜í`Â@�m[}%°ç†êV”‡‡ÂZEa¬-„ ÒZŽ�¸Š7š¦ŸÑnŒÛ´��Ho ’Å�Þ¹ùÁù%ÔOz‹Ëísç×�Ÿ\=~¢¿¸Ä·ùæVsñüæü¹AckÐh$Ývgc-Úl´—Úk«Ý�õÁæFÖn©8²¡aF!‘÷ÖW›‹KçN6×»�uõa¯W HH‘'¼ßƒB„¶í1V‚‚ç–JEcl4…À±-ÄÀ ˆ «ÕÂÈpillÇ¡CÀõ%³X¥DÂ@Y,5ÀP6“GY:H3MH¦%u½D hQxVàC‹úµ²S)r†b#S¥¨ë×áJ¦R¥JŒ0£È¡ÐfhM?O¶ú�Os-¡66¦¡ëx–Ã!SB´ÖY–qÎã,å‚CŒ h zbl à)TÁöl±j:}¾Õúê'?wöÁGŽ|åžîò†)ƬՋ ç6Ò ¶]téOyúõOy: Ë+�˜•†ŒW¢a¥6³£¶m––ËV}dxçžêì~X±‡¦÷]ÿÄòìžÌ/Tví¾âÉO~˜3KS(U¦§·ñ4Â0êöçÏs­Kµz¬ä™•e\.î¼âŠ™Ë/=tÑÐEëû÷x3SttÄ�œ@µJCð¡;&^Ô%��m»æšƒOºeêà!«ZsªueÙbH˜[¨$J—ǧ¦vï£aIB*q ÀQ  PÚ±\d€Ì³¤×cy”fýˆBPð\ ÒÆ¡Ä¥ÒHEü'Ó€BÀÂY€:šP`®€B�2äú¼ðÀ»îÉ·®mlm®l\ºï"� ÕOǃbHYõ•±j00*§ºŽÐÊ`D+ι±ì®6‹Yö„ç>ï–¾ÐÚ¶-õƒD~¥ °)#àBv 1 „>ž¯ÿo•ÿžœÊ?ÉÒÿ—âÊ…ê¯ ¦[ßá'j †èÆA(D~êÔ©Z±ìXö…¯jmlÛí ¢ÚðˆëXýn³ÛØ0I†Dî#´u~¡¿ºÞXXIš­¬ÝËÚ]Ñéƒ(SƒHõ�rÌ…¥ ÌyÞ$­ö Õáƒq¥¢T¤™È9SË ¨1F¶=¾mÛèô´S(Za‹œ¸îÐÄXmrÌ+Õ¡ª¸y”ÀLx˜ù�Í�P 6š'qÜëFýVouôúp™^¿€étÁiš˜¬×Ý\ŽZë­�ånc£µ¾nò áR/móAÄ´ ,Š•ÀRúi­¯vš[žÍxÔgZ†Óœ#Îu’Xn­­fI⸖ÐBÈrƒn&3¡‘î¾ø²Kn¸qt÷îÝ—_¾ë¢ËǶm�ݱ磌.½þúm_:{èÒK¯»ù Oöù�NirÛe7>qæÐÅÐó{Bú¥ÊÐÐç\K� ]·½±‘ åý("¶Ã�ƒþú7!çß H"Ñ?5}ù·0ìŸseÿì „B ˜2fSJBß̬H- �j©9‚ÚYmÎ?z|¸V·±E¶©­s”.:nÜ뤭v²i˱;ˆ» óª×1É ÊhÀ ‚žR®R„ç.š§TK‘ OÐ8M¡`³ û±Äy«âÜEOò,•JÂúж â A˶¿Z®LCåç}€µï�j)ÙV.Ö|Û3ZÚÀÒ\YP$Ò~Ó¥f´R°`S el!…T¸©ʤäË´¹ák1z¥ÐÆ¥«�QÜj0 Ušš%¿ 4­–`èwÒ85:L¸4'Qæyžä¢Z®Aˆ»ýµ-Ûs¦Ô ¨*„k �jŠÌ©”{‚çÈ$ŠK¬%†Èe©‚ؤ඲A�'‘H õŠUr%ViC€Ê`¤ éñT# ²|G*%•Æ–å2PÙŠû ’© R¬™ƒ±äufù"«háE�þ©Ë_½¯ñÕG—ÿñžÖ]©“Kx½·~j.�2Bm�P'‰3l6»�µÅµöÂÆæ¹ÕͳËgŽ_œŸ_\]¦Ž“Ie4l®­¯Ï�W�^´²Ö[\ì-/u7W E«Ñ[ÖÌâ¦I[Xð4φwí©¼¸–ZÌ‹™ ÝB¹6«i¡#xpî3{tXJk}yxq¹8µm×57®t“£ç×bEG§wgš(b¥Ò`Â’A_hu×ý÷�°°íò«+Ûf…WŒ‘›BOàB/†q‚¸bš¸È.æšiíúnÍ‚ŽÉ Õ`&r „ÁšPD‘@i¦© )3ˆj(ã )%â)€©Q¹á'HÛÒjUç¼^óO]‰»·ßqw@K¦¯¶Õ&+^ ’¨ç9Ïd.Zq �Pç CÇ/Lí;(F†žðª—¼úoßöœ—½Œ"†`»3©º ÉPR#mˆ‘‚HÝüññßA}7‰�ÿ‡4ö)¡J+©$B¨…øÒ—¾T(D¡,OÓ4fŒa`Ê…Ðä¹Î²z©4hµ²~¿¹ºÊã˜!ˆµNÒ(NúR ¥„ÒB©¡¡Œh¼Ð÷<Ïum¡k[£¥<‹ýV«»Ùèmµòî¤q%ûýæÊjsy£³ÒÜXØ\�[[›_ë­w¢ÍNg¥ÑYkˆ„[ÄñÃRP®–‡ÆjSS£33N¥œBd×jVm8F,÷†Æ´_0~‘j­\õs•J™ë:!Áv–)e‘ ‘K‹X¶çs¥£8�Ì…¶�K­à-mlPÇU­llAæ MOAÏÛvèàØŽv¹¸ïÒËêSSCXydlhd’K`0ëö#7-Ç5`Œó,œk­‚–ë0ÛuBzvû¥×_]ùîÀ(e1»Zvk%V rcˆmŒzQŒ0D±’Æaˆƹ4aˤY/Ž©ë�NŽ d4EÌq¡•A0(cžÅqœ¤)±XÄ3«&XkÛÂ�/–`ÇQ'’ s£zYµ|OBcŒB ƒ ³�g—åÙUy”`0Í2©µH¡0‚â^¦I…YÍÕå…S'ŽyxqîÜcGŸ›;}êÌ©ÅåÅÅÅ…••å•õ¥Å•…ù…³gÏ??jeõüâÙ“çO?vþäc'yðÄC�?òØÙ‡>óÐCË�_>vòÄ#‡·670%Ï4Ã]ðìZ‰ü a4µ›yP"�ª¬§ý„ª”¡”AaaiÑuü}»öv–×­Þ#÷>P)GGG©m!„¤Ñ¥Jy�%„Ñ�;w ÑÞK/™Ü9kZ{‚çŒ$dËéç¹&,7:UX–€Æ.øˆ2i´ÒF#$ȤäÆJ�Å%cžgJ"‹*ˆ8BN�Ä„#ÔÉn€†Û÷î=tÅq§·xfnz|Bf™o9 £Õåe‹²¢ëûÔ¶ FRÃ\b£!¨1„x«Ñ¦Ž·ëâKS¥90cŠ P€@¤¤ÄcŒ/p#ƒ€Æ@C­!ÐðBßÊãã{*ÿüŒÿ= ˜þ_ó½×Fcôõ{NHXZZ‚fY†  -,›Ø aÅ×çÎ}íK·?zÿ½ §NˆA¿„Dk›-2ÍsŒ4#!ƒ(Ô@!56˜$K’$Iâ�Ñ*I€2‚«,åƒXôú¼;�ÝH÷3ÓMû++ë§Î¶Î¯v7[óë­ùõÎÂz¼Ù‚½$ÝlwV7ËëK ËçÎ�?qfîÔ¹ùXòFÔßèt½Jµ4:‘"JÊ5oxœÔG½ñib†Të€I¹ÂRFìnœw£b¦ ”Ê$ç¹@„æ+b…µºvîÙ_©�ŒOOLo™Ù&Ér=95»÷àÅõÉ©`dxlÏP,øcÂñº•z¢�„Tc+ÏsKín¬ M¸�Pj)!ó<¿PUÅc–£ É¤(V+Àõê3Ûj3ÛRJúHƒ‚!°Òï–ÇÇh!L! ªõT(Ï/A‘K Js- ±Ü"d®±l¯\E�—�Bm,«/2è0æû�‘L‰HŠnk„„†ì¹:púHwµÊ-Ž�€ÀïHžB (³+%ÆbȶÂbÛõ,b¥%"¹†±¢Â b $EÄaئ¹Ü„…ÚÀˆÄÇx¼ZYj!àQÌ“XåIšô“A ^ðìJ)¨”üÀ¥¾C}‡Þ‡TÓ¾í 5‚±‘Õ^7%ÄØNõ˽\¦klrcˆ#‰ÝJÄj;Š â�«T×ú]R-•'Ç�ç°r)ZPŒ{ …¶˜в$%£»wjßI–0œ2Ú˜�uµ�Ñ0ðíFÕ!~m·@$Óš9¾Ñ�†¹ „ˆr¥¥®çÙ¶#„ªÐBJ¸çRŸjÌâ¢� Š�Ðå¬DHYÉv™4TiR…ˆúEÜÓyÌ€D*·±±±)9¬âX%>Æ8MqVäƒ8íGžã„å@  Ä„¹~ ÒÆ³ &Bk© @ŒR BZ®ÔyPʈ¤–ÌÙ1ÔkiQ0ÌÊ®xÿ¾4‰:Û[œ³¨×H5†ëA5ìõÛ”`‹³8‰Œ1�NG=6;ÃÜ`lç·5¦gKC£’²¨�Ý$AŽc˜µÑïYåÒÌ�Áð0 C»^ƒ^Гº“‰Àí3Y0ºÖïö¥Baè 7j“ÈseØÊcã¤Tf¥òØ®]µ©)«V­NLŽïÞ3¼svd×®pl 0‡•JŠÐ `Àí­^?JìX>0D)È0w˜4ÄùÜ¥¶S( i,†l;#(‚ª°P/OœR%‰Ö:°}•à€r Õ#’L¦RÆÆÒq„��2ɳ(‰S!ÆvtT^XtzïÞ°Zßj¶mÛgÄtS(‘gŽå+ r%Ï� ºq)9µ{W82ÜŒ£ÌèNžÃC•áaË¢ÕRØílcò4Z_¹ì"T ¼hÐ={úäÉGŽ'�ÌÒ•ù¹• sógÎ�BŽTj«++wÞq×éÇÎöºƒ‰™ÙžtË¡£G¯»þ¦ƒ‡ŽNÏî¼æº+�¯T‡ff§öí¯MNÕÆ'göØyøÈðÌÎòè˜ß Cõ‰É©=ûgœÚ·tç®Æð8·¼¢ÐI’^8wîÁ{œ;}Þ¤’h0Úª„Á Ûá¢H²”¢ ÂÜÆ¶—K•H)0 åp«Èóüßÿ½?ýÛ¿=²s/³}fy@(�ʨ(R5�Bª@¬ R�çñxÏ£1ø ™þ? T¾&ü»�á¿¢|uÌ×ÔùÿÑd€)Dápçñã:´µµ¥”p,òÌ…èÁÛ¾|éÑ“¶Ô¬ñò¦¤:+\Û…"1̰2 �@1gŒŠÔ¦i^d9ÔÇI2HÒ4•Fb ¥,”,€Q# 5’…ÉSS s‘G"�´H *d‘;ŽƒÈò$ŽiCd(Å®ÃÂ2ËÂjAh#âÄäyÚïA)e–çIZ(i{¾0À@Jm3Ç KAÖjµZµZ®”—--tšfýþÆâåÍ•Å3?uÿ�Ü}ÏÙûï¿ôÈ£ñÆÖÙûŽŸ{àÁ‹_zô䕇Ý:}®}a>š_œà¡å‡N®¾G)ÕëõŠ*ž3Q®žºó®åSgëØò%uKd�Ã~j!²ÜuÝ,ɑгE’a ±A3 1�1Ž1.ÒLKe”¶™…1ÖRh`´ÖR ­%!@��FæE`A�T"Ö&ƒH)©1r8+KI �°ˆåCf§·¢d+J!%DíAÔôib9ö¾ƒ{�Z.$aÄ$ÏE¥y" dP •ˆXȬ;ÈÛÝxckëÊÒÆÂ•K§N,ž=ÝYYY9wGIoy%Ý܈××hœ6/^º|ò„•ç~`%™Üh_º2¤Œ×�zgÎ×¥ÇVU'NVΜš?ùpië<‰ûY§iÅ]Çsm×µlNÏsZj]‘fÕr™q«Ûë òÔÃÊð0óÃ(Ës e�¼hìÜá��ÛccáÌôøUWÕöîš½æØÈ¾ýÆ2J¡ï£Ãn½¡¹%I °Êáôþý#;v� €–¥(�®g•+Ô ºIf4vm¯È¥”:/t’¹Ò àLë €`l´46Vžš¬ÍL[Ã�ÚÎÙpf2œš°Æ‡êûw…Sc¥‘6’sã:}cÚY®©å…5­"7ÀPˆ‚$CûA‚`‚.… &©ee® ü %4&4&t`Ï éøÒñâš8 ´RË6åj°k×øµWOßtc}ß^kt¨S(Ãxuh¬×Ë[ÝÔ@Nlžk�+ ¦.g®Å8D{•PÜ굂® „êõºBzemeÐë\¾taùÊüCwß½zñ¼W´Ý½|ü!ØíÖ±ø·ÅÆfçòåñR0ä¹½õµ­Å¥ÖÚÊÌØX£RÖY¶¶ºÒ\Ûholôš­ÞV[¦RfêôɳgO�Y¹²ÜÛj÷[ݤ—qÑÙê\:w©½ÙmmtZkÛƒí~k}«ßì¦ýDeàºn†!Š §„ØÛj %Û½.µ)æ$ÎbêpÂ(fV¢T?/Ri·!¦™ë�N}jòàSo¶S`–*u‚RšEj€Á ×BZdýžV¨Za€1€KC¢Öü]~ùÛ¿ò×ÿDD¢À€,Ë6ÀŒ_üâ EÅöΞ½û ·;•™Ržµz“•.’š ÚÜl¥�&“bŠ ( `˜Ô*ÕÑÑq×uy’€¤ÐRê<ÏÁ„a­ežçišfy"d.U!e¡µºHòX)©�Ér“G+šfºË8“ýL$hËsª «\v«µp¸QŸ˜28.Ò€! ¤©—jcµa["-T.‰F  R[%'(9�o¹áD!ßrBËq{¼Õ!¤µB!Î]Ûuº]DI”Ä¥J˜ŠBCP(‰©ŽÓ|'ÓBŠúØ€DaÌ!�¢à¾ÛqsåÊ™Ó'7ÖV—®\Ž}4#Š B" °Øøwi’O(õÿy òÿ‡�ào°»åkÚ¾fpË×<ðïßþã~—¿«†}-“Û?DXbü¸ ’ ±üð)ÏyÞÆòúÝŸûÛ{>ö‘cÓS*/ ±î4UzZéQH-˜$&ŽlLÆÂr`{¶ãpY(­ÁÄøô±CÇöÌîÞ»wïôøX£„6£Åq_õbžë2@4�’^³Ÿ4E;ƒL�NG%Î [k«"kÅɦ¸#Óô­©M–K5Ïþ^g�ŽLîß;½{GcbÈ®U&'*##qšøåE–\« : �J»"Þ�Å+ç/¿¯½p®¹¶']/  x€Ý¼«TTÃ’)�9FZk ¡) Y¤ÚÁ.Qäùx¥Ê0êuZˆáÀ‚RÅeƒ¤ãôp΢Ӌî@Ë^N™ƒ-g�¤Ðñ¤æ&ÉM.JA@m+…tÙ@gŠê$í6ª>UçE�{Ô(“¤LKb$6Úõ=ÂíÁX£øqyÜäQw³·¹ZôÚE»çê ‹#æZ\æ2+Dœ$q–÷³`Js„NÛÛó—δח;Ûk§Ï<²ÝY»¼tauea}årÞï%ÎFí8΢ŽoûAVh™*`±Ü°>4:1³ûÀ¡ko~òÈ®•©1aÃp,ž®Ù úm ³�H+,¤ŠÓl¨Ró …Q*ûÒ¦„ží ýÑÑÉ£GÇ<ô¤›+3Ó呉ÆÐÈ¢ È µ1µÜ 3!& 8ˆŠÁ©‹‘ƒ�ŠR²ºSVQrÈ¡-c­3hA7�4Ã.·œ¸H4Ös§Îø�Žº%±Ñ+ gºHR!mø’€ªç×�E¢„å™î÷ˆJ6™É½zÙ«” Ôq¿G F¤¢ˆDÒƒ„©Œê)js¥T®sæ2‰5q²¡B i 0 O³ž�:N#H1³­Ìd¹N\îÚ¶Ûë˜ã@† #“<¶8ö«\ �‚C•%‘†<º+¦œÁ@b1Ijå¤\;Ó/î™[È¥À1i ²>±äêâé¿xÛŸþÍÛßü•Oß­´¾íó_þô{^ñò€`;ŽÛƀͮ(4Õ† ’�&¹ÆBh y*ž`*ÿœs|õ‹¿Gͯ‡¦�¿À?>á@)ÍòL)óÚ×¾–#²¹¼T±PäS�!�eÛ!R’B¨42EpÎ|ßϵRל¥Fµ£hbrz|||rt$ïtçOžž;yjuîÒÆÂ¥ÕË ½VP ÃáúÐèÐÄøødµÑ°ÜÀöKÕúXPj@Äe¦³©í„äÌ2AHkÃlxthÏÞúôΙ½‡‡ÆfF&fwí=4»ç/• ¡æ†�ZÝAºÝ�rƒs•cN¼Ð³].UÆò8C*oÎ/¦Ûí¤3ÐÚ–—ç¢ �”bc”çÚèA¯Sd¹, ‘猒"Ï‘Vè(DE]Þ5™[ñ£¹ÈA©E?�2-òbàz´ÛÞ8õðƒÛK‹ª7ÐQŒâ‚ç bù QL-ÄY5à0¢¡Z�–Ë žçeYÖiµã<3 h4ÔsY1·ƒ ðQV!„RJ ³8Ç¡› ÝÎâí$&¾™%²|•E±L2›°Ë—æ—––Ò"- nڙȘh�L¸¡lvⵦ‰ÓÁVsîÌ9ˆBfa£E‘ÅqŒ9ÑÛòËeÄ9â|trÊ©T‚z=¨7\sìÀ�7C£Õéé‘�³µ™™‰}ûǧ§£Ôsw_})}#­Z¹4:<ºsÇÈìÌÔÞ]O}ö³¯ÒM#cÃyžonn"æ/_Úlm–ª%Âh«ÕÚXY^[Z”Iba$DÁ\ª°Xgy\ =£¥QÒ±­0zý>³lÆí^k Áýx�Zô}­ÁÆz³TªAÐju´–Áé ßo·z�vžeÀ<Ï Aض“LnÇQ.µql¿ÛíµZm`°oû@ÀÀömfcH°FR—9µ¡AE!¥PÛÍ–EX‘æžãaµR¡8I˜eyž”BJi?Ž|/D˜Š F¥z1e™&(7ÊPj Ôj‚R#3- F„1ÏóDž#‚sce9ÃKÍÍo}Á ^óÚ×A!%DƒA§ó�w¾ã�{ïó]wddSäç¼ÔÀûЇ, ÖW.sª‘ÖýAÛó\)%A8ÏSŸ`*ÿ“Aå_íÏÿwÉ¿¼ÿ¹Aèq¬·l)%µ]�e„ê"”\ÛÆ°ˆºUÛ][0Ã2y;nwÓ´£�ªÖÊû�]Vk>üÐÙ³g/�?·yùJgq±³¸¯¯Æ[Qs-noE½fÜî‰~L!‚XÌŸšÝµwjfçÌôî»�×ÆÆ†&FgwO::vôXi÷ç¾ÑÃץޝýŠâ¥êÐŒ�–[jbÛ±¸G¹›¨ m÷R¿\¥Ü‹Òbss=I" C´1²\r‡Ê´×œŸgÒ8Ô–™ÉrÍ,‡»NVä�nKÈTˆCSC×ãj„B€a,D‘e bXbÝ7ÙV1È�B†È$Q?Kcåˆ:-D\dqgu9ÛÜÒÛ-ÜŒ0Ç-ˆ2™Êh¸VÉÏŒc`<‡I)£d013�É"Ës¯ì—ϳ :`®‹yÀ}lP»ÛôãÞ Ÿå9·m/ð¹cÛ¶#³H•ôã’ãY�n­¬–�¤¶œ¦i'ÕZ9S¹WöyàŒï™u+€Ú·l*ÕX­Q±�¬ÓM"Õüc§×ç¨�2IA¶mm·ZÛ­V.aŒ¹v/M·{ÝÜ”ýÚP” Qp€IDATKR®Tgf;wíêS*3SáÐðÁc×]÷ŒgTf¦Ë;f®~ö3w\sõµO}Z}jÒ®VüF]SÜôÒ4u];‹£ûî½{aþ•+ Ûííûï¿ïâÙ³OŸi­®éhÐÞX»xáÌÆöª�B«¬·½&£Ž‹Ao{«×j9œ3J5ý$•PÛ¶\Ç \Š^¿U®„aP¾çîÚÛ-)Õ¹sg =R)ÏŽ�…«ø¡V‚²±½½Þj×&'…Á¶ºN�¦9£ŽÃ}hˆ1ÈsC) !H!ó,—’F©”:ËBA7)·ãIœ€ó¬ ˆX6G„BŒ´Ô²\×Ëó#$µÎмG¶ïQ‡'"¯4†£Ò€´Q‘mǃÈêÚ„Qc BHœB‡ë÷œ;ó¼ïñ÷üÄ�FÎ?úÈ«ÿ÷/}à=~×m·î˜š¬†a‘å@(?dÃ(Je¦*<øò§?»zîÔìD=£›Ó<ϵVy‘2ÆžÀ‰ÿ òŸ5røßê^{ü�ÇúϪj_·´ÑZC•RJØ ÝMó``�áíô¶)‡–…,"õuR8øL[$CÐv§&ëCcý^´µÑL£¸µ¹…�±ð(r½ºãÔ8­pêXHfIÜÙÎ:½öÚòâ¥ó sç¯ÌÏÏ]xìÑsgÎu7›P (€DsW¹^Êì˜ZÒñ#mÚY!‘ÆÂÔ][oö“ C èºýÁÀ²,›ó¸µ·šY’r€èuO<úð¹³§]‹U«žc/Î_*ynÙ÷*žât°¹Õ][cP©tÐom,Í�N¶7k+§|`åâ9®EÖm—ûëq8ÁçEn¤ŒIeâ,³¸Í7W² :L2ëÜpb„4‰ BnÔÇ‚r1¾¸pe³ÕÎóK3ØnûŽkû./¹’‚ØH…!`T#¬´]î{Œ‚‚¢‚ÀÈHE˜ <,«WF�°�r0ñ`ûÒ¥µS§ú óh{›F‰G¨ÑZ öKažzí N�eQ¥D·µ½ze¡ÌÉD¥Œ³+C ä̲¹ Šº©ÌÌpi¤Tª�NŒ ‡œ—¹íËFdfjrbbblttvjz¸:´cjÇ‘k¯;|ðÈ5G�ÝxýM7Þ𤫮>vðð‘k¯¿þiO{Ú�Ç®ÊM7_s캩;2)ÛýþÜåËqš¤iª”BeY†€Öiœnl¶®Ì=üPÚÜ0E$’Nžôj¡ë24Ø\—ý®î÷J� ¸ÐƒTôãÙñIÇc#£5Ï 1P�Ö…î¿pï½�¹K—¾üåwýökÿø—õ¯|Í›~ó•o{ÍïüåýÉGÞòÖ�½ííz㟽ów_÷©7¿í®üõ­ï}ÿ'Þòö·üÖ«ÞøŠWÿìçª]wðP™â²eeíö_¼ý/ÞðgŸ~×ûÞöÊßù£—ÿÆûÿäÍ—Ïœ›ž.U+^)´8G”Ô'&FÆÇ4PŒ ’ïùž¨•gµ½#×ìÙ}`zZt:ÞvûÂÉS�ÝÿüÉÇ*®[á–É € �=¶±t%ën�6ªi·uûÇ?¶ððÃw~æÓ_üè‡{è�Ïò£O=ºkrlïôÄÌøh%ðÖ7V ‘X 0¤YÜÜÚ „$I‚1޲4Õ¹WöÃÐ�Û-Ýí�Øn ØîŒxÁ û÷œœ*cèÙ…î»øà= �Ü·yþT¨òýCC»kÕI;˜t‚aÂJ ˜ÖvgmñÏþðuÞsG÷ê�[vìŠçLŽ�›<µŒ>¼s×=_¾ãŸøØÔ¾=Çn¾Ñ©W°Ë©ïhB�ã4¦&w=4s`ßÄž�³öz�**¹îpͪ…T› R>tõUĶúé`xlôSŸût³ß�e:³gÇþÇvîÝåUÃ^Ò'Že,œi‰m«›'ƒ<� ᔂAow{N†yàW†vè  ÍÂцݨ´dÚCú¾Ó'·úÑs¾åÛßý–w~åÖ/OÔë;'Æ¢~{kcEqõmŠCÇq- +cqª¡Ió,ŽR�‹€±}SãÍ•ËYÜ&Øhˆ ¡J† OŒþ*ß RòÏ5ö¯cñúz§}üí?˜¾¾1\�fEn Ìz|ø)"”Ûnày”D-Ëêö{ÂhÄH®d€ëzž[$je�<°´ð‘¯Üúî�0%€…ž2:‚õ­Í8Oc-šI?‚r`T@a*u*‹"O²¸ ¨ÁÄØ6õfZš"1YìÙD¦½¼µ‰];éãææàü¹¥{ïé/­mÎ/B 3© k „r!€’ÜqW××.]^�R"eÖ›KËußß½{/Ƹ×ë÷ú±ÌŒÎ�­¸-Y´¼½zòü£§¯œ<=ÿè£g¸ÿô#�lnlXÄ¢�?uæá{8òôÙ{|ìÁG¯œ»”lõ˜‚6µ(aÜq &Íf+ê§£‡íþ7Ÿ|÷+÷¾÷‡¾ôW= ­Î©¹1Ɇ$MÎ/ÞñÞÿõoÿñÂ�Ç“ùUÔË}@âÍ-¨äÑ›o9põÑJ­4¹cÊqØúÒüGÿêýoúÃ×ÿÉë~û3ùë3?¸táü©{îùò§>õÑ÷¾GD½c£;&GwOŽ]}øÀH%üë÷¼ã=ozCe©=éÜ=wßù©O~ñ£¾÷ÖÏÝÿ¥/þÍûß{îÔ£e—ïÙ=«L1Èc¿Q*¨ê%�¤Ä`{n��ñ¬”ÁžN7ºÛq¿Z¼™Uè²ãíݳïá;ï¾ÿ¶Û–Ξ>}ïÝgî¹ã¯Þú'·ìƒ_úØ_ÝûÙOßññ�®�=VPØÊúI§<5ì�5úPÚÃÕêìDKäÊ¡ÚeµÉ‰ÆÌDu|Ä =+ ìZÉöZÖ¿ëüÉÕ¸7¼sö)Ïxö}wÞ7ìW÷MÍê$4·Z­m„�JÈ4ð¸m1›²¨ÛMº}•²–e•Ã!X­WYÔën ™ídÒ(¤Ô£Ÿhªÿÿžûëëq—Œ7_³ö¯âŠTÚbÖãŠ1F` JƒÔä"ä^¥œYFª<Ï!„Úe±Ñ½<ƒaéÆoû–þ�—¿ðòÛ^òƒw>ò`”&(…í:CæÚvèC— Œ%¦�Ù† ÆÆµi¡ � B@‹Bf)�’C�"v,Ró�–$vóx 67Ö.Í/ÍÍw:; …Ôôý0,o6·½ ä¸þ£§K¢ä¹ó­Í�²ïûåR«×[Z[ bF,Ÿù(‡[ ß~ï£wܳ|úÜÖüåÞê-TÔî>úàCg�Ÿ¸2wyqnž„•Y¿²µz‹«�ÜõÀCw?pæÄéxàcûا>óÙ/å®|è½ïùóO}ñVÁÈΣGnxúÓJ£#4pÛ›ê8îA#´H»ÛëýÎúöæÒꥹ '>êÄæêòæêêÂüÅ…Ksss.œ;þ±3'|(j¶?ôöwßõ™Ï…¬=v>´øÑ=»§«õ¡«¦gvׇfK•ý£c»‚ên¿2Im?ÊF!­iXÓ°Zèªïb‘£, 1®s~djú©‡�lœ;ÿ™7¿ë��|Æí§OÝ{x_m,,ÀSö-ez‚‡û«c£ÊJÏ\ùì›ßÿ‘7¾óݯÿ“?}Õkßð{ø{¿óúWýâ/¾ñ�ÿèÝïy×›ÞðGï{ß»>û¹Ï`#}›Uo¤QjøÜi4BÏI½Û¿ðùG¼ï‘¸ryîìɇ?ñÑ¿Ù\]Þ¿cºdW«ƒ“»F†öNŽï›� \¬d§¹ùùÏ}æáGƧ:¯O�‡s×�Œ”êÕÊP½Ü²J~mr¬1=ÎC¯V«õÛ�ùsç†ÊÕZ©öŽ·¼måÒ‚És•$¡ÅapÃÁ‡g'wׯBDÑc÷=ð‘÷¾ÿ‹ûôÆüe’‹ºë†Ž56\/Ò(ðÝí­ ‚!ÐfkkËH•GIÚëíݱë[¿å[¾ã;¿ãËwßñ•[ÿV»ÖjwûÊÆêÃ�>¬ >wîÜ™3gNŸ<õÀC¬¬¯DyÜ�{ÛÍÕå¥î¾ûñþ¯ÜqGÉsCß·,j1j1ZdI!2âðå­�å­ÕƒÇŽÔ'G†g&“ã�4Û³sl¸§8ß³cß5W7¦'hè!‡÷Òt«Û3N"C¾=¹÷ìÁ}»ŽÓtlx IÝ\ZUq…À ç2oµšAäy.‹B¹Ãm� �ŒP’eÄbSµÓ*ó÷LÀšgÆ«—ZÍÍ^¼´ÕÜѨ/©4|�C }Ù•b¹go¤[÷ž_üÒ#ƒ“‹k�žN7v•‡ßøšßGIþ#ßý]6P5Ÿ:÷TÑp­Ù¡ŠÉúžDÖ+âN¡û)Œ; _”a‡&…£´£�¥úE'CiOwÏsK8`¬¨zèæÃ»¯šsI•fÒ(koe[yr¥ òñÀ½fld†ðI@&%9ø åÆ,Àa0F­QÎ+ˆL…aÝqŽ[å$$Æ'ªf_eU¤†‘™²)èn4¯œyìþ/ßûge{s<´AÑ·¨ˆz-£¸ÛQØŒ_s ðÉHCèçn»£•«§=ÿù¸\1ŽlîŽ�9˜Ö‚–�ÙÔh}×ÎÒØ$´ØäÎ�n¹\*•®¿þÆÓ?ôÅÏ~²ZvJ ÀAE€’çÊ¥Éóƒ»w�6ê�c{ŽxÖ¸ƒª:rÍ  [ Ç~)Ķe”¨yžÐ rHó–«»ûÆÂïùÖoªØä®ÛþvþìÉ/~öã_úôÇOßñ•ΣgÛw|ù¡µÏßyêCŸxìßœ»õöû>úá[ßÿþÅãÇO¹N ¡’6®V>ÅÑ–CŸ!·¾†Ab9xãõœ?ÕĒ;[Q¬ç• i _Øhîºîºoÿ±ŸÐŽÛWP2G"~ów¼àÇå×àÈЉæzÛÂ,\\‰( XàF† BJ-UžÆ�ç$yÍ•äYb”À(ÊPê¸ !à¸ÖFsÍ lÊ �ŠÜ%ÄÅ(k·î½í¶¹Sg´�ŒÚkë[­$Ê‘yé/ýìï¾îw.œ;“öz#ÃyšõÛÛ%ß³€ô1ºëÖ¿=õÀÝ͵+>CAh�ë<2ii¬ºmçET/{¼ælgmeekaɾTlD›ä˜)§l¯ôWQ d*FX9–Ê®íñ…ÕÅ“W_3qà ᑫf®yò�ßú¢«Ÿõm¹7¼˜¢MìœnGgûéÊVw­ÕO À,OB,>HR �[+ßò̧¾õ]ïP²ø®½ð³ŸøDsy¥Â]”‰¤Û-¢¨³µíÚ€1”ZaŒ# AÈ­…Æ0nٮìµÖ… BûÄâ„�¢ÈÓXÁ äû*˱6¶EõŠMqžEC�K91®K‚�SN�z½Qe„BhÇñ<ÏqÆ-D°”"IÓ�Ã4  e¹¡A'€âBª R%®Û—ù@É¡h©Eš q×ñù í ¡‘6–V7,DÒ¤»¶Q$ÅÜÂe@YÆxef²:9|Õ“®EZ×üÐ&l~~þÊÜù©FEƒ;?ý‰dcÕÒiÀ4‘ý2†8ÏCßæ¾Ýá$“I«½¥r1>42hw�Ö®e‰$ÅJ•K¡eœ] I��'ƒ¸Ó¡i6â{õ ”¥â�‡=tÍèµ7_ÿßuõ‹èðw~ß5ß÷c/yÃ;ìßò¢W½îçßýç/yË[þ×kïÛæç‚=û®¤Ù¥NëJ¿U„|æú«.¯¯¾ç/ß{äÈÁ_ÿÕ—¯ÌÍm]^4›û§f†Ke&�ƒ05@¦i €ñ /³(Ír (· æ‰$Ë’4Ë2­µç¸%Çe�LP¥‚]JKž«Dž'} ŒJ(s�%2.C¦H’¨¥óÖ�%ÆbêHA(B)¥¢A’æYQ!„”êñ‡cL&2 B@ Y$©É$P%P«Ÿ�(�P”W&¦p©ÖfêðÕÏxÞó›ÍžÒØ ªÏzös>òÁ�dít|b[V7‰c½,“hi®ÚwÈGö‰{þô‡?u÷WîMÓÜJb�ˆrå¦0@bß.N• Š‘Zj£ RÚä J …@g'cl 4€„6DkB1ã”sN!‚i¶5?ß[X\YXÈ’¾ÍiP C™H#Yž¤EZƒÀ§”#„d�|Q°FH3‚mJ,a^ˆAR à�ò±RƒKð¥Ï~þ~÷uP›¬(šív{0È•ì ¢Tʰ\F„eÄÍõͤ#i*N0^J¶{že'Q ¡!6‹DlDPT!€Ò �2+´ÖJ©,IÓAä*‰’Z£~vq~×±«^ý¦?ýýw¾§-A’BJÝ(ÎŒ1E!)¡išâ'Ò¬þ‹4•ÿDóo*£ýÝ—þ7–ó¯~æ_¸Š¯‡+ÿ ïc „cÎþøÃ|ßíûM?þã7×÷xú3¯yη<çG~ìÕï|ÛÍßó¢Ì¶%g…�¢0°@#ÁP–à q>;›†!˜ß÷¬gÿɇ?R¿êÈéÍ�“kks�Ö…­­�,é(ÕÎrÀ9aœX¬ÙlÕ‡õ‘!d3æ9†â~–XŽ­PÄ D–åù¾È �öm‘Š­•ƒÄ˜“pl¨k¤¶í™{2k·¶66Ö|ßÃr­Q%E­o,=vfõÜùñjÉgÈBºº[½ÍÔd[ƒnŽQÀ" ÑèhëÛýÓ—{¹^Xßž_kZamµÕ_mõWÑz?I rJõ°6’ä�9#ãýÂÌ­4/®mGÚÚwÍ“ñ÷‹J]*Ëà�²0ŽS­Lï�NÙ®ÖùìÌØ5×<÷Å/þùW¼â×_ÿº_zõ«âå¿X®Ø·ç¦¯¿úð¡s'O^>®ÄÀ³§Ï¥(Âb×ây”"©@U×÷ˆÅä ra@\ Tr…P¡CÊ+–0›jhr¡2a2É 1…¤;ÜÖJ(QmÂP›Ðv-€¨1.ÂAKk¬%*ò4ê Q­ó(É£ŒL –…Rh¥2…P Æ,J-­PÀ( ¥…†  ƒDô ¨V†FÇg¦vMz�a”6·o|ê³Ãêðñ}ÆÓ¿ifjç_¿ÿ÷}ò ÷ÝûÀèøÄÞýƒJ#êÙ^Å çN�{ãÒ‰óóº­~. „XÌHc�åùÕ^?]Ýtcµ¹•ëC–ã#J¹gdA”D0TĈeÀ˜"Ê $Ú $Ï ­„ÂFh‰ÚUDu«]´Úy»;=>66>¬±éåñf¿¥m¬!ÈE%‰ÖÊ¢¤�*t(Th` „cl�.”ˆó²8ØI[1`¼6¶wfOÑO;~¢ìÃõ†–*Ï„P m4LqEýnϲ,NyçEZôÚ= @>HÊEšdé 3hQ'Yœ§‰Q@æRe2!$„(DF‰’´×ï/¬,ÑÀýÑ—½tlvw¡­\q‚í8UœÛ„ „�R…m[Ox¿þÛ õ_íÚúwÈï_¯œõµõy¿A‰å_-÷A€ÿéèñâ@ AϘ±£W}ó�üð·¿ä§¾÷å¿üœü¡ë¿å¹þôdNq�³™o"§f�QL¹ë•cg”K/åú¯üÁÿô+_sËw~׎o¡StbªcY—Ó˜��b×.”_]Û«µX‰•NS3ª¹•B 1(]™œê*Ù–*Ä ¹1‰s ‹ÁLËf:`Cáó¿û»eÈ€BŠòè¨æ^¬ÕÒêÚíŸùüŸ½ucai¸Úèõ�H$d+N9³ëA½nWéÆùùÇ–|äB¬­›øG¿õçñà·?÷s¾å¦ïÿÁ©§=㪼�íÚK÷lÚîñ…•K[½3K›Ç7þöÔ¹‡ûƒ¨4§÷ ©/ýí×îyòS�ã „Š„ÂPŠƒÔ¦ÀÆ„%€’#D u,[vû}á¶�¿ý�'>÷ÓêÌŒŽQ©çÏžY»¼� úƒ^ÏqýSçÏ-®mBÎ µµKA™S·d�؆\ÀìZq…dS�qbp˜$H"¬à †(S* (µŠ\–Jµzmı}eÐúò¦Q¢¥ /p|b0ÇÔ·}Š©…m—y2‘™4‘F“¬PIª¢T%¹‰rÝKD'Σ\EòL§‰Î$j»Ÿ V¶�Õ'g½Æ0ñBêQ&(s¼ 246ñ©Ï~bfÇs¾å[æ/Ìýð‹è{¾ó»yèÑ×¾þ÷~ú§^öæ7¿õ¯þâ/Ó8V…X_\¾÷ËwC lfGQb0žž©OLÅ™È3)0“Ä* 5Üåµá=×Û{ìºý×ÞP™œN èD)&–Ô@#’JÐËr„˜e¹Q©D˜P�˜‹IfåÔ* P‰(ó€JƒsɤQI>39½sÏî°^ G‡bYhB#¹R¹’ˆCqª¥Æ@`ÔKDˆYŽ_Ê3M(/ׇ`½^Zäzlt깋XC‘ J¬,-´BŒñ^o@�eÙNœ�n? ¦ ,r™&yÍöGÂÒ±}{o9võÎéñB$Y‘j`´�JhY(%dZä½$Jò `…aq¤õÏþï_¥v �e3ßÅA ±"Žh´yžeOàĨü=30ÿtû¿¢¦üû¬_ÿà €A ]×·¸«,;¥Lq§'’» RaA(\·¿Ý̺¤ †!ÄA`ŒZ0Æ9uv/í½ééO~þwÓK~ú^ý;ßþ3?·û™ÏRco¿õ ÛÁ 2ÚòËÄ/ÝôÍÏ '&/µZwY¥Q`g­ÝsúBb‡]l÷¨sj}q[$C#k«–Í¡»úöïý^¥Ô`kÛ#|xlÆ®éÑ“§æç—××°"•RÝñ«‹[�Õ¤8µÑ:¹Ö~äÊÆåíèÌâÆÅ+[+ƒç>ï…ßû}ÿëW_ñšzÉÏN:RšœÞ{Ý ×=óÙ{®»a÷u׸ñÆç}ÿ÷?çyßö¿^ös?ùc?5Ô_ü‚¿êWëÕ¿õ»¿úk¯úÞù‰çÿäKä'_–¥ôS¼Õ)ºÔè´#óV‘lØÙZÑ»‚q’m^†í�­S}â�ozÛ½öâ‰ã³#u®%Ó"Þn]8y’i½wfF$Ùþ}‡FÇöºŠpG(”KØìô»ý´Ýé§…DiçqTÄQ1è'½nÒdQ"a¢¨ô“4Îe"•„ˆpaP/É ƒsÓLrî) 2 ö]u]c|§ v;ýT À2‰3‰¤Ò°4Iª³&9Hr˜K¤�E]ß­4¼Z½2>9¼kwej†e‡ (÷é8C¶S '¦K“3#{öÏ=6¹ï@cv«T•ã›îÖ«�Éщ ¦vÌ”Fë;ì+ŠüÔÃ�>éæ'¿âw_ó’ŸzéäÌl¿ß/Ræø½÷_Y¸\.•*�:¼™½{Ÿüœç4öîÝ”¢¯MŽév&Ê�ñ±™c×û¦gM½Š íßã�Žw¥îB#Ѝ‡¬@WÐÀ@Žˆ[h(.4”Êh!„[™Ásh�y‰4™ý¢Òl®ll-¯÷Z= Q¹Þ@6‡®£0”CÛ…¶�CR@,1)€¦’ðÑÄ ¾( •ë§„o+Õ”r+N7»ƒñé�®Wв|³ÓK¤š[^zlîR¿�+Íf¬”€ÐÃùåÅ3ó—=sæ¶»ï"Ž×‚…�}öýõ±w¾ÛDƒ‹çÎJn÷:ƒ8+„‚ˆ„6@a@”& ëk=Y¼ü7^U™ÀnCžtãÀv}×¥˜X—|G)·˜Åù8ñÿˆ¥øĉ¯G5þfóõÜh_oõ¿_ø8¢¬Š(·€Å±)wý²†H)ò¤…¨•KCE;ëƒÀ\J”S‰y76‰ ÜZ:� l�ÆDa… Ü@“37}Ï÷½ì­oyéüþýËËwžŸ»Ô잺¼úÀ¹K«I‘ú¥6&§×ï?y¾›©'?ëy¬6üàÜÒr¦ŸúÂ|úÿð¥xpûCXž¿¹Õ¹éIOݽë°( &Ôg-€ŒÕoþÁ¶¡¹ãÑGæ.Ï7[ý•õöÂzÛŸÚñò?{ëo¾ë½¯~Ï_½ú}ü‘×ÿQxÝMí‘‘¿ö5õ§ÞÜ8º×«>tú�¿yÛ[ÿò�ú±÷¼ûž¿ýÌÆÙÇ6N?öîßû½�¾ãíêó~ø¬ßÒ¾ýÙÚZûüÅÁù¹¹[ï¸ë³ŸúÔ[ßtïç>½~úÄ]õ—÷¼çýŸüõߺÿÍï¸ÿÏßûù7¼á+ï~ë—ßó¶‡?üþ�ýΫþèE/zïË~þµ?ùÃïÝ+»sg¦JŽƒD·¹:wñ±î¹sþÒÅÑ¡ÆP¥2T._}øÈPµ¶cjדo|ʾ݇+¥¡R¹n{e–k“3û®96¶gÿôþƒ3Õ&gx¥î4†­ú�=<ÔØ¹{xÏî‘]{&fw…ÕD–‚Ûu½¢¸ÐÛÝ~šªN7i¶cȃêÔŽ=ÇnÐNi»P�BoöóíX&’t=(�¦>j̯{Õá¡™]c»öŒÌî:tãMGn¾åê§>íðÍOÝ{ã“f�]7zðp}義knÜqýÍ»o¼eïM·ì»áæÙ«® '§r‹odiZ¯YõJŒA�Rqƒj%œÚ3S8ðø¹Gk#õ™Ó[ƒ¶í#×^û[¯{íÞügG�½|e~hdxtr¢>1+ RÉ1:öÍßüÇü›—ÿîëžòÜoÛì†ÝG¯£ÕÆwþè�ÿÆŸ¾é—ëÕ¿þšßý‘Ÿú™ý‡¯ýù_õϿ╿ð[¯™8zÍž§Üòê7½idÏnæ/xá÷¸nn ¨¢$yÞ�¥4îÐð[ÿâú¶·~ûóŸÿÌozîoýök_ýðÿûW ËVa4F¤_±Ü¡ç?ÿûù7_;wiñãüàÞõî7þæoÝþh/.dÍ�þÒ•oû܇Þõ¶�üù;‹Ö†é4O?²pæ‘»¿rëCÇï<þà�·~ê£w|ö“�~é¶Kó'._>óðÃw}ò#ùðW¾xêŽÛÖOŸzè3Ÿ:}ûí‹Çï?}çmÇ¿ðÉGoû\º4¨Z™€à† r�;ãZûqÌúƒÎÂ%Lˆ~ÔSJÄQue¥µÙ\º²Üïö/ž›ÓÂn8::¹ÿÀ‘«¯¿éðµ×ŽìØQÙ1»óª«ö=²ÿšcGozÒ¾«¯ß»wòà�ѽ»‡wî˜Ø¹{fÏž=û:Þ(ב†[Í­µíÖV'Ë %u§íþ É ­�Q`0ˆ³´È ç²¥�4Ë 06¯ÍÌ r |gÿM7ÜòmÏ�Ø·ûª›nê¦éc û*öw|ûëÞògÏyÑw^÷̧ÿ̯ýÊÌ¡†âjch«Ó²ïÆ[ž 0xäþûÞÿ¡º–µoÇ. k÷î_8sîÙÏ|öŸüéŸþé[þì5¯}Ý/ÿ꯼ìe/ûñŸø‰ÿоð{¿û/záw|ç žõœçüàÿ(¦<*T&5÷<ƒ`&2Z‰Â¶, bQ„Кʲ¥þÓí?âÈúÇŽÿ*Ûøg{¾&ù w_ýù�Ðü HD£�J… Í5pr€„ƒ¸] @¤²‚ÀÑå€bÌ€½ PdñAWœŠÉ4C„È `V@9R+ s†±(@i l��àr°÷šÃ/þ¡ë~ì'nü¾8úÔgÆe¼aoöד¨©:k½3Çg|ˆ¢åŹ»¶.­h?ÿ¥?û]¯xùØÞ©ãÜzkƒ‹çÚ—@Ú·â˜o·Åæ–쌀ozÒ�Ï~zNQŽ�A†™,¯ÆsójeõÒý_ùÒ'>ø¦_ÿÙüþ«ç¾ðiºzeÖeû‡kû‡Â�%gÉÃ�ÆžRig)Ü]+ÛE2âû£~Xæ>ÜçÁÈÈX¥„eVFdO½:Å­]¡7°‰º;5ìO�€ík\5;slÇÎõáÝÕ!®�k1 —Y"Œ81+KdØ¢%Ÿ…ƒNº´°¶|eyáâÜöòÊâÙ³ËgN�?õè‰G|ð�{:qÿ=wÝ~ïÝwÜñ…¿=ÿèƒkË‹Ï�¾ûÁû¿tßÝ÷zÿ�gOœ¸pöÔÉSol­÷²A;êo úƒ¢PJ˜Ï­²�\™+•Bz´VÝŠ·ãªý£ûfÜtí¡¯�Ü»kffG}x¨(²^ÔnGÛ.¬l¯-µV#Ñ[X¹¸Ý]ßê®j €€ëªÇgÆÙäH‡Â6@Û‰Œª�Oj¹¥2„˜{þåææRÒ�õ8Ô²Yk{ëÌcgu®ªÕúèôôÙåEÅÙè褎%,ŠzXÆx–?66å”*V¹D«%·6Œ*åž‘ý$½xúlÈ}¡QÁmÛõV×›^¹<7?¿º¾VnÔš½ÎVo›Õ|è¹¤ÑØ{ÓS*;ØõÑ�{îÙ³olö _›˜Þu˜yæV,§ê…£{÷\·óÀѽG�]ÿÔgÜôôg_sì–�³G÷íºqzæÚúä¾êØŽÙ=‡4fÁP£>>éúBb�øº•‘ÙÃ×?åÀµO"a]Z^¢mâ6 .AZö*Acçðž«÷\÷Œ`ïTŸüÞû™`dFºµëŸ÷¢[^øCßõs¿ñ¼üéŸ}Åë¯{ú·w#“IVh†ˆ}èÀQ£IÑŠÔÊÆ™/|þõ/éÞøú»>ü>{}´ä <Çs¨³qañ÷ù•Ç¿ð•õKWp=4Ã5ºg7™Þé�îÚwð¦ë¯}úÓŸúœoþ÷p¯ ±0!`r(�GŠ ¶�ÂÆP¥!ø‰i*ÿíÊ_ÿ Ïüš`þå†ùo\Îù÷j<ÚÒÆ(µÁв Â…P½A_Ú¶¨Ñ@ ¢P‘‘2¤€Q®gono) S‘k„!&Êhæ;~£Ô�:�CMtZÄÛ³µÊµˆtÒT(˜$ÑvX O?ö¥�}ôoÞþößþ¹Ÿýý_øåO¼ëÝïøÃßÿë÷½ûãúÀÿæ+ÞøÊW¾ãÕ¿óÎ×þö/|× ßøë¿úG/ÿ¥}î7½õ7íw~ú'ÞôŠ_yÕK~äÏ æ;ž÷K/þî×¾ì§ÿø—~þu?õ’Wüà÷ÿÆÿÀ«_ò£¯ú_?òË?ð½¿üC/~ÕK_òÚ_xÙoÿìK?öÞw^|è¾2CWïÝyd÷ìH%t $ZI&²jD!Â@¥¡S@.…RŠRJ0“R*¡1²8c")d.Â6aEœ&½ˆ âPæÛÜa1h1fÛ6c,:WF*X¥ö‚²ë…R�¼–ʼnei€×箸¥R©ZË•”ÊÚÄI"lõúsó—æ/_Îsa ÊsQEš¦Iž !’ARÅÆÆÆêêê‰ÇN­¬¬ôz½ W.]Y¼pñÒÜ¥…‡ŽŸ¿pñÊÅ‹Wæ..]^¸xîìöÆjs}­»Ý\¾¼péÂù¥Ë .Þÿà}�œzø±ógŽ?r|naîÒÜ…‡�?pü®{O?òÈ™§V—–Ïø‰ôö{÷l'×6F®=435Z Ækáž±¡}ÕÒ3÷^~îÁ}‡Bo(¼àš#Ï;´ÿ€gpð3¦GŸ29ô”éá§ï˜xÆÎ‰gÌN}ÓŽ©çÎL?wÏŽoÝ»ë¹ûv>kçÔS¦Çž<5zÃÔèõÃ{êÞtÈë 8*…I_F]SĤÊ„!Á� e,Ä–esî`DB”pŒ˜–ÀB–M-Ïru¡ˆ¡œX Q ³zؘê,“I¢òB ©”QÄ u¹0îcÄ1ás)± æÀ¨0$B‹9”ñZ}(ËE?Nχ„jˆ¸ëˆ+Õ:BX cÛ¶Ã]ÆÄ²ìrPö¸[ B‡»¥ d˜øŽK)åœKm Ä @¥”R*‰âÕå¥s��\¸xq}e¥Ólž<ñð©“�\¹tqs}µ¹¾Öl®÷’n?$"F SUž•]ß2ÆÁ4í÷V®,­¬¬l·[½A¿õ{ƒ.æ”pÔËÈf½"uª•HJ¯TÙµïÀèØ$³\Œ¬R¹vôÚkë#cˆÐ�­f·?Ÿž��ó|³Ù”¸a™9@Td1G+(…±-* C‰ Úµ{¯_®lõz�,ÞN;잘™ôKA³µ…‘†FÈ,Žûíþ “dýXô¬ÌH‰d$¨MVK£ay´T/¹uOÙªS´—;Ëщt¿™´šY'ÅJ0ƒL@ãWËÔsRSôU*ŽŒÔ÷;8¼cÂ8¤'“©œAZñ2ªí‘2¬ÚÖH <’q“qy{y~cÑó¯zÅ—îü‚fa@žwšïy㟼åu¯ûkç½ozÓmý¡/þõ‡ÞòêWÿÕ[ß|ÿ¿P#ôº(øÀ8yŠú]Gd’JÅ„*De‘õˆNg|ïi³³?ýŒo~ÆäìG^÷{/û–ç½ôß–m­é4–Œæ6*i€1À@�°�X¬ ú;PAA  y¢�þ¿#Sù:Ñ/ÿÕ‚Í×[èßöà¡ 25@A1ãvEÀ›Ñ¨×>~÷�oónûô'ŽåöOþåû>þþwÿÍ{ßùî?û“ûîøŠÎ3#t§J‚©†Æ-v‰[÷ãu)FÆP¤È@o\<óë/ý_ýõùC3ÃSe~l×Ä�{gŒÔ¯ÝµãšÙé@‰¬Õt ”&K‹^àQ®rš x–$ë+%-¯¦pˆh?í»Y¿ªòTÃTL:Ûbun7�¸oú°½…»Û^{EÂ’ž•| †\˃ e)ÌS ·,Û¶¹ccŒ a”ZÆBˆeY„°ÇG+:œm`Æãs °.4Œ’ö³")Ö€BdòÜä9)“§Yžça ,™k%!�L&¤YRµP›r‡ÚTc�«$I“$¥”9Ž«ƒr¹T…sn+¥j»Žc!fË¡6„L1㘺Ìa»=jl¼^*1LƇFꕪïû”Z£cA5t|‡¹w(&Æ ãyN­V±=›Û”rl€¶)UKžç@d<Û©7 Pžã#ÛîÙ·÷À¡C^)œœš²<ÖÏ¢�Hzy|žB=0ÊnhF£¢`Žm{®2 ×�—W &ÃSŠáAžò´›Dí¸Ÿ#ƒ=ÛBȬLéB›¤Ès)rQ‹u»Ý^¯§”ŠÓdk»Iæ–}h“úP�XäÒüÜÊ•Ë#ÕrÀÈh9(sZÄ=¬RFcÚuqmc�çIgeiîÜ™ƒn³ÓÞ\Z˜kµ××7–VV/_¼ôXsk9ÏJ¥R¥R&qÔkolÌÏÏõû]¥…4RÉ}s’æ‰aèÀÕG]}dÿ‘ý»öí.7*,ä^½¤ „ ¨(R•bWê%„•)â[nvllfæÄéS+k«™(ˆmI¨Œ…�ª'ˆìQi¬ƒ¢Ù븡ç‡>2ZŠ”[8Í¢íÖf³×V‡«¶Ç…. 4~è‡å°y&bB�ïÛy‘8Žå¸V^$yÜ2WEZrí"Oò4ª6J^èìÞ1Y²y‰3*Ššm÷—W£µõþÊÒúüÅæ•ù¬³eÑÝn]^X>}výÜ…µ¹‹g|àÒ©“k/,_¸Ð][k¯¬¶×WóN»µ¼Ò[]EqŠ’¬½¼ºvþ|sîÒÆÂÂÊ¥¹Íå•ÖúúÆÊJks½³½¹|y~{}½»Ýl®¯l¬,w[›Fdí­Í¨Ûémo&ƒ®Lã’ç”m«êØû§'Ží+5]*}×3Ÿyxtì�õ×þð×~%[YŒ—/ßûÅÏu—çÏ=p÷Êc'Mk«F‘é´P4ƒž�±G!ÌS*$Ís®UÙ¶�Ȇ]×b6c.ã>c6T'½mu«�ûÎl9|×ë_Ôî E H`ñ’P+‚ÐH#•VÊhýweoø®ü7•¿—RþCjÿ7 �|ƒóçÿ�¤�‡&a °‘�i‚Š•KçïýÒÓ^ûÚ#‡÷îœmo7Ï�:ÝïölΧ'§«¥jhÛÂg�ݦ6…câÙA†j�Än®>ö¹Ï¼ýå¿ü®_ÿµÏ½õ­Sg÷Vê“nXwû8N]‚Jžë{N% ™E�c9�¯€Ù„Ë\+ƒürU’¤Eš B¬‰Ñ %´R (­ ”¡¤0R!…YA­“v®"€rL„˜Y~©T*•¹íƒ²u ¶‘¦Xœ¸Žå,f3Û!„@€•RÀ #�h PJ)-! áܲ9áÜ C˶··!%cÌ,ˆ‰Öšâû¾ãºB˲‚Àó}—Y”2dYÔæÔ±yèyPk HeÆØqÝR¹*¥6¸^�æY¿ß7lÛ¥”F•RR+„"S‚(‘Z+ ÐÌ"Bˆ,Kò,aô:ÛIÜÀøaЋ“A’$…ÈŒ!Üu‚2¶x¡M¡�F[¶F„2;Ê[ ×!åÝ4ç•êr/õ»3GŽ\óÔ[€ÍˆkgR2·,Ë÷ý äo÷Ú©ÈjcµT§†�°äT*ÔÇÆ#Іz(tGk¥À&@$ý­µ¸µé ]¶ˆm$,’€€�c)ˤ6(†^õiÙÅ5Ÿ›LÚ�Õ+ÑæJ´µš÷[.ó��X8srs~~ûÊâé{îM·››—..Ÿ9-·Û—æ–Î>vùÌ©õù‹E¯µ6w±»¼ê1^õCKcŸ:ÛÇ…�RsÄBË£Ò�þ`c»»±™4·A”x”0EYNйô£í-1ˆ k—ç/œ3Y“¬³²7[ÛKK½õõ¬ÛK;�¢ßeZÊ8J··L�nmn_š;s×]'n»}îžûO¡-2®rK“t›K%ª'*A…áÑÐGI„µ”Y,ò,é÷9ÁFhl4„*PsK.²tš †V)^Ù"«8|2(u/\ø¥<ÿÄ'?΢�•Å1èäb�É1$€Ú@£�2H¤ 2à‰ê×ÿËLå«[âÁW¥ÿ3DùzbÉ72óñn„àq\MŒÀZ‚´ûåO~äsŸüpÔÞzòuǦÇÇVWV(!4†R;(%R÷â̤ìll,-,�´ ˜Š–°dk€AF|Z)Û ^X°'KØsŒÅ%± Œb 3�´Ò2§È<.G”ׂ¸äòÐå*‰m”!·|‡†%ÎÀL‘q4*ABÆ í(ãcı1"MÓž©Í·u4´„¡…B I ñ,àÚžåØÌæ–e%ˆ�œ3Œ±1@jX(mÄè§mfL4*¹ˆ1H-ÈmŽ©V NU/1…dyY(mˆØóKÜv m$` p+Mìz–üÍ,Æ~ ¥–9BÚòyÍáU£]|ÎÊØÌ.•+#RÀ­�íZuHj˜—ši–$±…˜m{¡2(ê Ç.két:9ç%n‡ý~úÕÑÊÊ+ø�;•�%ëlÇÙ¹"Ý\KÈyyxtßáý7ÞRݱ›•Wüæ«~ðûðÁ¯Ü�¤]Ï „¹Çnxa²½}ùôéõù…�²o¾å)L”²Ó›?s~áô™µ‹ó¢3H6¶º Ëë§ÏÃí^kþJ±±m¶:aZ��æ°4V»Û=waéä Ò„ÆØ¢ ©scz]®„ôH9EdòV)ˆ»½å+5U\œæm+Ä›ƒfA�@@A„CG"E‰O][S’g.¶lHˆq …ª�Ô+£Z`�S((Õd¬2\ô (`�76A�G¤ € )5P¶Ë]ß“Rj­!bÔræs†GÆÓL8Aɲ=© ¥6££Ôó< ´ÐR�˼€XF“j­Á™X>‘°H ¨!¥4IsbyˆzE8²9 6$TPûvT$-‰A; Q­NˆQÚóm©‹8醳°Ü¿säØìè î{Ë;á™ß|á‹_ÄE,‰Ì,Ù‡™ñàD`6=1NøßÃT¾¦üð5kJð¿``ÍWŸþ·‹ÿÑMÀˆB„1&ƒ8öÃ2aÜ@€1†zž!ÔZk-]×ö}Ÿ`¨Š¤ÐY†0%¶UˆLĉò̉ÓXAl§Ì²mC±å»Ø³iè 2) ÆÌµ¨Ã¨Ã-Ï!S@¢ “c B |߇A ¤”›››Iš"LµŽï„ @Ôb!™i”È\!€Èl2ˆ@„!õwãR�1Ð CH°†@h%�VFÄÓBL¨�ŠPª ˆŒ$4ÒL™íxÜuÐÿé#„0Æ·r)0¦S±2F( "”çBowúY®ü Â-�;K•’Èó+Ìr”†R"‹0€¹í•…BYÄòóá„9©Ðà\ñ в%a­8M ÃÝL"'È!%^ ™•j¨™mWë�¤ˆñJm«'™¤vÐO2�±ÜÍín/Í�°Ò—b~eeas9Net„ØŽDˆzÞìþ=W?é†û÷ÖÇGfwïÚs`_®ŠÅåE ‘Ls b‡Z.c6¥%?ˆú)¥�`tt´–:�N–eÂ~¿ßn¶�µZÝföáGÕº…-#ÌpX·4&s,Ç厛dyš�PQ’fi.áÜñ·GÇ&½ L a0³\/ðÃ4Îâþ íÆe'lTR‚°Qš@„ €Ò¡±†" AØbŒ`È,j ‘RRJBQ¥yŒ³¤�ecØhÔ$TI°˜_©F‚ #¯TBŒ!‹Y¶‹M’!Ôé÷Â0¤„ W«u©RªÙlE�1-ŠýŸ'HÆ,×u}ß7J)BE–Û¹´™Å™…!BYŽ ‚’Ì‹b[©N˜S;R€WêáØdmfvǑåñq¥ÙÉ™kŽì»þÚ‰{;f¦öïÝ{õÑýG�Žì˜�dÞŠÍ^G¥Q/ê�T«E¥íŽNS$%CØ"¤ÓÚîE=ÆyQä˜b¥e¿ß#„¤iZ©Ô´Á2jqéPc JQŽâÌQ b!lÌÓ\!ÄŒÆRÇ \/ m7�QîÇÝhu˜åÂ\æÔü258éÇ%7 ¸Ü­–ªy.JAÙ¡.Ç–ÃxฮÅ=nsJ�ÊH„1aÄõ~Û-·~óV/\æû´ÓéŸ9³tá¶hy4›dn>\Y]¿ëΕ;n?ùŒg´×�IßãósÍÇÛ'�E« ÝÓÇ;'×üùnØï´Wë =8™q™�9¡K=b€Ö¦r=jeYÅS†mÍu‰1Ze ,kˆAúŒ¥„1 B(Œ%eq¦Õ“×®nXJ{ ‹Ìó Ân­9Ÿ$éáp‚©uÐÀ*H wx` •�O&³,«|¯æ5©@™ ¨(´À*”L3‚(„Xå9>ÆÔgE”@‚Da BÆ(‰õ ¸Ô²P¢²Ærb8JqN]—„…,…” ZiA&å`<Œ'ÒXLÆaŠcN`õkuÌ]×�ŠJbL¥ÔIœ• ”]ïZ)N™Ã¹µBh!Ê`J(çc¬ïû@ƒÈ²$¥„@¥”cca–e”rŠIU”" �µÐ+ Ðj %†Š"À r˜W�×Å‹²ÊâD—ŠcºAeTRäˆ�•Vb}~žB Ò”aTê*‚º@¬„~:Nøë!Ôÿå¡åKܾ®üåæ%ÿ\»â?÷³@ˆ0Öe­¶!D¹›eBÈZ[U&P)…%„h­…”J)k-¥c|¤BÝvòÄÆ“O=öÁ^yì Í7<çÙÇÏŸ³®+1Ü5ˆÊ­¶dDj ²ÈZkµA„À™—*ôÆc€Rì2N1±Ú`¡±"×ñµ†©ÑHiH¨Ë<Ÿ0 h° °B±€PB">: æÀ 14Y †€XH$&–;Øó‘ëÊ*ŒK„$Æ9€Iq‰qIq�qªÁ´ÓJU˜Z?2Ž‹kµ±¨fÖ´VVÖn¿Í�ëèÀ û‹çN÷ޝ9í6~¡úÌé{î>}Ï�‹çO·ÖWz'Ö–Î�ê?6öôê-–o9æÞ{ú§O4Wšk‹sgŽ÷Nó:Êg î{ýv¸Øë�\sÛµÔ §õ�-5º^;ršA ˜¢`íüé3wß~üÖ Çn¹åø­ç;ÇWRŽP3<¬Ò©953PéåÜ’š|æ´‚æBÇ:xûpwco#É,iSX g“ƒ"�G‡;£Á¾ÇHOŠ4–YjòÔ™K‘5Â÷˜ëò²ÌWVº�†V¥K‰•¢–€îâ¼á¤Â èµR#ývC˜H¹7™äÀzÍ&tœÊZ±1YĹC)óJ”’Q‡^•ºUo‰JW¥:¾²®…E�"ƒ­E€ Џïõf)�ÔÖóCB˜±P*Sˆª•PRZ£ ­¬5 #߃ž¨c˜¹ò<êzÒ©�ã¹Ñ0Œ0q€ŒºE¥¬AZ)L<Ëò¼Ž u€i¥üF£0».u= vÊ]îz[;{ÖÂz­™¦¹ï…‘‹´²ŽëG͖뇀HYƒ1Eèϲ5󲈋 qJWZƒ)B@ Eˆ!Ä0ª(ÑkD s÷rkJ€J ¡Ü |/’ÒîoV”uN¬7VºkKókKë'Övw¶€È9FR ˆw™TÂhI(Öúé9•¿4¨Ýd¿°Æõå¿Z}ßǖ¾*•´¿Dë„i`0�# i6›¾ï*-dYTeiµ9úº @#H0€°�2•�€ûn½ÛŽ'ãû>þ‘O~øƒ£½Ýs'Ncüz�7šÀ�   U®µ°‘nà2BHéQà¹QÒ`Œ1åâB‚²2’J!Ì]æŽÅÈõÃJ›Y–VÖ”ZîL+‚樋Q@( ÔR S(c�`iAiAa ‚T#¦1Ó˜ €+ƒ¢ˆûbÀ]Í8‹êÜ܀â Qå8Úu¥ãHÆKJ¥ã ZÃéôœn¯wlÕ1@õååóÏzæÂ™Ó|®=wöä™gß{êw´Ž-Ñ^£{bõÂ7Ü;f½¹¶H;a0ß9yÇ-«ÎýNo}uñìñÎê|m¾ô¬áÇ"çSC¬Â’ø8•I\Í ™b¤-�€"(­)]Y[™ÖGä1Ðeä3`Åp°g�¤Îež‰L!eˆq#;Ýí7çWæú‹]¥’Y<îßÜß¹q°·9Øßìo瓃ÁîÍl<�yœ�[›ÃÝíñÁv<äÓÑáÍ�­+§{Û°(l‘ñ4ž ±Q¶,ÊéÄfS’j³PoÞvþœçRJq)KËáâñŨ�¦#¡ª Îòx{¸}Zï6K]) ´SĨ@(©�ÕÀæyn1"œ¥i>›%”yÒ¢L[…ijì¤Ä€s…�‚¸TÊ ¤ ŒF §ÐcÀ¡¡ YÅh‰€b #ëz‚P…N­™J3«Dnl…�FT‹ GÄA�aâ�q\¿ÖZ˜8ÂX×�J£KÝz�ùá,Ï…Ö^qÏÜכ ? µ5­µµc ÕÀ•´˜0ßuýÐb„OŠœzN¥di”ưÐrÚèuJ%°N„-Æ!�HZ(5(5,•ÒH æ†sè‡ €®ï\ÝÚ=œ¦#­Ã¥¥…3§[+K¹(“$áœh�’¾ëX •’>c"-¦Ok*9P9º#ˆ¾|KÕWE;ù<¢ð¥ äX¿ùËŸ§±Ö«!Ä"”õ(8v|m¬Fˆ"'j­Q¥M¥u)TV‰D¡[¯MË´Önø®C­u(½vñb™ç•Ô–xÚÂ|)%®Å$3j* @˜2; Rf2À cÓÂ$•[Æa………U†aäqI`ªUn� ¸ÂH ¤ÖJ'JVÖJh0Ò¬¡XQh2ŒF%&‚Ð “¢ #ɘdNAYNHN˜¡ôÈ&Pn¹]¹>rÝÌØA’íÇIm6¢~?ê/Ô–ÜÞÜü‰ÓÍÕ5¿?×Z[Y½åB}y 7¢22pAÍ©Xq€"‡4|XsqÈŒ Ç‚XI�&@aíÔ\‰T\e£t,�Ð@Q½€¶»5+SÍ8!3H&PÄ ˜fÙŽe:Žnî\yr¼³!¦ûWžØ|ìá§îÿÄÎÕ§7¯ ¶6®?õøl¸ç`C€t)�éTfc‘ ‰®Bb7¯>þÀG›7t2ÃE6ÝÙ:¸qM̆²M†qU”ÃÃø`·šL&û{"‰�È“ñpº·gË乞Åùp8¼¹)gÓtx˜í:R�777ô4Nö÷óý�dr2I‡ýFýôñµ�±~§M1J1hO,/Õ"Ÿq6¢Z·‘©"S…ƶ0ÂB:LC)¡>Ÿ¢Ä 8Ëò Õ�­ÃÀ—…¢$lµ„µˆñ,/ 'Øs�ÃE†Ãp(�BÕ$¦¥‰Ô……š2èûµ^Z™Ü"Þê*Ç!Q-Q*­$¦.a¼Ùíµ:=LYQɬ¬¤< -@Äq£fKcì·†³\)M¤2"µŽšMÀ,‰£zM­„‚YJ©FÓ™PSθ4ë† ­Æ8SB@+¨€ÉŒ,ŒЖJ+h ©À @£‘VÐh,ƒ–Ed d¡µÆÐB�a^yéº+nyñ«^}Û=ß0Hòƒ$ϤD�øÌì졎.p ÇÈ* µÆŒ™§›¿þ2 ò…]¼_EÞð•pûÕ6ý*àÊgvZPUataq @C1r8B0Æ „ŒqBˆ1Bì÷|¡M^U^›Ý$PËjçêµ*/’YìqW[œÒh ¥±•JIq8�‘Öj %J!€Žë"îÌsi°ë+‚5E©…–Óþ±Ã›7n<õøÎõ˓ݭƒ�«;W.q-™�55U<3Ù, ÊÉDfI6×Þ‰ÂéÞnzxòt÷ê¥áÍ &%ȳ|8ȇªUƒó!\U°(°ÝFD­.â E#ô„VˆVz„€ªÂRRcTšø”1m=„e’r p)²Áp¶{xóâ•Ý«×7¼ŽÇ{;2MÓñø©G�Ç# d�2S•ÁÍf½¨ŠJ ¸a«N#Ÿ…¾[ÜZÈB'jÖ;‹½Åµ•ù•¸Nè¯?Öì¶û+ËÇ/œ[<}bõô©•S'ÏÝqkÔnw—–Ž�X¯5šµzRÈ•˜¦q’g¥’ÈuÃf‹õ}'‰ã² [� ÕªuÚ85w¬ëÆJÕú½°Óá~ ltÚŽç&YšU%óܰY?êÔ'SÌî{£ÉLZÃQ–å.uyQ•Úš°VgŽ öçô¾ðT¿ÌlÊçÎÊ|.òa!°,ÒB㡲�¨µ¸ëlRŽ‚Ð‘¹ôYJ^)èuF¸­$R&`ŽÏý*WVXÇ÷—OoÏõövvL¦¶†ZaÞ¨y«ËY§›7z•ÓˆZ a­Ãj�õ˜viÁàˆÊe°ÝL®ü0ƺ䠠jRM$ [ä;¼Yׄ 5$Ú‚Êè8𳨍’ÒÑB# XQH­ s=ìqÀ±„¶2†¸¢.á‘°$É�ïÕýZ§0d,áN\*%¹‹‚°·¸J¹Ÿç%#Ð]œo[™»pæÄsŸ³zï½Ë·ÝÑ]_—®«}×´ƒ²Æ�nGA®e©*ê1I´ö�pŒa@B­Ò„”Z-PJh¤Z;(†bfD"e¦uka!¶rTÆ,tò<ìíîog£­ñþ•Ë—·®Ý¸yéÊÞõ QÀQ–."£ƒ‡Ôå^£Õôšõåáú|³¿Ô—V*Q0ŠzÝB*ž�´W·wÂ^�×¹±Èñ’B8ŽKs|¢*óˆ ·� '¹dδRie5àžÓ@–:Øs‰§s•Î2æ<¬Aæ æ c iX Ï!xˆT³[S¯i‘*¡ rVÍö§XQ-a’H£)B;Iº?K ©÷÷÷o\½‚¬¢@Ëf¹ž&$VpfA¢¬¤l"'6D¨Æ d ¤4Qi>t=C}mPfQqNpD˜2ÓîÔaÄœ€GuëE£`·Ñí®BãåÓ[k„Ýc½`±ÙXí#îÄõZ'ðB#Ôt­n[-Ó¨/œ9[ëtS!§yÁkuÖnâF½ulµ³¼rýð 2@•ÐÅ5Æê9À�‹l\©’Ãi¢ ¢Äµ€Œgqñ.Kd™çsÄU&Ê0i6%†2äÅ}¿£•+­c03êrhÀsM+ê*/œ(=Î 1@Hh1­,Ú�&{E^ù˜ïûkË'ŸqÏmßøÌg¼ðy�Åù�áá“;7ÓrL r¼ºáQî#-{ýÎöS�<ô�÷`k�–a…¬Æ``�~*¾æB=øªf8þ/²¾’„@ÖkÀ¬ÝîXˆ(å�PÏóŽ ðÈôÂñ\L©�F‹殣€Åœqß3 cr%ˆËë½Îúùs‹ëëË'OvV­ëT çdÍŒ©0aµz  H!Ri 4Ô`âx~Í"”­*)*COY˜ä•4P#" °Œ³0’kLJc3¡åÈq-¦Ê"'lYÄ%¤ ³áI%2kaäûý^}q¡¾¼à͵¢ÕÅΉc‹çϬÜzÞ›ïÍŸ;qæYw�¹÷®wÜÒ?y¬¹Ô {íHãà“Hı´²EVf™$¶ªˆÄ+”®�‘„Ä K]d²ÈTYš#;Ë"Ê|–L‡PK« „T¯]KÓq•ϰVñp°uãê“�=zõÉ'‡;ûÓý�”"ª…Ìeí^{~y¾Ùm6{í°Óh¶Û~:Ü#”3Ç%œH*a¤²„:Ü (q€ÅJ\Î|YV›×®»ŒSˆTY‰¬°Ú@m±AZH« ´€ J)EˆpÆD)¡EŒ1J¹Ð*ÉŠYÇi:Ëò¢’ÊX €Ti+¤®„OŠI®LRÏË|'Á(5¶�zš§ãÕ˜ïÏ?Ö_[uêuà¹õ…¾Ûiy½N†±ò\ Ý^[z|(*·?W`P[˜Ça03J1JCz>ôÜL©þÚZÐj×õÚM0ƒ<+0„µÐFþ�ÙÀï÷žùÒ6W—Lèd@m¦i2O”2ŽãXK)DÚ¢“É$Í2ÂìðV¯ 6"Ì „Æc H>-ª|MAåK©ô_»¬û¯5hýö·X,²j¸tºýB€ˆ2ÆK(E*«„’Ä(õê9ÔáqUh¸ïQ×!žS+�5œI‡‘V�ε�ù.›kùKK�“'ún9v×ݧŸõ¬“÷év;'N¬ßsgÿÂYԩǦ.®".ë®m‡eÈb¦Ô¤Üä&ÔM9r¦«Äêăm&òI2MÓYDzÈt™›<ƒE�ÊV%%(K™fåxœ§»{éá�˜MTœˆdV%‰Hã"I€¬L•é<ÑéĦÓ|p0ÚÞL†£ýmO8°Í0¬Gµ ð(Äu/°Êˆ9ó·¾à÷"E%ö`Ô ¼ºk‰ÍŠÌÀ8u=¦M™3¡ @±´ �J`ÖWÊH±ëS7À®‹Î]!œÆéáþÁd2�ºo6£F”@”Vä~ü£Wxã©G‹ÉðìñÕ[O­/t›…�o·Â…åóh!2ÊIRÌP­ùñÝLkàsíÒØ–]»¸= ÒYwq~iu0R)µ›½•ÅúBïô]·5ûn§µtæTse)\ìÓf]ºn0?¯=7èöZ+K�¥…úâbÐïù½¹ÖÂ|³?ï·Ûýµ•ÞêJ}¾¯¹S̛͊³˜ý<9(²{_ü‚;^ð� 2Â%e2®²›û»£Ù$ɲ<ÏãY2K!u–iš§išd©ÐJYSH•Òõ¡”±ˆ Á˜zZTùÚ3•¯ÓÔáWÃ}òK�ð'7_¦á³jAÌ´E½þR%-ÄDj1Ð ­…Bˆ)¦  r×Áœ1×q‚0ª7Ãz-l4üZ­6ßó:MÅh¢…àTyn4Ë«½§+«¸ÑÔAØ?}fýλ.|ã7^ø†ç.ž¹àö—`½mÂÆ Ñݼ˜ê-w®o¢ÈDQmeuñ– çε�¯·�¯ƒFƒt:ÑÊZ÷Ì™ö©SõÕµúêjïÄÉþ©“Çî¸íì3ï=qçKΆKó¨U£�P98C&'ZP+¨QY—) ‘Kxè;¾c *¤JŠ<)ÊÙx¶½¹}ãÊÕ½í�ë/o_ߨºvmãòåá嫳[ùÎAºw8ÛÙŸíŠY¢+�­¡!¡±G O×u1DPjíJw.b\¥I7ŒêŽ£KáQÞªÕ•RY‘WÚ²²jC&q)$L §—ûõ(ê8õÐk5ks½z®>7WŸ_h..µ––›««õååhi>\Xðúm®Û^^X>s‚×¢Ìh§^«õº½Õ%§^ó;-V�*ŒÝV«½¼Ü\\ º=¿Ó­-,´—WüN»ÖŸ«õçÂÞoÔ½v§>?ß?¾6wbuùÜÉ¥3ësë«á|Ë´â  ÒºÖbI¬ UÁ«U¹Ö…„…Ô…Ò¥AqÀB|Ì#îÖ9ñX­Ss"ÏoE< ‚N³·²¸xìXØ­E½zc¾S[hy­¯ùµnkñı°Û’І‚fÐYì°šç¶£ ßôºMÖª¡ÐG��ýû�[kxÍVÔ�+”�“¢*5DÌõÇó%€Cp„m‘LG{;ÉÞöæc�^½rz®·R‹n>úðµG™îÜܸøøÁî •OGÃÝ<‰*î Ê<¢´V&²”ÐÎ-õ‰Cãt6Íb×wÓ<›eišeûÃARäÒÌ™´¦²9Ž„¶ÞmŸ<öØÙS�~·ÑïvV–ýVË0VëõWOŸnôç £4 £n÷Ö»î^8~<šë¥FÇJŽŠ|fTgeé;¾ï{^ýƒßÿŒ>¿³²¤0J•‚®£N‹\½{xH­„,¥Ð©ó¢Š“,É3!JD°Fh£1^Z]!Ì1Z Žªöi=åëVþúr¢÷×yâý/<_Jöÿl�€µ_œ“}Ö­ÔBhâÒZ³Å/- ©ÅÑt¢9êý¢ ¬-BU•”Rv»]×q¬µÐZBˆï‡~9®� 3¥¢Ìd…9WkLr£5¡á c\oàZ Öj¨Q¯?Þ8±>wîìÜùs‹·ßÖ¿p¾söL}ýøÜ¹³+·Þº~ç]‹çÏ·×O4V×Ü~Ÿv:ëwÝuòž{N?ë'¹¾V[]^8sêäÝwôN®™Ð™˜*#D¼@jTÆ“26hd4R˜k¥6•È“<™Ê"�ŽGÃýx6‹giž—YQfyé8#Üanà‡®ëznàq�*©K¡r¡‹ÊjK)s¢Èo4‚v×k4¨ïkB¦ÐñX-òM¯Þ°˜iƒªB")¦¢”œ:µZƒR×XXH©93>SŒZN¬ë‡Gssµ~¿±°Ð^\jÏõssµþ\­ßõ;MZ‹PàãÀåõÐm×½NÃiÕX=tZ¡Û®Óš|ª(€Øà€KdFÙ4šk´–æêó�¥ÓÇšK=àsÅ! \ÖðÝf øT1`=blÈUYéJ" ¡.ÓØfºŒU6“q‰*Rgˆ*—Y®J˜Ç2©bfdJ¬42õ8:Ë‹±�ñ`¼3KFÓ|\!ˆÔB— ‡UF�fãÃé8© Ëä”xõ]M±&N}¾×][r­õ…n´Ð,™á½ixÊ£0ôY³�ÂÈ� ‚åùµ…¥Z¿·°D@R¬9ÒðÈu#ˆ<¾ºÒŸëb æ€�TÓáPÉ2™Œ’lœg1:òdd•¥Á]üúº‚Ê×:vþkÑ„ö¥Äù/òúû\Gœ&+r°µ¶Õî‡Ãªª´ÖGM"Zë#›Œ)çœ1F9ÊG²>ÆŽã8ŒSÌ(&JH-+àQ0  ÈJŒ©RF�Õ Fw�ã”JJH-dÍ:®…3£FU‘heÎ¡Ö cß�WiŠÜZ˜J™m¾£)†µZfº° (dfyœ”±�F�fS-VW¹Hãd4REŠ• Z5|¯øífkea±Óé4­(ŠjQ£Ô†:®††R„ÖáÀá8ô‚¥~mu¡¹ºP_è9Í´QS“œ[×ÅaÈ›M·Õ Q`]žD£FØéµçˆ¸a¸°zŒz!D,Ô �ã8�ºßª‡�¦ÂÐíÖjómRóŒKHèJ4¶€#˰B FX)€ÒÐUU`0†ÚH!*e5ãÔõyVÎ,¨òbf�œ›ogù8/㼌¹‡-Vy•([B$ÆVRåq:ÈÅL™ÌØRÊTT©…QCP”E<OÇ£4™hUB$-�E™Ž¦£Û�\|ä¾GøÔýŸ¼ïÿÔG>²yåÒîæõÇzàÒ“�l^¿´uãÚàpçò¥'}ì¡÷¼ï=?ñˆ€úîg?óeßúò¼è…Ï}îs_ò‚¾ø…/ùæ—¼ä%/þæ—¿üÏû¦4ê­ííÝ�|âã<ôÐÅ+WGãéh碌«4•ÅÜ|ïì¹sÏ}Ñ ^ýݯ}Ýëä{ÿæ�|ß�¾þ‡þþ�ÿÐßÿñWÿðœÖ3mà ¥‹rj•d{®S«·——Ožè_ë_‹–»ëëÝ“ë­ãë ÜNgþغD˜y^Õ\?äÜ…QŒÃ°–e%#ÜL0BÐVYŠ´ò0"Ú4ƒ°æû‚*K�@I]•£ƒýZà[%1£VTײ’UaDµ»½•Îb ‚ØZ›$IQ•®ëjkó<ßܺ¹³»Ö"LÉÕ×+-ߣ” !Ò$ 'ªRJˆÙhº^•æ “4MçRÛ4Ï…’B£µ‘ª,˲Ê+Y2‡:¡ûÂoy$¢£î¾£¬Wc´þŸihû¿ ¨|ÑGû/Ê ¾*ŽÅŸW+ûlªÊWVaûR5·ÏËkùò ô¹�ÇŸûé¬�ösã¹ßvË3_úW¾ë‡_ðº¿õ²×ýíW¼îï¼òÕ¯åwüõ»_ð­ë·?«½vD-àÖy£çÔû Æqq­ß}ÇK¿ïµõïüõ•s«"›¨Ñ¾Mf Œ|¯ŽPãba­V¯{AèûýÕcn­% ðŸ@4Ž”È’•‹ÊY)ó%ž(}‘å76fׯ6.c™¹H �BX ª8±®ƒ­©¤Ê11P%‘ \¨ˆ­( h¤ª~«Ù«EÕl¢ª$ð(§@Y�±ŽïÙr†¡è´ëRY9)M|ÿã×°jw»qÔ*aF£ …[œNS­­Ê‚©ëù5‹™@8TC ( Q»Ž#‹ÂØêÊÆ•g~Óó% 9Hß(Wi€6aŠŸÆ”ÿ=Ê__óß»ô™AȿȮæè`Ì*­!œó²ÌË,+²Ä(-ŠÒjs¯Òê´£z�»fØb¤­)•,T%µ’FK­˜Ã!FÌh%Ä`¤€•ZTª’²’Zh­�Ñ„!„@ i„Ô•ÔeÉ8 k �¹ XUEš¦E™Y£0 FkY–ež$Y’E!ªŠPŽ)gŽ vÏZˆ§Ä­„¹~sg<Ë’¢Ê¥�K™ KÜH#*.•ÎK!T%­¨dQ–™Èã²Hû½°*I&”‚¦,#EÀ’ªã‡åt–O&ÙljÓÒAH¹,JQà¹Xk�’Ñà0ŠÂ´H5¼îß<ض b—¢ˆ¬ž:öÑìMÿå†&¤n€IDAT� ¯N®®@�"^›‡5'ݹZ’ŽkµŠGB˜Å0+Ƥe6.fc¨ò2ÏD™‰2-óX‰ÒeŒªŠTKµ·»3�¦“a–̬1²”ƒýñ4N ‚»ûÃÉØB<šLÇ“iœ^»xu|0ÚÚ¼ùðÃ�Äi&¡}ìÚÕ'6o<¹qóÿä'|ìÒÕ ¡ì|áÔÉ3¯|Ù+~ào¼þe¯x峞ý�ßü²W¼úµßýòïxõ]ÏyNÔî v·onx.ìí2Œ¾ï»¿û_ÿ³ö[¿õ¦ßýµ_¿åìyn 5Ò£d¼³9>ØínMvn>õп÷Æ7¾å×ýOßöÇ÷øƒWžºøèý¾o©67.Þ÷á÷½û]ò®w½ !Fh k °ƒý†Ô¹^’¥Ò”8œyZXe÷âïÿë¯÷[Ý�>ðл?ü¡K›‡I<βa–ãéÍýÝ�ýýÝéäÒÎæ�Ñ~ m¬d!UÕˆçq?8<Ï[ZZB"†˜Ç[Ͱ×k¬,;«¥ÐRÉRc˲ÔZ·u •ÃyxÉ,v)'B`TY` |ÎT™ak€RÔÚt4ìîøœak’É[«+aDéPä:ŒbH€%%‹L‡ÛÛ7»ø¡·½k´½ázho´9NÇ7ö6yÍÙï$"ÖXÄùd¶v.n\Ùn o–26&w™m¼Õ \‡0Ž<�CŠ2M³™�EžçRÊJdãÉá‘)½Öã¡Ð ¯´ãÕ…‚¥Ô‘Áxçe^ê§.^»ïS�loí?ùÔ§Öºëùßô /}Ù³^ôW~øïþÄ÷¿þo¿ê»¿÷èoœ>}~ûæv2Kw.o|äúëÿî ¿ù¯þí›î?üÁ/þç·ý—7þÚÏÿÂÆå‹²ÌöonìÞ|èãýð»ÞyñÁ>ñGôÈ{?üÉÿöŸø£?zÿïü·~÷·?ùî·?öÑ=ð�?ýø;ÿhãÁOõÚsˆ'éÁÎ�Çî;¸ñd:¾ ålwã©kO<¼sãÑûøÉðþþoÿ€”8!uü"+s�ÅaX÷ý O„*4T+bÈ~ûEßþW_õC?ì÷KùÔÍmRo>ÿ[^ñÒW×kÿÆß|õÿðK_óÚW¼î{Ön½-C$ho–]ÜÜ}ôúÆý—.îÇ7÷oìì\ßÝýð÷ïÌ&n݇œÇ�ˆBwB‘N§e­NҙѲ(2­d3ŠjaPe ¶:ž�ÐHQ¤V–@éxÄ t´¢à2 ˆ1"�³Ù¨ÊfP•jd•–YU%¢H1TÚ”…Ìf*Ía¥¸Õ lJ#Òq•ާ£ñtÄ|Ç�| m§Ó¢œMã™–0væÂ­KkÇ�E0°B¨�„Ÿ~ˆ|*žf*_¤üõE\gþbó4†(ÖZ-‚@l­õ¼ ÙlU‰*/Ó)† «Ué¹”``�Ñ¢¢K#5Ж  aqŒEŒ*£Áˆ"ÄB „ˆ0‡RNþì`˜bBbÕëƒ0�G{y’b]×a¾ƒ8!.Ãu}×ñ=âʉãq@! `0bŽ!ÂH!"!ĨC im&µFsauµÓ_Ä~ˆ}Ï©7 ¡…6J[4¶Èãl6ÉãqO (ÒÙ!EÊêÊh1� ÇÃAOvnÞØ¹r-ÞßÏC¬”íâB¿Ñn8‘Wï5»Ký½Éð©�kÛ{ÛÛÛ7®×ªÕNŸ<ÑhÕ5¶OÞ¸WÅÁl²y¸øQ2žš4Yï·³ý]¤ wk'ÎÝYë­øíëÕQЪ-¬Œ 5)u¬ì Ës ßðâ¿ä[_ùÌç>÷ø©“í~‡pl‰0Ÿù­(høa3j÷; «‹Ë«+§Ïž9sþܩӧ×N¬7[½ù…Õóçn?wËÝÏxæóŸýܽàeßñܽüù/ü–ïù�×Ûw~ïk~ðGþößýÉüëëÇ~ü}Ãs_ŒhÀ¼fÿÖ» ñÛ‹Çýî<@|c{ï¾û¼råÊöÎ(Ê~Ô¸óĉ;�¯oµÚŒ7^ëtt™3`¬”>eÄØNXc• EUÍ&j2Mv¶ÁtÌÓxŽ`:›ÀɨŒ/Êr{Û†p:Á³I h˜NŠƒýÉÖfÛ¡ý(8ÑïÝ{îì§Öw.=õÞ·ÿ!�EO�¨€*ÏòY‚*…B€‰WÈMA†�sÏzî�ÿ“þ·ÿÏú?õ3¯øžj/­óf·²DDz€±èñ5ßù}ßùšøö×ýÀ³^úÊç½âÛ_þ]ßûmßý}¯ûk¯Ù·}×3¿é%çžñL§ÛÛÎÄåáø‘�­Ëûƒ½q:LÒ4¯f³ÙöîV^¤…()§UU£8§RVŒ“Jd­v-ͦB¦Æˆ²J8ÃQà(‚Ð™ÍÆi<Ѫä y…ª*“i•ÅÔ*dE‘ÌÊtŠ  Ô�*3DYibª 1a„¶š0±ÕV)«4¶ÃÙDjUiSi=š¥q^yµ6 e®¶¶ªª£g8­±<­©< *ÿ]Ñ_†¦|ÅÈBJ¸5¨,$„°Ûí65NaœŒË<±FL'CQfjUåEžÉ´H3Y•F¹B¥”2ÚZ[TBˆP¤´ðf­ÕZcL0Æä¿_Œ‚pàz­FÃs\d´Ëx-Œ<Ïs(s£q*”TÐb‡!BÁ#âp'ð©ïj sQ¥e‘k© ÕÖ@«ª2V‰ªV#×ᜆ¡_ÉÒB0¨Tže1À�­F¦RE&ÓØ5*t('xx°¿»½³³³3<…¾??׿pæô­§Î¾øyßtïmw´k�3gάŸ?ììéõ g—ÏŸ¾ý9ÏzÖ‹ž¿zrýYÏ{η¿ö5÷Üs�ç°<ÏW×ÖNÝv[µZM)µ°´xâÔé çïÍÆÓéÁVÍ�>Ÿ¸xâô=«k÷œ¹ýyÏyñ«ÖÎÞûÜ—}×¹{¿é…ßñ=/øÎïù_ýk¯ùá¿wÇ7~³ßZÎÔc—n<~åúõíÝ‹ׯܼ¶u¸³;<ÜØ½¹up0+²¼£é,/Õ$IFÓÙáxréÊ�«×7†ãøâåë;›‡W¯l=þðåGïüÁÿ>ù‡o{÷¯ýÚo¿á¿üúïþá;î{ôÉ�Ýÿ�0è±'.¿ýmú¯þ¯Ÿþ“wþéù×~çWë¾ûGœóF£�€.ÂŽ%Ž•*6 È‹¡–U5™ww¯’¦z4¡Æ€¢DZÙ4) áz�…l’R ^k[Ëñ�ÆQy%Í?ð‘_øùÿð¾·½«ÜãBcK˜W[»pÛés·­Ÿ>×ë¯ì ?ùÀÀðgÓ‹ž÷âo~Ék¾÷u?þ¿ÿÇ~âEßú�­ÅµJZÊ™…ZÇáé,~êâ›7o@‡£Ã½ý�ñøÐ%dŽVVAjE…Êã"ÎE õI»ßBnïnçyŠ­²²4¢V#¤H”L!¨ò|*ªTÛÜ!U^”qžÇeÏâq<[#Š2C + Å¥Õ�’Ãé,“ÒR~0ž6{}a±AŽÄb,üŒzútéëiPùs4•Ï3‘üs»×¾QÐÑa À˜"B!¦­v»Ùi#B¦ÓqžÍ U*£ ÑŠƒ´FJC¡A¥tU‰²’•ÐRi­eUY­�ԺРµRk­¥1ÊZ}TÑEB0‚$KR%¤ëºÍf; «´,Jb¡*%2Z-4J—¥(KQUR(-µÑ1 H°…F¨JÉR«JT¹,󲈵̑*Q¥ŒX`KÊ w‚Bë ©T–³"ÈbêbݪûµÀÍ’xg󿯕ké,¥˜ÝyÛ½ßýÝß÷ ßøÂ•ù••…5Uˆ��­û>yÿ‡>ô‘?øoo{ï;Þ}ßÇ>yõ©«Vkæù�Zãž{îíÏ/¿ó�Þößð†7½åwÞù®?ù‡?ñ�~ÿ�¿µs÷Þ[ïzÞ³žsáÌm§ÖO§›oëµ¢ÚÎî�N¯¡µþÝ_{ ¡®Ðx˜×[s»Ãi¦€%¾?I>ðÑO¼õ�ßùÇo{×#?98œ@0wwš­ŽÕœ £fÖ\'`Ôň1ÌÚõ9‡FJb΂ÕÅã­zk2œ|ôƒäþG÷xßþè߆µo~ÉËî¼û«ë§œ pÃ2¾?Ï/-¿ðE/~õ«^{Ï�w--.ö{�ùng¾Ûé6"�€`W 9M6¯6®—ƒC3Ç›{O]Œ÷"Ϊ¤À;Ž{p8ÐÆ ­µÖƪÐu¨*ËÅ,u‰c…ÑBåqâq2âQG§–p®Öo¹-�”'ŒÍöv/=)qa©[ìoÚÑ~ T–z}âßþ“ð/~âGÿé�þÈ›ÿó¸þÄÉpÇs�©²áöf»ÝRqRìíR)ËñàÚã?õÀ§Þú¦7¾éWyïú¥[�-‹Ãý·ÿæ¯þæÏÿÜþÅ?ûÏÿæ_ýÜOýãù�òÿúÑ}ã~qûÊåO|ðýÿäü½Ÿÿç?ý¾w¾]4@�ÔêÍ“ë§n¿õöÇ×î®Ì-<ãî{_öŠW~ÿk_÷ ÷>³ßi7Ã8˲ét:™LÒ<JH¥ÇÂÊi1-LqmëúæÎÖöÁ.$Èu¹:Ï2« Á˜ Ì9 ßu€`�°FF˜*E"gVs˜5TI"…ƒ 4ªÛn0×)•¸º½õÔõ�íÃÛ»O^¹N½ð{èGÜZ³�¶’bʹkŒ±Jc :¢ùO¯¿4¨üOïþú ÎW\õú,œ|.¨P€a­Þ_XìôºÜu¦Óáá`W«R”©ªr%r ÀÁˆ#H¬!ÚBm 6F)£6ÀTRVPRä…5(«Je*%+)+©„RRýg' !¥ö¼ Õnaè:Ž‹˜É– ®O\$�ÈJUb‘ƒ4Øj«¥6J#1€¢¬âé¬ÈRY•h‚ …FU©élzhdjd A™ÌöÓx_VdUNH!,*1ÝØ¼ô‰O|ä£ýðµkׄR¯xÙ·~û+_ýò—¿jõÄ9€ý‡>õÈo¼ñ·ÿÍ¿ü¹?zÛÛÿàß~éÚuÎ]U©½�í§îìüîŸú{?ùÓ?öÿà�¿û¶7ÿáo¼á¿^|òbPoÜz÷Ýn½íÂ-·íln?ôÉ~ñgÿݹÿêæƒþÔ[ßò;§N¬�ZÔnWÚÈ<ôû÷ÿäÿ � ©UyÚo× QÆä[›O GÛBM|vêÞB³Öt" 5Á¸,dçU¥(u(æF �OÂFØœk÷çۋ̺—Ÿ¸öžwüéÿþ{ä¾ûZAàb|¸·wúĉgÞs÷}÷}òþï»pÏ�wœ?‹‘Å ¸ çÄ…õíáÎÃO>ü�¿×�¼þB×uyOg{ùáÀLfùîÞðÒµìæ¶NHšÛñM’¶eE`®Æ;‡qs æÔ „±Ôókad¤&³YF~­Ô›Ä @Øq )ˆG qœPækEwE’ v‡º�ks &+™2Û—/ï>u%yÛuVãýù:;½Üºm½w÷Z'{ïü�_ù½7þâ{Þú›òÖß¼ï½üæŸÿWü¿üŽ7ýÊo¿áßüÉ›í‰�¼{ûÉûú¾¹ëäÂí«í…š]ê’•yïø¼ËR㎹úÝíè%·�yÁ­'ïY_“½Óó�ïû¶o>ÙŠ¶þäü§?ñÿþä�ÿÚ¿ý™wÿΛÿÄGw¯^ݺreëÊÕÑÖî£ûäÅOÞ?ØÞIVŒgÍ ê·:/þ¦,Ï/ÜyÛíQ…~`¬žN§B/ôÎÝrî~äo¼â[_Ùëõ‡Eµ@K¥J%¥.òj:�N§Ó¢ÈŠ2I’©yUÌdž ²¤BP)£]š¾Wwbæò¥KŸøÔÇŸº~µÑë?söÙÏÁË_õ�¯ÿ;?ö3ÿúß®Ÿ> „[­=Êâƒ!hà§/ù§×ÓLåKh*Ÿ?>ùµD&Qå³Þ_k­¢ªÞlž¹páž{î¹ý®;£ZXUÂ#À$À%­Ì"l6Y@ŽLJ”VBRB€µZ*Œ�(+b!Ð*­µ5Òi”2Zk­ 0Øj6{½søS—/½ç=ïyð�‡÷öw÷ 0Ô ¢!PkÈÁéJ¹Ìõ™çQ—#ŠÀÖpL\NÏa"Ê"eV  Ø U3Š´Q…V…‘)4•UÙdzpùÊO]|@õ¼çã_ÿ?ü=?ðý/}Å+‡¿ôKÿé7Þø[¿ü ÿéWÞð_~è1—gN_8~êôÂÊêÊê1I¿·Ðö›+íù.¯ÓíÏ<·x¼8œ olqH�¯­×› K©Å$Š¢µåµgßõŒ•þâÇß÷¡·½õ�>þ�[XZ:yîÂñ³ç½0Öœ?¾HËi>Ú£*Ç*©²Ã|¶¿yý‰ÇýØÆõÇ|W5CŒu&Ó ¬2Ž,Ò *S«µæV—×ú½ùFÔj„­v­Ý®5ìþîo¼å?þûÿôà'IG‡¤6Ï�8Q ½¥~÷ä±ÎH½¬[ÝܸñŸáßÍ'�­Ôao¾óø¥Ç§ƒY1“@¾çÚ]èa‚6o\OF£­K—o<úøtk§Ì‹¼,²"3ÀŒ\×íÏ-´íå¹…ºÕºž=ËÂÊj½Ý�Æž>~âøÚ±¹^¿Ó�kõæÂvwîØñãgηúýùÕå¹Å…¥c«ÇN�£¦ç7š�vXk;vÌ÷ýÍ� #Pv¾Ûl8;¸¹½¿µ¡ËDä£n�©blã}Z�›ž!&–É.'ŽÎ=�u‚’‹„£¹ˆr9Û¹øÐÁÕG«éÖÎÆã�>üÁ­­Ç—÷¯=’ÞxrøÈ×ïûšû›j¶+Ç»7»Ì{>ãøÜzÝ]öYTdÙh0Ù;ÐEK¹}åúæÅ+ŸüàG¶¯Þî^|ôñáîþã=f*yõÒå §ÏrBaa)e…¥¨w¶žzꉓ'Oö»½áÞÐ�¦éÖÖÖSO=õè£�>úÄ£—®^¾qóÆåkW6n\ì—qœ�ƃ­íÁÎN1Kö67÷¶nn^¾¼´¸øÒ—~óÏþìÏþÔÿýÓ?ùÿÔßù?þî÷þàýÕï~Ýó_ôâÕõuê‡IžcCJi© €2,²OWÀ¾* ò¥î¶ŸÿÙÊã—~ý3ÇWRnú*vš}îÉžùÊçÍÄ@�’ä¿„n�Ž€Ec�2X¢RÆÆ=ÊÒÔ锤}þîßý‚"—oß¼2Ü,â�CL#`ª˜”jja)Lf‘´VVeŽ-p1…ÖPŒ(&ZY‚€ÑE²æ#%KƱ�…ÕBK!EÅ0^ê÷¡2~÷{Þü‹ÿéo~ëÖ�^ùÄ}÷è#�<ðÀÞ÷öw¼í÷?ð¾w>ñЃÓ×âv=Z˜ï\¿tñCï{>�Óñ”(ë@h‹œár•¤{%Ä)‹™›G�”å4™‡¨b ψ€Ðlš2ì„nëö»žóœ¿òê{_òª•Ûž�úÅÇ.ÿÊ¿ÿ¥?ø�·Ì»µf¥:²êku¦VŸç®/�Žó¶çcQÖÈAÎPfå8ô%Öq«Æúáü|3 ¨Ï± !—2"Š˜´¨Fõ:¾õ¶õ«sçO¬Î×딹¼×iÍ-œ:v¢Óh†õ �€‘ˆÑá�O~ü½Ãƒ жŒ¨c(·ñÚa©Š¬*;ýÅ3ÇNA�ÒÃdûòÖöÕ�ÑÁøò•�=uù±§.®ž:õìozÞÊé ÇŽuWŽ×V$�`PWÜÓ®Kè46t£•þʱîêõ+—¿ºqyû¡�=¦R¸Ð˜oz�n½‰›þ¼÷O–OŸ8sòÜhsÌ ·ÛX1 r¢nwa}娙ÓgΟ=w¾Ñj¸>r\XoÕÖN7.7Üí¯¬ªJá\õY°Üî#zíN£Ý‚”P΀±sˆƒz‹óÍV@¢-ü¨^�V×æÛ‹ õ¹^Ôž;{îî¨Ö·–j ò<÷µŠ2$xsTÝÜÓÉææ%)Ç…�{ºðE™ìlÀrVÌvu9Ü9¸'‚(‹ñÆf¶¿oË|:Ý¿vùR‘Ä>uu&¨ÁF�_ ƒÝítÿ@&ùp$Š<É“ál´·¹_ ÇùîÖxó²Ê÷Ót[ËI:Þݺö .c.3ÇéhçpçÆÕK�^»òÐÆõÇ'[ïyÛ[Ÿzä¾Ñîµ*Ý5åáá�Ëð=òæ_ß~òÁ|´ý‘�½÷£|ì¾Ç|ðÒS�Ó¨Õð¨{zéØë·ÜròŽ[ÎÞ½¾rzuåÔÉçÍ.wýZ£‘ëy9´ûêuo¿ó}÷š‹µþª! ›Òº€u-êwIAßá.†àŒĈ[€aG÷ˆ§××�©|öv ÿ» àÏ}ý/?ùõQéÿB_Ñg80P‰ c 5Hd®f¥ê?ñòW½æômw—�_ÚØÙŒ¶vw-4ºE––yZ$±’Âu˜K‰Õ2OÓéxX™C°ç¸Í¨ÖkwZ�æ-ë'V:Ý;Ï�_�Ÿ_Y˜_^^TVÞó¡÷|àÎmyë3o_;s¬Ö­õ:„#аU§“Ñ`gkëÊ¥Ëׯ^ÙßÙÝܸò胟zÿ{ÿdgkC‰x®çòÙhÊ mD�f½Ýnõê�ÎÖÎÁá`òÐcO~ò�‡}òòÍíÁ`œAâv{sÍvçô-·¬�X?{îÜâéSyžèc}èÉG­ƒ��9æ5¼ á·{MLì$V"£ ê*¯²Ø¥…­v‚R@)€U@UPVÔjÏh”fz2Ayn²ÔÌb”e /\¥¸6LC1r™¥XZ£y�Ûn7ßóîwØ2‡B^¿IsYbRéˆ¹Æ cBd8œŽG3× Ž?ÙhvÞó¾÷]¼|õ½ïÿàå«×¥±‡£q¥¤4Qzt`Æ£�RH)q'ð‘ÇcˆB9â”rÆ<ß�'œ ¤®‡¹ƒ‡pÆ8ŸëvÂüŽw¬œ8þª¿úšîòB£Ýºå–[æúkóó'VV†;[YgqxáþÎn2žÖ› £ÙöމS®UzxP L逸Ž% P “(«`R‚¸@y‰ÊÊ�ÐcœSÌAqN•RJk Toq®5ßÃ/±É*�Óù~(ò*&!r]à.4"`9@.ÄÅ$®’B—* ¶ˆW+€,¡�ûØóŒËˆ+Rå×¥žKÜFаÂ:ÄÁ ûÄóˆK ÁÂzˆÃRשï2—S‡b¦„…D†@­A£ŒÕA Dsîú~ȉ§+[¦B¦•JŠìp\ c””8)k ù¥‘‡ÓñæÎùõSßó�¯ùþïyÝË^ù-ëgOûA6ëa­Á=`Œ­Eõ0ˆ8w|?XXZZ];~ìÄÉ…¥Õ[n¿ã%ßüÒc'N^¾vukcóÕ¯úö|2±JYÎ< k12FB­µB‰¿Haüéõ5(}® ã®á°á×âWõ¥<Á>SÝús)Ñç~–Ϥ^~ÉïËdÐa®ÖZ*m²˜Jȉ–òFÿÞ¾â[_ûƒÏé·YâìN&N!… rœÐqZµèÄÚÊúñÕcË‹ΜzÆ]wÝ{ï½kKKª¬n\¾úîw¼ó~îçÿÛo½éãú¾÷¾ýí�?øàã�<üŽ?úÃ}à}oøå7lïoÝýÌ»æŽ-ì%$¢~ËX4nÍsº�Z¿Ûl�®ò�›×ºÿ|ß{ê!{É‹ž·ºÜ¯ÒéÁÖÍÍ+—7._îìOÇ2¯¦ÃÙ`wx°;à,˜ë¯žçÜù{zók ‹ÇÎÞrëÉÛok÷{Q!å`týò¥›×-¶‹Ç—‚†g‘” ”¦¨D �tPešŒÓÉÀÉ`{s¼·�E�dQÅc™Ltž *§UA‹'‰� «ƒ5éÉHŽGz61Ó)/%ÊK4";Ìd)Ö»u_kñ›¿ö_÷._ö*µà]æ·ÜÐäRU¶ˆËÉ0ñyÔnt�;e4zì‰KIZ.,-ß~×ÝA­YÉ=ßñC7�ïAÏE¾G€ô\ø¬iNF!Eˆ&H¨1†œBÎ!§�RK©BH!`¶˜PÀ—æ—æ–Þþ§ïyêæõ“wßÑ™Ÿ‹³TÌR¬ôdg{¼»íP «l2™ C+ÍáöÞÞµ�Á¥k7îðÆ÷ï^|êú£_{èák�<~í‘'®=~éÆã—¯>òÄÕ‡¿öÐC£Ë×/^½ùØÅ�Ë×7·†yžåy €±Hcã*�zÍîêBgu±»¶ä¶ÍÅìûà °¬vlŽ] É}µ¢v+hÔ �+À,õ‰‹,eÔT�™å®uZšWÌ3§ÊB,A�Säja“I–Ƥ5KKàŸõKbQ(™Krôfâ–…R‹+©²¼Â„;n`!ÉÓ(èF5¡ðØI‘mÝYÑ2tÙ­õ »öÀ×~dãڵ͛©)™@ÏÉeçE^ ‹‰…È÷CL9¤ s�õ#…ˆ„rWSoÔžqï=gÖVäû¿V¥¸ZVy™"ŸY!´”PF˜ýt�ûé�ǯ#S±Ÿo¦òy7î/Ä’¿�BþÕMOùJT“Ï´ü¹ Ú£‹”R„D‰'-Ô:<’•Qc^?qþÎo~ÉË_ûš×Üvþ¼KiÀÇhgûƒï}÷›ó7~í—ù�¿ú+¿ú_~ùßþëŸýÙŸþ~é?þŸ¼ím�?üp•eó½žÕâÆõ+›×®|øïýØûßw¸·�§ÖV—ç{ªJõ†‘Ê“±Ècl„ƒ�9RUÍ#Í�»Ä¸´"päbå p”MU:s1ò)á«´ï–³¬ÊΙÓçO�½íôÙsç/ܹzì\u†ƒäã¿ïÞú‡oúÕ_}ç[ÿð-¿þ›¿þÿþâïþ—_}âcŸDeé\e©9ÁڡДE•NE¿´z}s[ØéÍaê`îB!e "a�Pbl(5”B !a‘BRf‘À”Ö„5†K©¡Ä`¬Öh¬²E&(sÚ yòɇî3I¥ŠáôæcŸºï¾k�=æ2*¥8 “4­…‘.ÊéÖÎlk˪<T£ךSÅñpw?'VS*•ç*ϳ½ƒ|oïf£Ñôðpg{og{gsow§Ê2¥Ä`°7š “2ÍdAµ°rhÿô‰öÚŠ‚¸(�–d4ÌGƒ|<-‹\ò$u‰ã»�ë„ÒBi!t§Vwê ¿Þ4€–….íóˆ95¿Ñóêm¿Ýk­¬z�n­ÙáA�AØl5ûýö\aeµ¿°´´´Ô_\X\Zéõ:�~·Ýï´ûýùåÞòrwi©¿²²¸¶Þ_YY<~|iíXo~áØñSK«k�vÏw<:>q,¨1¿NåpBsbK …°V[d+%JY²�@UJbF&¥PF¥­´ ÙíyµºÄ8SÚºž�ÄoÔýz4™Œ²éà¶“'Öz�¿÷ú)Ò™42�•@ik´ÑX�®ó4_ù_T¨ÿÖEþWH“ü²�`ÀB!{S––²Öj3ǃ˜Zˆ!ec…�¥9r@™ÅDCb0&Œsף܄-&ˆqÂêzÌ Ž~„ ňpÊîJc�(꯮Bß}ìÊ•¤(U^î^Û¨‡H3:ŽcŒ�F[[2Ë€�L×[–"Í­ÒcŒ€¥*+«´QYƒ uer©µFTª,”(•¨†[Û£½½Ã­íƒíí½››Óá¨J2�q¡ �|ºa¯ÝYZdA´rúÌê™óý•AgÞmu÷ü°qìØ±“'Ož9wvõäzm¹>×k//µ–O¬Ï¯®öWV°Vk´;sss+«Í•eÞéØÐ5ß2Ê£°»²Ô;¶ì4k9Ða·Uëµ=Ïs<—zç.6¨Ì«<Í*)„VãÙtœÌ † À8Í£aÇi2Ë“AØn¶Úí6#´ª*QJÇqI’Ì&ßs–––çç#?ð…ÆVy.²BÉÊaÜ÷]×÷ŽÜ"#�ÂL”ØuXð0tw4dÚÍh¾ÑÈ÷{�›ììnA¤yà¤eª�Ác,°GNäBðÙ`®§'ê¿Æ ò¹Oô_TGù"ÆŽŸ7Çþé©‘Ïö?Oíÿº6ÿ÷•ºÏo"øl6—±ðÈ/€&ÚB­5Àj¥eŽ­V²xÿ»ßñÇ¿÷æ;ÏžÒI¬â8O€¦RQQL´”žãÏÏÏ/--ÍÍ͵Z­N§S«ÕšÍæÂÂB³I‘—yì¹Ôq‰µ2�'³ÁA9q)IYš86£Yµ7(v‡éÖAº»ŸïæÃ È*™g@ S–ùt‡éx<98ؾ~}´»�•åë"3e¥,“Y•¤:ËêŽsln•Âf×&DäÔÊÒ-ë'êM1�n^ŸîîV“ ²FYd+¥�&´” ìD–Øi&'rƒ¼@eò TUÇét"òjèS„bB©E’«¼TiåAF”1…²¥0ÊB!Á˜òJ(‹ %Ü(�,0BZ£‚°¬ÊiRÎ’*ɪ,WEN”r,è7› BÆHP¯a—õ†Ô¶^oÖº.ÅîÍÝ×6úÝùN§×hµ[ÝÎ4N‹J e‚ižÍ’ ¥Ü!ÜAŒcÂãÔq¹ë1îbLÀ ÅŒ@6ÀBˆ!"SDÄ ÔÚ !ò4õW)“Tà¼9×_Z[[?{Ú ”%Eè„7¯meãx®Öt-Œ÷] J]ŒË¤pˆÇ‰+r-¥v¹r—ƒD‰”$R„ BPlPÚ”V íBŒ²*?Êq’ §›»{—®ï>y­5fƒÑ`pÀÚíw©ëLËúm6‹‹'n»ýÖ{ŸÕŸ_¦”d™OÝf»×v|`PŠ¢’%óxoqnymÙñî{Nà7Ú€àæöÖÍí­dÇ“i2›%Élw·wön^¹~éúÕ+7®]½qíúÎæÆÎ�›/m_½zóÆÕáÁþhïpwg¸»;ØÙnm\ߨ»z}ïÚµÁææp{k´»‡¢Ì�ÖJ i´†HC ­UJe“Ùtÿ ÙÀiŽãŒe%ÊJ9K&{{£½½d4€RRd"Ïõ8ƒP{.óBÏóýÈ÷]‡2 )ÔXå:™ˆÙ¸åóÕµUlRdÄ¥˜"c4#Ú‘é³=zºö?ƒ©|¡ÙÉWØåõ•ìü•�¡ÿá”°ÏãCGýiàËæ?=´h³²@8”Z£ 2œb�‚�¾ÿ]ÿìÿó�îºpj±.¶‚…fxvýX¿Ûi5›œ»­V§QoA„ ɲL)C)G”PJ)¥B”ãÉ0Ë ”Ò•kaz8”³$9Œ¶vâýC1�Å4žlíðÊÔib§œ†ukí€û¦P³ÃY6M}âFN¤Å†t�xœl^Û8ÜÞ5Bê¼IB´.³Ù`ëæáöÖÁÖæáÖf>8ÆøÈª8Ó©Ng¨ÊU <©F‡Ùþátko¸·ƒ•æ„ }B"Çñ ¥4ye3ir)‹Ê¡N»Ùi6ÛÂ2+æRÄËL–IÁ1s‰GÁ„i �`¡¬´‘cj,Ô jm•23-´C -(²$™Åå,©Æq5˜šIbÆÓÉö>”ºÑh h€Ë AA*¥ÂZÔ_\êôæú ó®ï‡ÍºfVd KSm€50 jõFKj%¥üÌÿXi´4ÚX !DyÔa�e�4P1ÈZ µÖÚjm¡�È"�Õ(]¯× !G­„;Â\)DÁñåÖêò(Î<7j…�t8Ãiã(ëZ‹*¡K� p°ã‘€C—Aîc'D¬�i!ßZa޹–J)å`êaæ̔ճL�b* “6¤Ey‡ùuKƒÊVûÓKý$Ï*W™ôp0~×wxž7+² (໬Þ\\;éxáx< ‡ƒ½l6ÃÖ”…œz—Y¢e  DÔj´§Í @¥4“´ÚÛi¢Çq²»?ÚÚN:K†776®gãqÏâñ¨J›å0M©¨,|m#DQ†¥Bˆ– ¥úL9Bø4¢|½˜ÊŸw£ÿÿ•yÉ¿(+2Yà[ˆ,®ãZ`…Æ*‚�QPâ‘ïk4¼0àÙlÄ vl·jRJˆ�ëøž`L)¥žx^àøu8cN¥$¥´;×k6›Ãétº¹yC'©œÅÜ‚†ë"¥F{{U’$£QÈM.A!Ê8•YÅ1˲B ºQÍ«Y U©1¤Ò<-)¢µ°f¤QEø.°º*s 0Zä™ÈÒ¦ï뢘ö‘RªHM–—“i5�ª<“éÌ9QK-Ê a€14VA=îø®¹>G”BäPÆ03Æ`!Æâ,ÉD¥ÔÑ­Z ´È¡Ž€°²Ö@ˆ0ÕÚfYQ–ˆv4Rj”ÅUEYæ…– S,�ÖRéJª¼”³X�9ãÒ8ˆeY†0–Ðj„P�¨Á\§’¥ÅRJ]nä¾G}WaŒ¡”zž'”œÍfÖZî¹GrÔücŒ „0Æžã2B‘ÖÁ˜‚B@ €Go£˜0L³$v]7MÎy^„;B™ÉlZ }çs¿qqýÄæÖ>¤åÕp!]¡œyQk¡±ÍzC ] N4–IQMf(/cˆPº¨l)¬µJ(£,PkëìXä#Ê,ô aVÓ¤NA^EØu¤mX:º±yùÁ‡‹éôpk (uüøñ ôÂz­2öÆÖöx6«*i”&äé4›M‹ÙLf¬D�; hµU©ËZ-$A­U–gƒ&fó^䔪�i SZU Í<‹ � Çã:Sk™µ €‹ µ:È‘š• §%-DÒ@.$2@ÈGJi*I�åœ[¤”"PÓ�šØñ+k1Ï%+„Ž“½ƒxPŽ'"ŽU’Î÷6®?ü©Oîls‰[×® öÃÀ=q|µLg5ßUe¸Ì¨ò_þ‹´rWØÊXÍÆBþ'–Lþÿº¥øó¨‰ÖXó™_‚ès®£ù�ϾásªgG; ˆD_*@å/Ùö¥¸Ô—¢8_DÕÿtG�[�¬0ÀjkE # 4"¸2âÕ¯ýÎ0ª�&CîÓ²J8‡FIǬ8õ†ånÐîR/À(*! BêÐó!ÄZŒ8Rg Oãj6Œ8ñ1t ðmxGŒa^J�+ ¸‹[�Œ¸Šù¹†”9¹Aй†rE™Ö‰J@ !@´V—bœ h)¡b¤Œ6ˆR:˜«BÎFc¨ °ÒÈÂÇU(m‡¹>ÆZV�ˆJYD°Ls1� ¤‰LMÀkZ�¢Ä€×DZ.›N*UÚÀkå±ÂÀ+sT–ãF’�RÐñ´ŒSíÖ:ÂÒY® ëÑ‚œÛ°ˆõîî» �½Ü’‘¤’{‡1¡~VU—c�•6­H A^¤;û`œF€º[m Ê Ê‘ã1‹*Т0¢Ö¨&v0ÔÀ—¡ªL³xvTÑAF[b8ÇÖ–¾ƒ<†�–„3‹±µÆZ“eiOU™Q%°=b3JJi­F«1�y™qŒ­6Q­q¹!§Am?«®LP§ß»ýÐîM EäV1Tak¤È¶˜‚Ãá!CYfY­=5v˜çÒZ¬.¤œU­F”ŽâÈ8^yH ‘ÄÙ,õ¢ž#Ê”‡¨QZ–E‡¸QZàýƒÝ«OÜÿÐwÇÐ1œÛfä�F#CH½×“ÀPŒò2Ûßßìx„X%)áÄqs˜ ‡!Ž UB Æã±QÄ••3‘K•i ¬ƒ©•Êan"À\©ŒC(ÊŠPZgŽÒ¡0É©¹’ŽÑX ª�F)%„@¸Ó\’X¢YáJÓr|XŠ€Q4Ñ‚pÊŒ¥Rae­T"ÏÄlªFãí'M7n¨ýƒbogëÊ“W¿¿Éô‰†÷¦_ø7¿ò~î÷ßòÛÃÃý«O=9Wo nlí?úø#A`šdÓªªŒ–ÚOOûùVO¯¯¯Pÿ™fÜ/Õsü¿_…µ XmŒ‘Æ Ž4Û½\褒¹ag;q#è8Äq…Òˆ€ ¶BÌ㮣µfŒaŒ•R×a!­5Ƙ3F Jã$Ïó#`A (¬Q�’T"��]Sh™Š²T1Ê}�zŽøµV³Ùí¹a0Šj5Hˆ†°ÓïcΉã»~Í Z”*«”0Ð@*-€ â(ƒ@ÒØ²RJŒ1v˜£¼,¤V„rƒp¥tž–½n¿ª¤,%g^çU©Ò´œÆIœ•6Üó+m*k ©¦E¡ �Ú‹µ…Ôõ¸° ÍÅõõåS'i”´VÏœnôz< £zÍ FI’E�f!Õ ™©¼¬¦Y>šÊiò B¤y2™*!9Á¡ë9É4O“™”$Ñ©0„Cc”K-JR€€Ô@i ¬0ZjQVy^¤eY*¥Œ1J‰R– „Öje�À£(&eYc¬6ViQˆ$Žã4‡˜hN÷‹té¶ óëky^MŒu-Ž0 ,â•ÐišA€‰u\Òí7/ÜzòÄ™cóËs«§Öš‹sN¯1wöîE ð¹æ3_þ’úÊ|ÅÁÌ–^§¡Ž­4.�EY- ” ã)ó]×u Qy^@¹kŒyðÁŸ|êqÆ1¤–»dw°+¡©€IUÅÃPXË¥�XiˬÄ5kõv­Õm´@P �‹T†`¦­©ŒRjm‘±!qjÐ ¯£ÀQ„+ÔñëÔb™æ²R@C­¬‘Fa PVÖ–FÆZçJUhˆDFÛJŠJjKñmÍós( ´Á`#ˆDƘ!è äcâC\÷<Ÿ;HJd41f:8ØÛ¼áøÚW¿ê%/zѹsç e�¹ïÿÈÇ>øÑ�WƼþoýí,+ …�¨‘% c }š¦|ú‘÷éõu•¯„@|îóþ×Q¾>Y/Ÿ¡2‚ÈQÙÄ`¶�9~ï5ž¼r“ÕÚ‰!“ @¯†¸o1ŒP×Á”9žïøfœb­%Œ:ŽÃ¡2FFB”R‘!‚çœRTUV À˜FX"1*�5 C—)Ž !Èq¼z=j·ƒf“ú¾Â¸4F«,`žO=¯ÑîtúsÔq£F³Þèq¯êí°Þ1˜—æº~Tovœ r¢q}�ˆ%Ì "ø<ô¡ãHŒ™¹Í–Öýf3ËE%L£ÕkÀêÝ9�8ókóÇŽÍ­®6çû�Åy뻂`É©`dne­µ°ä6�¥åöÂRÐëX×å­ëÔy§Õ\^¬-Ì9Íz­ßkÌ/8�f³ßoÌÍuççèÎvBænyшXÄ s\»\Q" T„ DaŒéQ�cÌ ,Œv¹c*rWµh#ËÊ(­¬ÑÖZk‘ÑXYÇG® ª„ •Ú–…-²Ñöæ`kK±qõJ^Ø :ËÇsÈ{kë¿÷�>çù/t¸G …8Ž#„J%?·ŒoŸ¶gùz2•/Zžú\ï“/ìû†„ÿÛ‹á§9ò‘y°…T*[ k,ù®×}ÿîpRZ2ÉU…x°8¨7ã@qX‹‚0<Ú‡Œe”zŒ"ktU!¡F�1FcÔYŒ!&¨ kµšã8Ífcì…A£Ýò£°Ý붺? FAF½V«! B”R¥””Rk;K“8K¥6U%³¢ÂÔ jM/j`?àA�D�Z1ìÍG½~Ø›ó;ݨ׭Ï÷[K‹A¿t{õù…h¡Ïê5úþܬE6ð›Ë íµUÖjFss+gNwVVkósõÅy·×qºíhqÞ›ïuÖ×–/œ¥õ(ì÷ŒËy»Î5·Õ€‘[1˜)òçÚµù9Åi"…$ØiÔ¡ãÔ»m¿VŸ[Y®w»Èsk‹óÑÒ¼Ûj¸�÷}†)J•)”Žójœf‡Órøÿeï½Ã$;ï*á7ßX¹ªsOšå,É–-[ÎØ8áÆÃ0&‡Ýe‰û-™]XrÆ6`lƒ“œ¬8#MžžžÎÝ•«n~ó÷GKFÈa>lçûܧŸêÛ]U·îÓýžûû�ó;gD¸0s Æ m Âb …m”FCmŒTak-´c¨7šË<‚I§;loø®3Ú�u«ä%—]Ì÷YÏ¿½þ÷ÿß»ŽÞ×Im~ꆗì¹J– €qb¢È)Í Õã¼´%iÁÂÚzŽcÒÚ:ž !$ŒB‡×15ÃÕÀk5‰‰°Y/—›õædkj®99SªÕ]? Žë!´M_Ac)¡.!e.!-Ô ¤ ô(#äkíiÍ8'YÆò‚É"eÎ2\ä�ž5Ì� ™gœç#·äò(áiî`µˆF#k5öèîKöí»êà®Cs$P»{ùÂé(êyä,ÊãA’pbm2 ¤±yÎ ×@>¢"‹·6‡ËhžÏ×*".V<Å@ôW–ÖΞ½çÎ�âƒWsˆí­×\õ®ïù®ïüžï¾ì†®{éËn}Å«+{®�ó÷è£Ó; ¡³Ó³íÙ7áyUÜ"_;~¢sö\}yéÌÉÕógT2yÔY^Ø8wf°º¯.'k˽¥…þÊâxc%ïmý�h}ykeAåQ£LÎÖZs͉=SSûg\y‘Sóz£­SÇX<~4 °Q  åFä„Z$ÖÜG î:ÍЯ8Ôƒ¶äPZ ¤¹ÕŠBPR×wÁ0 }€,¥Ø¡ÄÃ8$$D8ÀØÃÔ�˜"L…[�ÅÔ ¤†YÊ�y”IŠ­I‹œ¸pÜT£Kn~vJ‚õqŠ*•\(‡"åžãj®BO\­…ÛeŠðéZåëS©|¹ÒäKbÕS,b¾1U}~¡HÂ`Œ0�Z …Ö(Éy–\{å»ç¦L1©NÇ�,1Ї2Æ\‡A`(&%߃F§ÑXTÒ¤Y6¦Ãa<ŠÓ8“ÒN4§ Eœ÷·zH N3ÅÅxÔßX—ãq1f�®ÓöfÒÝþöåh ÆC�má<Åyj’1)ÒZߘ ߯3&†ý‚€fdÙÁÃFp!çœRê‡�3Ç L\�P‡:.¡Ì €,� dY¡” e ²a%Œ¢0:t°-²*Åj40£1ïõ‹Ng9ŒZpO*·¢×oŸ[ÈV7ÔVWl´óåõôÂ2EÅòz´pux0N—WåF—ŽÙîÚQ,G QÖEÄ!4`.³Ðµ€XèPB\Ç:Žö\\){­f09<߸žr(§¬@8·VhÀµ�„Z„µ¶Ûš!0D,dm7îmqVøÚ:Rƒ85ql£X †Y»“´ÛEo(‡#3Œi.D0anÊ÷ýž’[y´õÛÙpbª5;ÁÒ�z4¤AÕ§> ·^òK µßzãôÞn»óÓÿÃÇJ ]8qîôñ³~mê²ëo}Ý·× ^òÊßýý?koõ ×3ÕFºÙU½ÁÊÑGú‹çE§�m¬Ek+½sç¢ååb}ö{jk“öûjc#Z÷Ð}KgNö;kqʬÔÙÒúâ©Ó�ðdPàak�@ÔL¬1j]$"Û"GJ"£ –Zq¥¹E3ŒÝ}eŒIkÜJ)ÑB!`!PJAc-4!ˆ1"‚0�˜Z„® À�0€˜…#”9ng4²Ž«Ü0CîÏÿÆï|˛ߦ θ¦Ìs¨£s‰–RBˆ´ÑOZµ¶Ú§ã„¿:PùÚyOlgýǺROò—³��Ó?ö—g,Æ(å8ŽÃð�×\µpò˜Îc¬¥(R%¹ÕFJ¹­#" y–Ç£a‘Ä#xo«½¶¼²vayuiucuccu-Ž­6"ËE–'ƒQ:;c`£~(PœŒú.BH)PäX ª$U2$( Ȧâ¸.&Í‚ˆ–*Ka苌º Ð £Š<ÕR@h}ßEnë�”Rn7÷ÅÌÅ®æ (K!3BK~%Xq^•'*Ë&K%�¥Y§3\]ï/­t/,gínûü…îÂ…ÍÓç.{´}na´²šllŒ––W�>R¬ovOžéŸ>';=ÕÆ«›ãåuÑéeë£å5Ýu–V»Ë+ÝõM#$E ¥VIn N!ò1*!L�I¡Íðk5èºaAô\·\fa‰zþvÉ•TÊXc´ÖF*«4²À�)í"ì"‚„f!“~o¸±Ù[_ﮯ·¶Æ[íÞÚÊÖÒR1Ù¼Bˆ(ÝZY[^87ìöŠ4J!„„’\Ißw}דy…,¼À%1Æ4ÐÝáæ™“¶—O{¦y$³(tiPò/¹úŠ+Ÿqó¾+¯˜>xQkï¾òììÌE›{w•wLÏÞkʬ v=îôò±S%6ƒt0èG£¸C‰ÇÒÖºb`¶±õ¾ßýÃÏ}ôΩƔ6„yeéõ·>çåßüš½{÷ó\t×6|„–�ŸDYFò¼Lp�Ò¦ë6]w*ê �v8Ã�ãPéA-‡V€Áqâæy—$J�B˜dÜÛ\ímm {›í͕ᨠŒ(y2ÊÚBš<Óyx{ÔÉdf�R²ài"óX‰ ÆPcb6 ¨BBq‹¬ãPaµ_cžßå@+` £ÖZެ„Va`‚A‚ !¿\áh@0¥E!£±z<޳‚OMÏÀ $ÖØ ª¥æÔÌ8M+•jžsF$KÓ  0O ËxI¾JPyRæî¿({øâ ”'vœ¶Ÿk¬ÙLùb–þ+Ï üó€ß§´?žæ)ýþ¿Ô´X¤ €b´ýš a‰v ™Tðõoz›�Îâù5|Þ-T;‹Fy¡¬ \á!àÁhØÑãþ”ã�,M{Ýd<0¢ðªPæ*s.{cÈyGÒäqÒ“|X¦ÊS ÍÆ lHÑ4¯c„Ò1“ ‘ ¶©çh«r …﹌Q­UÎÓ\ï-ŸÁÙ¨‚m€aè°Ðó3PHh £q=ƒŠÁ°æSÏÀp¨¹•«¹‰%«Oø íä£|s…÷Ö¢•s£åÓ“Lë‹+ß›®�7£-9ØrD’�#’$^^èÍ­xm¹·´°¾xRÅ=”E�ÅÓI{Íó©å1µ…c2—輈%ÆÒñÜò Be¨Ýje2^åÐÕ¯ø¯¿6>týß�ÝØ”þÞ=—WX•#Eªm‚AQªB…RÍäÎ=óG^4?9Ç飧ÏÄEV œ ²ç[ãb½Ÿö¥)ÂR„p,U¯7$k©„ƒætkºêù<Þxøó„Gƒa—;.šóGnž¿òù•—õ ˆ)�:À掋¤ˆ0Ã¥ÍyÅ”1…ÄA ”¢ÚЬp”b [ŸŽ�ä.¾“2Ôá)'À+û<®/žì/�¦Å˜9&÷U\Qˆl%�ŒDZ#ài…òL@€,Y§XŸrÇ*@—[d,4£LòˆaIέ0uE)* Ñ ŸBÌ%+ cÃVuGfíOàd…[í¦©\ Ñz’—®¹º|Ñ¥i�¡ƒœ Çñë¥ lm2àZë¯R‚ˆ!Ë0p¶‡aCŒFˆžž…üwm}Iœø'Œùgõ/«¶ž<¥øµU!?%†æ HóÏêâ/3—#�Vj ~ùW~eem}£½ ¡ZdÃ>…FÉ"›çVçy1ÅÝA1N,çÖ(-„æ¶ÆgE!`Ðx™´€B¥=Çõ™ƒ!AY,@Ú` PÐÕç€pK¹Ä\û�Ö¼ŠN6¤a6H’aâ!O¥¢&P 5R†*„¥v£Á¼í¾œ%yÙ/„\ê@X[•ä:+,—ÈŒ±¶PC”Ʊ)„k±#m´ÕÝ\^IÇ#£¤G‘•….R…Z�|×óBlI‘E̵4VÙ¢YÎ5ÃÀÅ�`)åv%!%çœ;ˆð,�Çc‘e+‹ÒQÄ“¬HÒQ¯?h÷G�Þ`kkÜëfýJ‰Œ.ù… P<[«ûø 8K6¶ô Vƒ‘éGéz{íø)Þî­�:³vòL¶Ñ�~º¶m´A–Û,g3ˆ·öØdìö�Ú*�¤�B:úǃþ¸ßE@ˆ0q¦A¶Z�rð8ÕBÆQR°÷ÈÅЯê¿á;¾÷GáùÓsö‰;ã,BÎP‚{9sìÂêÑ¥µ1fó;沩¹=W_¿÷ªw¹zçáËwºôÒën¹æ–Û¯{æó®¾ù9WÞtÛžënTµ¦ªÕóR9+±$ŽßG4U TkþÉŸüÉùÇë­–2Oój£ ªOÍ´óâTg0ÂŽ Ê™�ˆzEÊð¢¤á\ôº]B‘4Òõid’Å…TŒ¹Z%P¨t8Ò2—Ù8`ÈCP$±Îó­ ÅVèf½é8®ë—0 2m @ Á™P" D”P&¥²H $ ‡0�8V¥BˆB27pCŒ1ªRh%­1#æXŒs)”‘€”0ÅeW_6µszkØ%�qaM2É óŒg?¸>²È#ÌAˆb¬±O3~�Aå©‹€¿²Úê_å»õÏH‹¯¢|e‡ü'A‹µ�9<~}áºIc‰ëA‡í:pðW~ã×/,/%yd¬2/F}¬   ‘�£^æF‰+5áE”¥P}�Q¦È1—>@ž¦*—ºPbFk�¶FC¤$ÈA†�ÄšTcK1‡*–6Q0VUV�‰H´*SÍ Å,›ªM0‹-—�+Wã2qjnXDI–ä®ë ®<Ç'„•ƒrÙ+e“q�“¸7¤ÌÖ[M¿ä@l´–Z!‚=â \ó­A¶Ò.®Ž7:ؘ°äé"ƒ¼p!&FË4Éãq‘DP«�ʵ.6  0f–Kh-’‹íLe–!€�dЩL–b¥l.,—XXXH�‹´;è\Xn_¸“4Ö5†�Tð2�ñÆÚxuexa©ØjG‹+ã…åèü²iÓåõäÂZ©Ð|­-·ze.Ë™"ý¸TÕðÞÀ5–AÀ¬uŒÅZc°–Ì(ª%R )‰•b`¥<}`Ç›kݵ�ç†kcPRˆBHQÃîVÅsŠ$ÎÓ,)ø‘ën¼é¹/úàßìýòwJÓÛ^÷¦ÛÞð¦ÞòÖÝ×ÝlÃæÁ«ž1{èŠCϸ­µÿâ!t–Çyº¼Ô°µéÆÞCõK/o\zUé¢K[W\[»âšÖ×ø™é¹Ê¡‹wßtëõ¯xõ%/|ñ¾ÛŸ»ë™ÏÚõÌÛ<ûy—ßöœ«n¾ù[^÷ú£Þ÷Wÿû7ÿú�þà™³2NE& +½àÕßvý‹_õŠïy×€„GWÛŸ?¹ÐŽòQ®üjÍ+•Ã0Ì“�e ¶†1V*WÆQG…C<  Ô ð£”SÄ–Òƒ)ãæ²€çj<. i»Qzv½½Ô 7È.ŽÏ!1˜ ƒ{Ã4ãVj •*)v]Ç„jŒ�´J)µ”Ú…Ô±˜B ¥•RZJ­–çqž Ξ;>=ÓJ¶G*U7Æéé•ö¥×Ý2³÷ (´È' jŒÖZÛ'ÝþBø%Zð?¨|ÉŠá_§¹úâí)\ÿ�(–Ç͘µ~‚û䌸Æm/ÔÅ×^ûª×¼zyù‚äY½äª,Êz“Ä XËó¸ÛfRÔ¨BêZD-ÄÚ"£‘–ÄXŒ�Â1ÖÕ¶L ŒQZK# ©Œ–XµERd¨Xœ²Ã4�@ư[ı #oÐO…‚:½îˆ"‡AJ „…¦ †˜Ai­Òb®T†ÍæDšæyÆWB©@�"èa…†ÚPLÂ@Ú3èÝýðÑó½akÇþÙ=Õ§w{•–Ô¿ViÍNîÜëÔZPKÂTâ²a&7†ÉVwÜKEf©€N¨ßš´åš(—ðÔ$˜šâ�&œ�svîŽó[µÃ‡ö_{Ù‘‹÷î®oÜóÉOÿÍ_¿ÿèC�j�ˆÛh¼òmïùÉïüÉÿ¾ï™·í¸öúÓÃáCKËb%T {DhTH(´z½ÝË$òK5…(të¸R˜ÒP+ÅÈ뵇ÕR³Ó Çdþ°Ð9v^ðê7¼é�ï¹ãµo„åz;å�\¦ˆt .¨ÃªõA!–;ý±Ô’\�\�±Â¸@P0’B�“Z[¨ FÌ Â*�Ì `¸u!+S—YëA[bØÄñé£�ÌR�™IµQ4'o|Ý·)êsƒ(¢Ð(%´cüôºÿµ•;þ%Ùˆÿ\×ßÈl?@�»a È`ÅŒbƹˆÄn¾õ™ã$6Ь¯-CÉ+„œ}àÁ¼Û<÷ J!|„@@(•FH¨ÅBËJcƒ”Ð1J]k�ŒÚö4D�€9Æ‚‰abT¢d¬A@[Ø›B„ý@‡C¢3„„”Q’Åq,åvŒâ<Çk`K¥R¥+++RÊz«YmÔ¥‘çF -cB« ±ÝQuK€+™ k¡17,U³œ+m aι(¸Õ!d5VC¨!Òhm¸ÖÂj­¹�Ya¸Ä:ˆ ©…."P¨TR¦‰å*NŒq-r5„™YŽ“œÊåRõéúæxeƒ$™ ‡ËK ÚÈá�wû޵žX*1W™’ ußÇB‹(‚w-‚R­æb �2X[f ÓÀ1�*K5ÀÒ0BB°�s$Èr(xÝ¥®Òy�÷|ˬH²tss=‰#Šu:î ]—Bïân¹êšg_sí³n¹ùÆë¯›˜™¦AМŸƒ”1æ–‚ ‹ SÆ5`ÜgˆQƒóµ~¾Ö×íÄt"Ñ›N û‰WXS«Aš¦Äõ€ãD$%À÷{ȳ“n9hµÄŠéFi¦^™iÕìÙ=ÞjÿíŸþõ]ýôýæïßyïÃÕƒ‡_öŽw<ó­oþž_üy4=ýÈù i&,7%TX9(USa¬\èõZ\]�ùZ®6-^óûÏ.�Þ8È,q«Y xÕÉ=ûZ»÷ 7°•Æþ«¯«íÝσRyïÁçû›¿íÝ?ø¬W¾êÈÍ·^õœçî¹úÚ™‹/¾ôÖ[oå+/yÆÍáì\Jiߘâԥܣ#Ǿ£ªeP¯sÇíç¢ÅãLh…¬!VC ˆ•ÐäJÆY6»×¼r–««n}ö®ëoØtÜg½õ-rrŠTZa} ”Æa ·MAŸ^ú¿¶í¯¯j‚ýßXN~Êöžœkùø·_pÅÞV…!  EØ‚Ðó£±ë—œj�s1»{÷�Ï¼åØ©…àš OXÑ鯞8ÅÇQ¸Z ­¹ÑjC paÄA�h„2R™\È\ªí@iA.dVp¥�”JrÁ9çRÅE–q1’y¿H»y”AŪ�W %Уh†þ5×_757ßÇ«�^;N8±Pc. 5%È÷Ü0˜˜œ¬×ëFiÏaY4VE>3ÑR\(É…(Ã!k”1Êõ©Wõ 2BñÿŽƒ·Þ|ÙíϾþe/yök^yÓK_¼ïº«K3³:s”ãf§F9·ÌqÊUìù^PÍ|ðÄÙÃ7ܲ릛à—~ùÊ翨¨U%ró#Q0Z€§í!¿ òÕU'ÿƩɯ,û:€øÒÊ‚'�ÏC à6·b|<¾¾ÓTj ƒÉ8Í Q©üíßý_6¢q™ëg÷5¦M”™¢GC… ÄЭ…4B‹=â`L”µJ[ƒH,xaAªµ°HZÀ¥.´�˜l[LZ­ XMÑÄÌôäìTsfbj~zçî¹¹¹™™©Éó3žç&Y¼÷à�‹¯ºª>;Öë±ÒQQ(¼f}b׎¹ûë³S“sSÕzE+¡‹œ“ †UÏ›¨T¨1���d4j†¥�Ò"O£<–Ä¢’Ã*¡E0‰"? vïÛ_™™^�ã3[#®¤ak åLÃaÂã\X€-€yVh©9ç¹�…6Û0ƒ,1\ùÔc˜¥�£¬ÈµæJf\p. Ĩ�C‰–Ê(-yaŠ)U"N€‰c­ ŠbÌ•§€E åP¬užÄ” à¶•$†( Ck­”¢\.�ãHkM©#¥–Ê ¥Ð"ãÈ  �UÖj`¥†ÚeËÒQZœXH,Ä­’Jr××3Žmš£´Jk¤1O…˜Ì‹R90He"ÁJx|áü™d0„FõÇÃLs¡Ä ÓÞXYuºQ¯—ÅBFk9Œ†RÊA‘xœAÙÍFC‘F*ð¸“ã<Œ½^ïü¹³½�->ˆ’õNûÌbºÕ©ml£ØÁZe@ÆuR£V3 B²cï´ã³ ð'š“Ç9Å + c°óš7¾ynÿEû¯ºZVªs×][¿ô’CÏî»óW_óS?Z¹äP°ÿ¢‰+o ÷] fvzû/²Óst÷¾ý7ß|ðæg;çÚZ� T¥RyÇÎÊž�µ;H½Îêu¯Õ$““2 ŠÀWåÀ�ŸÁS­¶=‚àD N·ÐÎ;UOì`«k•`ç\cï2ÙJÚ‡€—ÃÆÁƒGn{Öõ/}Ñ•/~Þ¡Ûnž½â’Úþ}E9Œ(í[ÛQò3ÇOÞsæÜM/x)›œµA—ëC.-t®¹ˆ8A¬2ÚZ‹žhüÆR}©e÷Éjà§ÒõäŒÈ/¥³úÆÑ€=ñô¶U† ´ÀZ»ýµÑ¨Gyª²Œùõz?‰ëó³¯úÖ7~ø£Çăõ­fPN†cˆ¤DAk©xVE¡Œ6ÀBÌ\?„B!„±ˆ9~¹VªµF«^¯7kõF£155ÕšœhMOÕjÕz½îºnžÆKK‹çN�ìl¬#£7ÖW�}øÞ{ï^uõ57?ëY7ÜxãÔìLerbbÇüì¾½3»wx• <m‘%q¯×(•ŠqÜYÛð ñGæ™àyÜPJµÕ©*8²¬ìaßu'MÓ~’Xיسçš[ŸùܽäÆgŒE¨®Õ*Ì¢©RcíÜòýw?°|amrznס#îDëâ[žqðæ›®yñ =óæ¢âŸÙ\½qñÁ Îm¶OoöÎF§6Ú÷œ:ý™ïÿüÉG¥Ï܉Fc×,­WYµâµêx¥F2Fðpm0€¥€ÕÝ,‹�ÁµŠÛ¬¦ÐÆV ­Jl+%PRh-¥Øó ëäÆFGÈ.UaàÎOù;g‡öí¾úòÊž]™CÏö;,žÕw|Çÿ�ß|ã{Þ‹K•nœ*‹rò8§^1E+c„âã/ã¨þôöÿ)¨|åù�'�Ä“QžØãzb›è©´¿¾$ö@øX¼ÊvÂÊ—óøúw��þÁÿé­ß¾T -À)c-!€,Ä!1 im*~ÀôÕZ—kMi�oÿ®wßzûKîzàø y¡‹Œ×*õ<çQžZ ¬µ¹Ê 0 ÂLãA¤fÒ-a@§§ª»ç`èF|‡1—:�9HŽGE§Í»íáê…hm%Ý\�ÖVŰï+BëI‘··X.ªå�µÕžüüg7›ó{�\»÷Èá‚�ÈR¨�‘6MPXÊyE Ñ]+zkLgn‘ìr´¸ÑyäÑGï¹k}ãB¬cZvP‰mã¼J‡@vdÞÉ“3ËKÓs³/}Ýk`#XÒcãáó�Õp~rÇe‡›»vNÎìÜ1½{ï¾KwΚŸ½hמKê3{Âæ4Fn|‰ý×]kÆ>ESÍ6ÏÛã(IeÙ/CĤĭš*è¦iŽ@À0Œ\Dˆe^@‹x.ŒTFè"“%¿,q±Gãœ!æbG h„BC®™A>uˆ²À&ɱ´Ø%�cŒ0θ@”A‚  @ ¦ÌZ˜Ä1!Ä üT a×ÐE6رŠ7Wx·Ót]¨Œ2¦�" � ´ãÑèÂ2-ô¸=(%ÖtÓŠ¦l­fåšÞåP àz¡[o”&§ª�‰ZmjvzO£µsçÞ‹'w,MÍùS³å¹�am²Ù˜e¨TôD¨Ëb]L˜0V Ñ`˜�c›qP˜¼Ÿõ—»£åNïÜ*D2¥[›bk F}ÊÇ Úš´|—•sîm6šÍfJ�¤Tuv2“óº9=rJ«XÌÔ¦öNÏížžtTiúŽG42$th5 g¦j»fi³ÂZU§î—&KÄĵr@´±: “~¿U«#H”±nXòÊå0¬H©2¡ ÆÄóÅÒh„A (l ³ÈÄÉ•Í0ÎwèÒ "k#’7ëlï¼Ý;½ëÙÏ𯾼~˳¾ë7o×K_%÷Õ Cƒ‰òD€½°FP-#í,ÄÄ£$t¨èéÌùo¤Jåß•ÿb„ûº•&_ˆízÏðãØùD5À>¾o{‚‘µÀXƒ!&˜Z �Ñ÷þØOÎìÚýÉ{îÞqà@¥ÞH²”ê;.—rÉÅSS³;w4g§f÷ìlÍN7g§wÜ_›˜âÊr µ†2•ˆÁFóìrys°Ñío¶íno«½²²´¶¾’Y lb"1YÏÓÔu™ Ò… U}¿^©Õ<Ïf9T¢QöwNOO6�ážø^H‰,!Ø/—Œ†2Ik%·ÿq””B`,0–bâ9®ƒ˜Ê%O ¢AH=l�‘Bl!R'iÎ•ÒÆ*k”R!�¡W)¡ÐϾëLNNØ?sÅe¨°r%\!NC+�€Ç&ºW~ý×½§AåkD€9�À7T¥Š¾èü·3h�QÖÚíÒ=~ЈZ‹€Aasâÿ¼ïå陓+K©Ö”9RJdƘºN’æã$Õ„æôò¢<7»ïÈŇ¯ºòðå—Oîš_ílŒ³ ;Œ†Ãh¨´DÀ©©µ%ש0âYK´$‚»JùÆ8ZS£>AÌjG«Á*¥uÆP’´ÏŸ‹6V©Ñ.°e—ºØ,/œâ£þÖÙ3ƒ¥ÅÎÉ“½Ó§Ð`(6·†ËK£õUÞï€<ö YS œÉÑéóg?wo¶¾ákÛ |`u–&)±Ô–íQúì¾ôMßý}ÇΜ]XZ1J©ã8Rr©øhÜ‹“±–9š2ÄB×|2¿Y!>«5+Œ¢°ä]~Õ¥/94Ѻ™ej!³q‚,Êe(q‚ ð½Pk-„�BX%y!"%?€Úh. WJ(×õ€ÒÈ 0!-ÐRYk·CÒ,Û>:À¶ðÙOŽ7Vp9Yâ‹ÜÅ”ïzF&�ÍÞÚR÷Ë>C"G<ÛY.Ãî`é¾»ÇOÛvoš:|ïÞ±ó¦[oîŒÇƒ¢È!¤å pÇÞ}w¼èÅÓ¹ÙÙ�¥å• ›[«ã¨ÅÝ­öòâ…SçÎ>²¾r>Š{šh 4‹Je_󌨹áéìtsz¦uðÒCÏ|γ_|h0ìMOÍnOò¥2¡NZðaœ(£ £”RcŒB�!B€"@jh,ÃlÛû‹Â\‡1†0TF)£¤âmD`;A–@´=üï0�Þö£b€ÑFi-…ÕFq¡•‚h¥B�€ŒJǶȰ’H …pfrÆu}Œœ"¥ \C¡/òa¯·püÄÉZ>ubùô‰³Ç:â‘…ã�œ{ä¡3>xæó÷­?½uêôÂ>ô™Ï,?¾y~!ÞÚ·Û½� «&€1æ—ì³ÌªHsÅ0©x¤äCÇ©LL–ggË33îÄ©7*33Í;§vÌÏìÙ5½g÷äüìäìÌÔìÔÄìÔÄÜd½U÷WŠBJ)µÍ¥)¤‰âŒº ‹âѨ?ކyC--Ï¡”¦(€Ô" 3 �µ˜Q�`cǘ¥2‰ %4À(a�.x†00Àº¡_ª”]?$„ HÇ£˜ ´JƒB‚˜ë8å™ÐIÁsÁùãÙYce u¼zs’ºAœ(L¼];Lµ¦·Ú] P”e„º€`^$J kå6”YøOÿ§Oó)ÿ?•/ÉÿƒÔ+_,Ø>b Z,Ú¾zÌÆA´�ß…BˆHcŠ@Tò~û÷u'Y–µMJ©ÕZĈƒ11jm}? +åÚDsuuõsŸºsù̙ɰ̴YVóÜ #ŽÔ8çÌ ‘P2“$C”ÜÎ7„J£•Ñ\K©¥6Š­yŒ4§¦àQoká´«yÑÛj/žª1¤FýªCˆ,J27*ÇZB-�Jä*7À�‡-ÏêŒÍºAÿäÂÚýGÏ|ú^>%ƒÑ-·=÷�ïýáCW_¹ÿš«–/8|¨TvÏϵW——Nœ 0쯯‰,¢ÄbÈå(ÏzƒörãÂ`ýB2Ü*ŠaÕe8OóöÖxe9ZZlŸ;³üè1Þï"%1Pûì½ù–[víÛG›r�]WC¤´5!¡ ‡¨U:B¡êAèQ†J“ˆP*”TFC!†ÆZi¥ÅVñBia­Ûê.+­VÀ(£„Õr;óÑŒ�Ö£0Œ`ßu%Ø`Òˆ!2Jó¼ ae;k+ÝÕe�&@Ež !†ã„¹A¯7úüçî}ô¾£çŽ>²túäê™Ó½µ¥[ÇH˜�­ˆ‡�âdÁá° IÕhÙÙÊ6×P–¤��ÑÊ…÷Ü}â¾»—N[?srãìéhØÍãhÐë¤iœ‹\Qð¬ÝÙ÷K¾EPR¤<–`£CWCáPáPã;¤\ò+• Tv}OX]bÌ�píè!âä@èY˜ç¹ä¹•�±EÈ@¤12 ‚²ëOÖš3ÍÉV¹Yõ+! ø„81™ÕhC ¬* ßu#ÕjY™ Î¥J c ¥3!ã,Oy¡ ‚ÌÓ”pˆ”…�Q’FI,µÚŽ-Bð<Ú`€Kn¹Umø– Nû•3ÇŽ»ˆ®3އÄuXàŠ-˜'°¶O¯ùÿyAå_T‹}}-¾²Ð`»¢6mwi!„€h´ÖFc„1FÙíÌyê�q–�RÉuÝÑ ŸŒ#Œ1¢ÄX ´Ö/¡Ëœ,N€6Ù¥åóó“­¦ë™á †ˆ£¤�×h¦$QŠL6ÆhcFÀX [ -"„aŒ-ÄÚm‡×Ð÷‚Ä*lD{éÜÖÂi P–Nއ´,bkD¡²TdyQh „@¥…:á‰*Ë"¤ÄŽf«A™ìò•Íö¹¥Í…%�¦�Vk×�}€Â kK?ý³?}ã•—©4Ê{�ñúêx}�jŽ�Ì’±)‚Ê¡ÆCÊSyÑÞÜ:urù‘£ñú† V}$^Z–�Nº¼bƒñÂbïü¹ÁÚÊÊ…ó ÊÄò=G.ª´& ¥¤²˜9NRß5Öj`0Öê²ï8 ­4¡Ã\Š=ư”aŒZk%Wº0FAh1(‡‚!%Ak�JIj¥r0v ¢Ð`1°Xh5´FKA¬ÅX%¡VV ßó(u´‚i’gIÖßhë4*Pö(j«×åÖÖ'¦1bk‹+0W—0á.�ëºE¢xœ ºq–á´ð•ò•ò´r¬�yZ¦€ò´É(JÆ~‘׬ƒ¡í÷WOœZxèác÷ÜóÈçï=~ß}'xhùø©öÂ…|sKôúé ”t†V+Yð< \Ïñ\Çñ|7„Ê" C'„çæ¼ŒØ„Ô=¿„‘«„'¹¯5)8L3̹C ë0ŒOq‰y•°:ZE±FE¯7ÞXÏ»Ýhm5ÞZÑqc,LjCB¢´•šXè1'Â.•1@j+ •k†%²Ê"D]Çó×ó}{Þ�2Jc¥”FŒ)#ŽÇœ²ëºV!!N=ô0��",d‘ò *û¿|üÖô1—Bð„ƒOoÿ©9•§²šÝÏÚmƒâJº4èmˆ�ñºÛòbøvj D¶(²f«iòôÝï|¨Y©Åq”B'ô «s¦I’!4÷}þžÕöÚ»ßó޲ïêd\†PGã¦ï1`8/° ¨�ÖŒÒXe€d Ph 2X„ EÁEÁ¡ÒDkÚÁ2AçÏÚ4 �on:Ð*‘3—h‚˜ïa—QƬµZk)¥µQ¤­ B_(>öÄ6ËaÁ]aÓîàáû€B„xðó™Œ_õ-ßüнŸ9vïg#¨È¦«¡‹ 6[EÆÐ!-ç¾�~.È(ƃxýä©ÑêÊ”4¡yV±�"šÄÅÚzga¡³±ª°íi�_¯ÍíÜ…Í„Äã\H‹0&Dh•¦)CÀŨxÔZ�§P+Fq©Qh(†Jyš­°VŠma `(A`0Êj‰¡&ØR‚Å” zÌ\Rk^ h)P ,²&‰³"W3™Òp<YÎm�û�¢ÈÇI<·kw©Ñèlu]@ª4ðf`ƒ DI–r­¼0Ð@3݆>sÊ^°-[ÇrÍ�(�R†gž%ˆ&ðôéñxX)•ò,£˜€¢_ >Á «Ÿ^ú¿¦ ò¤~ÔÛ®üÓ xlzc{·nïO<¨­ý’û—&OcžÊdå¿v´åIcóÆšÇbž8› ÿi‡b)$.p\àPH0ÀXB�}\j ÔVI-À2ˆ½]‡.õ[³9d±ÔEQHžQŸÂwŠ8‚&´:½+± Ô¦¿éÅ/ù‹ÿó[E¼åyRÐ<u�€y R-ÂCtF ÀÔ(h€UÄ¡…™å’„„Ü"�1Ƙj”!9‚°X)m‘ ¨¨È8I…C E"gŒp!,†Øw +°Ë Í­‡G:K,–3Û·nÕG´F;W 㜧R"׃ˆÕZ­ù3Ý¥³²Ó«+ãˆ"²ùÀFJPÇ”¬†XAGßa…ÍLrœÇfË‘¦š”üN’ønЬÖ2Áyž•$<Þ¼p¢Z"�™FŠd ª•«óó±… ×ƒQJ¬c “Ž]ÈqoŒ!S�…B�†e€9�àÀ ¤@eqßÅFä#U6îQ«¡”Ç£ÄCØ!bÇ+óœ8¬*-1j)„yš`¤Ö8ðGB.¬µ;ÃÔ÷[•éÝr>y®4n¼øêõ³‹£^ßÈHË~9@Vç@˜µ kr<ÞÛ,]tÑþÃºêÆ«.¾îòƒW_zé Wí¿äð�C‡8�§…‹½=»p¦Ä0õ,(}‡žauìºÆj+8C>d!ŠU”Ø<“¹ƒ°'Œ—Iœq ´kí‘m® .,äý^%Œ[[[Q»7IœhX‘ôX{Qk Ïq‘UŒvÇYEáö‘P*Ud:‹u·æ|. @–ŒÏ/’Aw—ƒŽ´ÜÙ@—`êÛÜÓ¼fí$ñ~qá¶}‹µÖ¡LHUªÕ^òŠWtF#!užñ²Š”3Hç§f†½�Ñ–:Œ¹ÞÖÆÆ……ó’ )%¥EÂ…ÖXm¡‚Hc¤!Öiˆ B@c�|,®‘RŠ(ÑIkFCž…S0+ƒþ çȇY¦0á¶;ƒf}Âp£ S ëƒö°”±4¶�e'„RWÝ’ŽŠ V6¹\§Q†e)•ÒVh•ä«„�,t-Pjæ2!ŠW½êU$ã®ÔeÂBÆ\‡rÍIÉð8ðK”2  ¶€Kg)B˜‚‰Sh;r#I2ÇÝ”r9K.ļX›L£ñ ;:yìÔTkbnzj}c9ðh’�÷ØuÍM×Ò²3’q z#™[�q`$�Ðe Œ…PY°²ÑN…tÂpœqÊ| P©R‹Ó,—Ê KÄg€`D‰ÔªÌ(*OGĵiåñ¢áx\qú ‡<º¾yËË^ùú÷üª5o¸ãEG®½¡:=wãm·ÍîÙÕ üÀÉұѲìû��å¥õcG÷ÏN_}è¢éV‹8í­WW.œ8.†£ùù�»ví�›Û=±{×e7ÝpäÆë¼é gª™!p~s«5·#ÉÇ) ”µ’DZÇ.Fp, Õ€* 8Ï£1ÏRl´‹ÒŠ‚�Æùx¬âDg¹ÍE1ǽ2v;‡4‰âÁÚý+p!_/·®!¾Èà©ãʶ| |Un1æñÊ�' ‹évû€�׿í-Ês‡Eáû%›&ˆ…�t”¬¬oD9¯4[S{w?úè£ýþ0tžŒú„º¹4€È2h 6”†ì¶zcL%,¦» ²Íp‚€ç´ØuÅÅ;®8Ûã9ýÔ”¤²iTÔüš�ƒl˜WÜ*$Ä€Z©¬¥"C}äÚÌbÌ  Í‰ÙB‰),—mÙæ¦6ßHG{/Ù]ÌJn©”JÁh4p™+xް$ºà>Œ=°Õé ©…4)54Ðp©²#*˜Ú¹ëºÛŸËC¯´{œhEž³> „u]VXy´Ñ>ûбÅG½üÐEØjŒl½Uñ*îE—¸äúËœzÐNFÖ§ý"«,·B@%�â2J kiÉ'•R;‰r«!£Œw{CæxNÆE–ðÜ !t(ËÒ8ÍÆ¥z�ˆ¨>Q1@#‹t&£~´ÙG¸ü&·6' üÜ ¬µúÒÎî?ÐÚ³k�Ö7WB—zeÃ!GÉÆfIªÙ™‰P¤Ë‹gN½÷ÂɇÇÀxÐ_Y>ûù=9 ¹iP+£‰Êþë®:rË ¥¹éSk+À#ç:«¨îFU]¿Ž”q¦mÕ ªÌ ‰Ss=¢€ ²|4 F¹À˜<ƒyA„d\:B«ÆÚõ5€IDATa,¢ÔE(­•’¢°J2£™”®æL ×HÇ*¢¥c5…ÍS•Ê™ÄÌš"›$j8ò¤¬CZÑ�¤9L2¢e‰"# ¹ƒ�Ú#EŒ¥ÚøâLàL¢L�\2¡HÎaœ™ÑÈŒFdùYQW69¿úà?~ìøgîÚÖŽÔC»ÕÙì&ãòT뢫//Í6Ǫˆ…H‹3Ú¬5å†HÅtcYÖhN;^ùÂfg3ÍÖ¢d+ç)¦9q»Ãc‹+/.ßsúìçΞû‡‡øÛûîýÛûîúÐ}wÍÚ·÷’ãd4RZ\{Ãõ¿ö¿.ŒÀPÏ…¥`rf²ŸŒÝFyrç<·¹¬PŠ9h¦9ÑpC�ÇÐÒò…Þ ;½sž„ÞüE{vÙ¿ãà^à�Ñh$Ó Ýôƒ¬ß®»T¥ñÚ7?{ü؃ÃQ‡y4J‡û/Þ{Í�WNÎMÌïÛ1·o‡_q³"ÂÄ ò"ƒ–ZUëÒR«Q™lÑÐsÃÀe�ÖP I©–+ÀöÈ™Ó' Ïóþ`®T�ôKƒÅe�?}Ü5:@D& 1ÕjµÒh«këaê@(²ã;þäܬ1æÌ™3ŽëE!dŒ«¾ œ<�.ßH òD®â©,²_�Ñä7,ºü‹/òÄ¢û1VA€Æx�¥Ô4(}ç{~h`ìÒpìNL �u’T–­K¯¿¶¾s6EJ“K”B„CLp¥ 0J ¶9±)± )´ÔšÛœÎPA®µ’€,Òqê@8;=Óî¶  XÕóåKo¸¢Úª•êÕ RÅž×Ú¹ËzáùNomÝaåèúÖ©áø¡­öC½Þ½ëŸ]]û‡sg"/xÅ÷~ß³ßðÆç½ù-¯}×»ßðÞzÍ»Þù†÷þÐwþØ�¾ë¿þ4©×ÆÑØcŽÃ<ļ;¾éåý<�¥¦^€-ú ï&8ÓQ»¡¿Õ©ôí»(ðÆR°Z#òdáÜÙ…Ó'•Ì6×–óx8=;õìÛŸµ{ßN€¥Tiž�V.œßX[tÚ÷|ö3ëk+ñh¼µ±Ùn·G£Ñ`0€È ¦æZ~…¼äÀîý;kUoïžÙ½ûwÕ'ªµf�ø‡,‘Ee¢IËA}bª^kLOφŽ'óÂÅ´Q©‹C¯ZrKé0™®L4Êa©JªuÜl„í{å;¾ÿŽo{hÕÀ¬ÅÉôÁ‹Î¬,�{=Â�󋽕%•Äs�æd¹æ+|¨5·§:qõ�ƒ/>ò—8ÜZê¶4C !ì2­%Ocƒ=³­ÝS�IÞow—{›K‹ 'WV†QG#5·gîÈ 7\ÿ¢Ýø‚î¹êê`jvsœ¯¬ QŒ%# T.E*2Îs ¢ F+%´–B ! Ï3¨ƒ˜ãBää"äè"DDÚ0 Ì� ³€x–kD,ŒU #ø,|Œ¡�…ÖÒeTKŽ­Ñ¼0yሸ2Eî\ò�ç2ŽÕ8q”q¤†Qº”Q¨y­"�½$:[§Ž>¼xêV[S/U0€Œ±AÄ0ñ©G”¥8ó8ÉÆ1A8Å[�N†Àßõ´ÖÀm£�o(uÒÿ¯AåK:E~…5úŸ‰'¸­|Ýë˜/w’_™.úÂlÿ¿…ûy¬y€EÐ"H©–k•°E™ÄäG~é—\ßüÜâù6„çGQB�ž’Êwª»ç.»ñj²O6z� ZÖZ»®K)åRh¨5œÙ”™˜�Ä1)±² � r°uˆÄ€�Ì1ÎíÚe!Œ†i–wº½¤È™Ï�KüjµµsÇü%ëf£G�žžê0:Ü «—½ô›õïþþw?ö‰?¸óÎ_ýûþÚßð7?ò�ÿãÿüÆW¿á¯xÝ‹ßö=·¼æõÏ|åk_þßuûë^Ûë_ÊÕ• k•R ³p4HrnéËæ/¾ ”k^} Ag¦:=_�š-M�tŒ`æ{ºVUÍæ½++Ÿ>}úÑ^{MÉŽäÂs«3³µfsœ$§OŸî÷Ûq2Úènž¾pº—övÙ½û²}­}³7Ýñ¬‹®¾üìÆZjÍR{k�e£,=qæl’giÁ‡qÔöO/.ä@/µ×Æ<ŒÄ<çi¦D¦¥„0Õ:hÕSds  ÚY²5èu†ýmëß” ®­vÔO V^^Ù¤NXµÕîmv{ýè?þÃÿî}ôÇïþ *ÆŸþ‡ž?qtåÜ£�ÞÿÙñÖ2¶EàR!4äÜÉsw}üS‹'Ï=ø¹{†ŽìÛÁ œœjp#„Õqž!F!CÚª¼ˆ{Ý�"�˜>³õ béÌé §NÝõÉO~ô>v÷�Ÿžš™&¦–‹tßM×�0Š´î¥É0M“‚J#×E#®Ç\`d¡}lÞ_qe”‚ZC£ çE‚Œ¦bkŒP+-|‚(Çh�¢;”Qˆ@.aq°�PY¤-Ò1$�²´�Åö¤ºRFe �\am€PFK¡TÂsä1¯FI$¥p0RI"£XÄñpÔÇ£î¨7LFBq.r 9�ÇI§�é¨_r�,M!Äq™ëAˆBZ©íðkŒbôÀCƒ={öH!„cÍã!�OO<~#�Ê—`Pþ•Üõ¢þ‰gõỏùBÍb!Ðh°Bñ­ÍuÍeµRO„ºîŽüدýÊŠV_9¿`¥�›²­FD!]nŠ(î?ëùÏ@eEê—}¡ÖšyÌ@ +Xx°p€dÀP  „,‚Z‰¡v‰dh¬åÒh J§Ö$Aéó=yê,v\®tmçήÑzèþßþÐßÿÜûÿJïÝó¿ý[¯û…ŸÿÙ¿~ß ¾û»ÕÔLQ©õ‘ãÍíÂ3î�Ãxrf$-nLØ-ãÈ�çF"‘»cï! ¬楰Æ-ؽäEwüùÝŸùäé‹ãx#ÉŒSªOÏ_sëmºZûÁ_øÅ¤RþÔââôM7<ÿû¿ï”ÖŸÜX;§Íç7ÚŸ:un¡7^êŒbiR cX%Ì�:?ÜüóO~ð' ó­×]¹ÿ7¶ÜsíÕox÷».½ùÆ�™=»Æ\?³PjMí¹øâØB§ÑÌ)=×nŸÙÜ|téBl”[¯‘°¤1Í-ìòîã'ï9söèærðÂA©.84´‘’9†"tôDý¾Íµ…$¾ïÜÙQ‘Õ›U‡Ë�¥°¥e9’ÎêÉ;?2^>iãv½Š�Mµzë¹Ìºãá(Ë5õ;íÂbÔë´ ñ°+óK:Od±.M„L„PDÔ˜Ý3uæwÎ-™aâ K£âüýÇî»ó³ÄsRŸÞyþÄ�[¯Û{Ãõ©)7,i†Qeù Š’,—RC•ÒBêœs©•�@i­­Êe‘)FAK °RI)…( a¸ÔR[e­�ò±q+ZF)ŒBP£�±#3É“,Mó‚RIc…Q¹,„B©\™\fãXr•ó¢�ÛÉ`\Ä*H Ú( µ¢„=Çq]Æ•4ZB¥¨6DHžD³­Æáû륒CY{sKQ­V…2Ê„�2Za¬•FJÇ£k¯½¾( êºiš~)C–§ ”oŒö×Wˆ®úÏw-¾¸Æú*ÀË@ €VAK™šžVRŠ¢Kµ^<~ÖË_ö‘{îþЉGþχÿæG~í—_ó_¾C¹ `€ªT+N%xöÏ%1„0/R¥…1šR°1Øj š"M,B� d¥ÚV ) £8±VÝ4ztmåÑ•¥ûNž\X]Ûwðð0Î>qçgûƒÑ£çÏßñͯxÏÏý�7þà;ßõK¿ôŠw¾ÍïͯVÁä”­5p­Y™˜&^…–›:—–z¥Ö´BŒÄ·\‚J¹ÚÔÔ%Ž—Œ]hÄ@b‰søùÏùó»>óÚ÷¼3©øç“ѽ g>ôàçÿòÓŸ¸úæg‚æä¾ûû/Îíoý±¿ñU¯üÙ¿þóù›o<üÜ;~â·ûÙ¯~-¨4âþçùÁ~íÛÞ~äêë"Á÷\|ä»~ü‡ný¦ç‡»&'8×ï=¸xaúÈÁÅQïÏÿæ}K½Þìþ·ÜñügÝñüDp·RkÌÎOíܵÜŒ•™Ú³çÙßôÒK®½a¹ÝyäôñÃ¥�͇Nœ¼ú–[Ž\wm07¹ÐÝ8»¹š#“j¹Þïv’q ÌZ1¾wéô‡O<Moþ¯?ü–}×¹­•\Œ |<ÒÙxÇD‰˜ÈÁyµŽ¹[›C˜'ijnÂ`í”˹µ kÔw©çy¥’Zñ¢U¯9˜@©%Ï*•�0¤ È"ß+µ& 4AÄaI”n.¯–©;W›�ƒ”’’‡fæ{KËÇŽ{Þ+_vë7¿à� §Sd&f¦gçæ¦ggjµšçyÊ`!£®Ršç…(¸ä\)e­–JpÉ¥–\¤-†«µÎó\H-¤Õ(m¹RJ­µV*n´Tº(x–ËH–ZŒ¢±�Æ÷}„PgÑ(ÖÒ„N ”FK.DÊ�0!�€&h�ŽÉ(¬–°KzƒÁ¶ 4¥X�DQEy’RJ=æ0c¨T%Ï­UJíµ�õµ—‘F£!¥”Rj!NàŒ Î Á“"&ÑáÇ/¾êJ×÷y–9Ž£µ†~)£¯§¡åk*_À�í8“/¤§lïO‘yãòå‚ë¿ LzÒ»?•rçI¦/_ˆiÿä.l¶À�|\¸õÅ9OÓùg¯üÏA?C ,´ˆ"J�[�˜W¡nÉ\.7¢¶^×劙šPÓ o×ÔÔÞ�ÊBÝD!Pi^ú¼Þ×îm’Ug©ß@NÐMãTàXÁ�TŠSOX7¬ö!�1YOE›[Ӝٰîû~ô£kßü?ý“òW¾æµ‡_ò⛾õ oÿ…Ÿû±ßøß7¿ôuúÌ#ÇûI\ž3/»ý›¯xþ«SR•~-±bÏ(b¸CtH@`ZB¢¡Ê¬Ì�‘Fä@› k �È¥Œ'ôj \‘%ÏF¡«sÄL™6fv?÷yïø�ßxÃÏü×—ÿè¿þ'~òÇ~ã·oÿ¶×ÙÉŠšo½ñ]ï„A ú-]™û¾_û¿ÏþÎïU»^÷ú7¾ñ§ì=Wš°µÃ›;`ëS‘Z=?¼öŠç¼àÙ¯�ä 2ð8¢Aszç‘Ë]{“[Ÿ9½Þ·aý[ÞöÝ[…+°ûÐ%s»öï=|åõ/~uýê›/Ã[^õŽŸØyÃóoº£ƒÆ¡k¿ççíº×~û3Þü]/ý‰ëÿú±sO1¹3kLÏßüL¹cþs•ë¯íÿï¯ù™ÿŽÿù‹èàþ…Ñðö½üð%WsÎ“ÑØJsâ̹�$^õûÝNÙ€J­ÔKîD­Å&P‡$®7uÑ%þ¾Ëcê ’Ä­U�éÉM©V¢¸ÇóÔà­q<Ƹ-åOVâ~GƹæÈ%n@¹È×——ˆ…õJuª5U«5„Ô½$Úˆz¿þ'¿k[ÕU$þׇßÿ¹‡ï'Æ á–÷LGZ7êÑÁpa¯ª§Ld€²hH¤)!Ì„©0ÇÁvœ÷S=¶( ’ e ØtÓ$CÈ^Ž$Ç|,ú9̆Z ¸…J[ž¦}¥"Ç3ÀÑ}=ɱÀœ9» ›v1F£4æ'(U|0:ËmÂq‘ê4‘Ùú¸Oçš}´!o«¤[äÖs¤VÆ(#U–e:P‘�•·Î­ WG«Y4†.Ež¯ˆ“JŽ=/Ó6Rr ‹�q0ŒêasqyC ¶F¥RÖZ1ÐÖZ`!´jˆÕÓ†’_PybúÖ÷¯ŽEøúæ |1òý30Ö» �_ü£¯þMŸ”iÁ“²J¡Ðìö�BQŒ·çÞ1ˆ‚!€ … ±°pö²Ë^ÿ=ßûgûÄÙhüH§ó©S'l«µĹñèøòjµ[jlEÅ玟:¾Õ^Pêx4úÔâÂío~ÓýÞï¼ãþòå/xþŽ[oröï{Ñ[ßööŸú©—½åí¦R“•êíßúº·ýÄ¿ã½?ÒÚ³XèyàÂGÈÁÈǘcŠ it4dž›"C‚"ƒpÙ57í8pø¢Ë¯¸ñYÏzÆÏyÖKï¸ö™·LìÚmƒÒf"Ž-·OuâÔm˜ê|6ÍÔ|¸û¢ÙË®n8Ìï¬îÜcÂò‡ ÃtCÂ>fçâx˜%žž‰o®‹Fùº¿èÖ—¿ì¿üÐ{g.»ü-ï|÷/ÿÎï:‡~ìüƒÃÁý�αñ yõ37]ߺærÙ¬­ªâÌp¸’¤kI¼<ê÷ŠB30Z(]ÅD½”f”}¯ˆSc­ÅP00@ -Ò<ÈB+”γb,TžŠt”9ài%¤Ò'ŒZH”Utº²à[ëBKŽt¤*ŽF¸P$-¼X´ˆmv=âqXm,nµq¹¼sn�ωƴְ?ŽˆÆÖ‚ric4\ênFûqçû§1åk *ÿFuÖ‡ ¹öÑ¿¡ò/ ‹9ùRxó›{_uÓB¸Í¬XhD!0²hˆ†Û»E@c¤16ı Õþ8yÅ÷~ßÏýÙ×®¼lÿónׯþú;õ×üÿ×>ô¡o}Ç{†ÆyàÜò®«n¼ø¶çýèoþöÏÿÕþ÷‡þñWÞÿÁpÿ![©]þ¼çÛ¾W‡UQ.ÇÔSnu¹3^ÞA·¼9Í<è×*<Ë,4˜ òîÚR²¶ªGƒ…Ÿ:vÿÒ™‡OßîÑ{O>rï£ÞuáøCÝ¥…µs'Ï»ÿÄ}wÝÿé�~ö#ûÑ÷ýùßÿéÞwï]N�úkѸS#”5&‹3YÆ\”$q3‚dà Š¨_ª”[Ôz2–\à2käÆâ¹üó?ûÇ¿ùÛøÀß~惟çùe—^qèÈ¥�ÉæT‚rË –ø˜ù¥ ²*„aO àúe憖8ÖñH¹ |?Q 16–ZS'¬×«Ífkbjvv¶Hòó§Ž=~ô¡cŸüÈGïþÌÝG?ÿàÑ{¼óSŸ^\Y÷«•Û˜û�=òÈ£§{±øàG>ýWô×=tÂ`~×ÁæÎ½¶ÖJ¼�îØ“T›õ+¯«\óÌÆu·]ñò׿ú‡æ;ñ×'¯½!®¶:ĵõžšŒ|¼ª³£Ý•U‘x»ç.~þÏ{ÛÛßþs¿üö_üµ7üÌ/¼æ'þ?þK/|Ç}Æ›ßué+Því·|dz¾ý·¾õ/þ¾yõ»~èÕïúá~çw|îhϾé›nÜó¼Û÷ÞþìW¾÷=Ï|ûÛ¿øE³7Ü4DL"'2˜N̾ø{Þùîßú�o~÷{^öÎ|ù;~ðÆ×¼öæoÓõ¯yõõ¯ý–ç¾í­/Ç÷=ûÛ¿uî†ët«Õ¶úÔ ßáÙf4L¥\[[YÞÝÜtÚåÐÏ1ë(Ëû§LH“¤z�7VÅ]k<‚C×![kó<�’x<Ištydâ<ŒuÎ©Ï ¤Æºè¨x¤3K±fÒ-Á^,{±GüÅ•µ‡o|Æ·?÷ï?ÿÀ©åõÍQ܉Rãø›qrtyùô°ÿ©³'§Ž|Ñë_[Pì5«™ä«ëkå°ä¹.¶¬ 1êô‹8u]ïÌùÅ_ÿÝß9tè�ÖJE©Ã(“JH%FOû@å ÛS$Òá—ßž:~ü{õOÛ|bñ%Ífþ¿¥‹žhQƒÀð±ls³ÍÛ[k�1ÆØí4;i¬�p[f 4Ðj€4F€ìzõ‰n–]û½ûþ?ßú#?²ÿ¶ÛD½)­!"W½à¥?ÿ§ùâ·ïM¯xÍÞùÞúÞ‹”vrëÍì9\jÎ'©QW'ç¡¡"æÔâx½W¶Þ'?ðá¿ýã?ôîûO?|ôÓŸøø‡ÿæú›÷ÿÅÿýߟÿôÇÛKç>ðô¹O~d¸¹’ÖFý¥Agq}åø¹Ó÷�~ä¾ãÝ{úáûνÿìñ‡–Î>2X_”Q×fC˜ŒŽ=üàgïüÔ?|èÞ;?º|ꄎcÇBßb'RnXªQ*CZ ƒ:ƒ¬·ÞÙ\[�×6N|殟`ñÌ©ãÞ»|êøpé|Þë`‘—¢F5*åF³æñ˘"DbRT¨,€„=/HsA™ç· 7F;,ÖŠ]ÏPZShÉ•äœ'qÜ nÐ|£9[©U0­c–ovBivÏÎ7+ -ò¿Z–9a¹11·£ÒÚßœM—;ïû­ßûôû>\N-¬Ha7’tÏ×Þsv)Ö,µ¾š¹SÓó¥™=9òsC-ô€¥ØR‚ðh8ÌxÑîö9uæþ§Â8“Ó¤ÙJˆ4È Ñ®Ÿ«-ܘŒ,eÓ»Ìäž›­^tø’ç¿èoyÛ5¯zÝ%Ïñ¥/z ÚµGTºÚÌ€Ý: ·2eY9®ök“—\;±÷0.µ¬SÉ5)ÍìÚyÍõ;®½~âÒË'/¿ü†W|ó«ßóåUj¢qçÉG{Fg·vî”…µz{0쌇˜Ñaœd’†ÃåÕÕåÕõ¬Rk@h,õ°àKƒÁj%˜ÄˆŽ†Nß§‘KS—eKJÁÃ"¤VåŽ]ŽzºâÂ’»Þo�³¸RªBBÛY2Æä�ïzGýòËoxõk^ó#ï=1�çüähÖVÁ�qb6$`nè"!®GŒ1žçYk¸’¾ïya ŒÑ¸®‹1¶:s\—@Ä0 &ã ÏM ]ëU�LÅ+­2¥.Ø/p±ï׉Ó!`FQ ¥Ò® R±À•RD±Ïh¥V·˜LÍÌÞÿý�ãZa<æ{à!Z€&®4AP)p%AáXU#ÓH-ÝŠJ©ÞéׂL¿ósùƒ?øÐïÿß÷ýÖo¼ï×æÃ¿÷KûóßúÐÿêŸüæÏÿÞ¯ü�¿üýßøô‡?°Þo[F€ãLýƔаŽõ9 ¬6‘K¤$®–Z*ÑHà"Q®_Ån)Ïô*È©ä`â74˜Y⢰ŒÊ•”P*í½õ–7¾ó¾çÇü�ïø�×^s®Ûž»äâÂ!».»˜µê}†Ðì$˜nUŽ\ôÂïúŽË_ð\Ù¬ñF­˜šŒëõtv ìÛÓ­U�kyB«Ó,�Ó“«íN-^ØènöGq"C¯ê@ïüÖV¬õ¡k¯>xí…ƒèdmâÐÞ6®,<¸±Ò&æm?õcpv6f.¯Ö¯xÑ‹ü�ÿè~û7¿ÿWþ×·ýÌO¿æ=ï~Í¿÷Ú—¾dd-m4ÿð}}¡Ý©ÍL+„üri£ÛVZçižÆ™*I’v»=Çó;w½õ{¿ üX´$%RJŒñì#ŸlûtìßT¾ÀW…ö×S\L¿\Õò5›y|®<‰WÿgÆÃOmø|‘yå¿®è û¶Ÿæ“½¶¡À@h�ˆ ‘…È<þâ´…&�“$´‡ãþfgmeù™ÇïþÌgïúÔgΜ:©t1×jZ™{$DÄìž™ž¨V=Ê8ÏÃ0¬Vˈ¢°V*5+~5„ËXAi‰A )ƒZóѨ�û¨P‚ã#à#P¸D ³Àä¹HSU¤È¨€b�úD�«`ÔÝŸýÔ]ŸýÔ‡þþïÞÿ—õðn­­‹‚«‚çq¢Ó4dŒåtÇn‰ДKÄ@”Ž©ÏŒÑ`à{c^Á¥Š…ˆ94ˆú• ¬ˆU&¢\D9·ð�wߣÜàìÆfcçîÓ¡PakŠUêakƺ¥î0+°7ѥչݕ]¥N¸ãònûÖ·½â»~àMïþÑ·þÐO¼é]?ò–÷þÔ÷ÿì/½ý§þÛ+¾óû毺v½çúÃsýá�ë®é[¿ãÀ¥W\qÍu»öÜ}ÉaS ½=s×¾úe׿æ¥ßûË¿àÍÏrQš˜åÀГµº©6t£M]®fÒ& ¿²Ö¬löZ3s£8!®—IɵDq·7èGÑ8MN-œ?·¼L‚`×¾ýÙ82ƈ Î FÚm-á§{__Pù÷ž#ù׎þÛqe{ÛÎ^O“ÿ‚ˆàI…ËWñA¾ d#€Ð6+o²ƒÇO@ �ˆXH¬%¦V+…. ÆD\ˆDz˜ŠLÉŒ›B¸Ì…LÓ´Ò¨'"ƒöë>—I°ññO|ègö'ÎÇòòΣÍó°°IIAÞœƒˆ€sÊUæC`*)8#sLc\ˆª?jЍÙhŽÇãz« ™*=úØÃœ¸W½â%SÍh¢WÙ"7E–„ظ|˜u‰@I«>HÇ.–Q«µgfxMÏîÜè�昅@u'•¦•"Ya-bA½î)SŽ àÌ„‚ •7Ò{$‰CGqáUå« ŒƒµŽ)¥QðžÐ¨Y©|#Aƒ(Q]!j%Q�ǵٽû†²Ô9Æ‚z�S¦ÊJ—÷ÄKÝ[]÷ “� 'Ëb0dF3mõp¬ú=Èòj#¹°iÿ4Œ¹€a|uí|~³å}87¸³UeÖ?ɾ°F Jƒ­ "6A}ì*Ú;Ì0_A‘ë²ÒžPGi…Öé�sä´U#Á¥p%à´Óµ$ bDt–�1ífƒ€OXЪ×vÎWÈW *��`Ü#`Œ`ŠŽÊ,5e9êv×»++ƒnwñÌ™áÆÆÒé3+‹‹K§OwW–‡ݵå¥þÚê »>î÷Šá0ôuYX%)xN±•U6Ê<“y†µƒV ”LSS ”Îs=N#ŒÚQ(�¯‡B`hFaHp=‰`,±Ú«ŠX««r¸Ñl¬ª2µJª"W2§BÁ)ÅRJëÜz—ÔÚYã FÉ&©$‰jFi]IBH«Ý!"hLL„�Fsz¢95%¢e! #Ê…ñNYç` J©f£¶g׎,ýùŸýé/ÿÊ/¾ç=¿£dYæi½Q‚À{_UU^䀑Q¦Öè\{Ã�·?÷Žk^_o¶¥ÎãÍDÞc„€œûc‚àªéÖ—ûëØü¨z=]åì /bÙF:óÙ²\ù}¸hÏO™K>½`x2yï1Å¡Í9ÁY–kË‹ëk�F­V�çæfœs㢪DbB”qÀD[o¬õÞo*RÎ8ç@kmŒBž2L0�(aŒŠsc4˜!ÌPï˜u´R€0 Sã0¦�à±1NJmœw’$a�Pª’JQJΫØ65ä¼ LP†=‚�.­©¯+SŒeÚWÙÈdc•�d:”£³F8œÇ•DR ‚½·< ¸Ö9e4f”Â0¡˜8cM¥ˆ'Ä8\¹8®tèh ´�*T5r€c‚|%‹JæÔh¢ULèL½Æ¤.Öº£¥•teMFywc¼º¦†ƒ|}ƒ*Yç)EÁïòl(ó´Y‹\ø¬ R›,]|âXÞ߬.¯ž9Uziw]އ¦(|Y2ðH/%w>á¼ÆyHˆ—’ƒdÅ� 1¢ÚrXjjRª�MYê²ðZSç‘Ö`4uNeÙ¨Ûold=¨*=Ë�¾ÜØ(ÖÖ†ËKe·kFýª·^tW‡K Eom¸r6ÛX-úëÙúʸ»’ot{Kó½¥³ã�n1fÃ~•�‘ÕÈ*>‰‚(<ö˜ò ŒãQ½ÎÂ8kL„B„ªTUQZmŒ4œ;vî®·;!C©‚Õ›Q£ãE<`aBx¨ÒΡaa eY4µ‰NczºµkÇôòâ™_ÿoïÂÈ£åx<Œ¢(ŽëcÊ8"0G„#ÂQ@œp± *h“«�ÎÃÉÕÌã<¨|ÑÊW[Íþ�5ç/¬k]¡–ÌE¯\aëþÊçxží~.…· Ó„�s6`ã¼÷‚@öúëF¡˜l·”ªga­¦Œ„-žPĸ'Ôö[ðàÀB„œsï½ÖzÓ5oZ{9ÇyÇ5ÎLq(  0Z9g⠪¢”òFR«ÕjQRJ«ªBÈsέÑÚHï-!ˆSœgã2Í­’Ø'X˪JSYŒª|h«LY9Ž{kãÞZ9Èl\¥#5ƒ,¹3!¬2Ž`¬µv”R(Š"ë@�0%„9íT©Àà�„DoZÍ A²ÎiN5øJùRù¬‚Rg½”ÙF·Ž|ž©pQYA%Íxœ­¯«áWeÞëeë6ËûkÎiÆñÆÆz­ÏLwjQH$”Qck”›4¯wÀ¥0u€­ÇÚacˆw^+¤TÄu:$À¼!©Ôî­àÄ™e2Ëòa? ²áŒ  (¦àt•Ã¾ÊÆ6ψT.Ë«~_ f4®,ö«þF±±Qöz£••l}}¼¶š®­åý^Õï›t(Ç#W¤Äiâ´«*•�U>.Ó4Š|Œ¼BF¥Q…ÒÚã¤ÑŒjÍvg*ˆjÎzâ0hÛj4wîܽwÿA  Dˆ‚�5¬ÑÐŒk`sÄ#ÏB ÂQá‚ g”á¢Ì ò„ £äÜìt #XgiQäÍf=ÏS£5` ˜ç«JKå¬Ãè“Ì Ú,j¡'kÌW×—C¦riDû‡Iúº(ˆ_øt…�ö ½úÿͲÊ ”�ã­ÁÖ|<cl¬)µôÞSŠòë?ô@Àh³‘(]aFã¤n=`.4KˆÃÄ޹ A€Å„ ‚ÁZëBV›4J)À&mÆBcŠ D1a”rÊ(&œsÄ{d­=»°DŸô—ÔRyëT‘—y*(Û$²Š«ªòÆŒ½6º”Ý••*K‹ñHŽÇĸr8Re¦Ë,õm•zS€‘¶,MQx)½”®ªLQ€ÑÈCÀÅØèPÒT•ò˜hã”vÚ¹JšQ^f•,µÝè�ŠB*í6ú£qQ ÆY©Œ#¼RÎ{2¦HùOš, !€¡Ùp4\ßà€ëAHòZë²Øä›©<�©†ƒ�å™fE™yЭNÓ3*Æž"ÂHžŽ™÷30šx¸à” Æ‘sAÀ“ZÅ�XpÁˆó†Td9ä”&Þé²Ðªm­ÒVV^+pœµVëJ–EV¤c]V ­©d@Y-NB&"Å8#Ö1Œ±1ؘfµ)2�÷¶.Ñ2DÊ•9Ñ’hYŽFÄ*Šyƒ¼g9g²ñ(÷{k«+KËY–B¬syQgKå &­Ît-iEQ½ÑhÕ¢ÚŽ»¦&g¡“ÎôÌÌÞýs;'æv²¨ŽÂxèˆ ,j­0©{Hí¥m³Ù¤‚—eÞl5('Z+c xi–&I"µÒJ9³ ¬‰ &T8‹œxª{ WáäË T¶|Rþ"Ê\ÿg_WÂã‚'YÅ— Î÷ó·™±¿ò yVìƒó–-—žÿE`vþ <Ƙ1F¶Öƒ·I¶ê5cUžç<Ú�Ie �bÏ„ÃÌ"¬œWÎÚ„ ŠöaFòÖZçÜ&³À{ïœqÎBc›] ï £˜" q ^+N ï´)óôñÇt» y§J°rªÝª�•Fž¢K•†£^´ÑOû}™ØzlµÎ‹ñ` ‹ÂV%6†X르JaëF%Œ ŽzÄ„Öà&R{Œ9E”Ñ ¦$h4'”…õáx\ÈÊ"%†�…c‘¥ŽPoÒv[LN‰‰I’4*í²¼*³JfrÜö6†§‚1615ÙžžQ¨œ§­%ÅÎê’`‡‘u¦§ÁR–Aì?tM©«õ~O„¼=Ù&Œ–ei­â0"Bhc ­,òˆQ"8æL9ëQÎ*o<À0"„`ŒÁc�À‚ׯë=„„0BÈ&›Æ(­µ®ªJ[³ù5p॔ZKN0Áà�ÆÈ3B1òÎo*eyG1BÎ"­±1`4AÞë¼%„`Šxç­G`µIÓ´Û탲,�1ˆ’(©cJ¥vE¥=¢Ö"(c”Z륔këARoMÍÔÚmÄ"®×ZíZk"LšD$˜G"jШn1Ó˜cbôF#ÊØÄÔô`8êÇ­N›R çy'‰q6ŽcÂ覞÷ÞZ¯µvΡͿò'×ÿE»¿«ë‹í©À³Æ•-å÷ÿõ‹ âR̸K˜Ë•Ë6)Åÿ«2ªËÕEp²¥"çù Œ0€s€’s)�’e·Û ¢Ð9—æÙôÌlZ*"„ÃÔj<˜Íf)åˆ�Ï î0Æ6ûêÖjcÌ9 uª’Zkä½sœ'›ºeFo�‘‚Ñ€Ò@ÐÝ»æ¼QU™fé`Ø[][:[¦н*ób<¬÷�T!åýõ�Õ…E+ Ò{@Ö klQÈñ˜8ÚïBÞ:kŒ·yðÖiiÀû0œsa ¨Ÿe€²N+‡µHÄBDíöäŽ]{“ÆÎë�‰�»¦÷ØyèÐÄî½�Ù3uöíŸ:x ±gn4g\3{àÀì�k,Ý4Ï�ÓÀFii=FTJåR–V³Z¶‘$`Q# à(SŒ�q‚¢Î©²ÊÇi£Q㸬òz«937+â¤PšÞèto}ccqqy<WUµÙw‰÷ÞnŽcJBüf!(¥›C$ÚÈJÎƈ" ø¦ DFPF�ˆ(ᘲf³-xȘp(<ˆ&Ò:í1bœˆ€2AÜÁYЀó(Œõz§5ëQ³Ôëq£ÙšœªµÛ@™G8Jjaœ4:“³³í‰É°V¯5šÍV'ª7Z“Æú¨Vß»ï@œ4ÛSÓí™O±'j‰GÐn·9¡‚²©‰Éf\CÖ B9àz ­UVDZAX† •Š™èÔ[œó‰ÉéBioÀY`a”t:o¼qç�í™ÙSKKkÝ(IzýA–eÍF[†áx”õ†£4/'Û“76úá]»÷n G©R•÷»¯=¤¼�[ÍÖÌLP¯µ¦Ã„„1 C‹qÜl¶'&'&¦¼±«K«3 dõìJ•å«ë¦”íz#í òÁ(áÁ]Ó³í¤Þã™öÄÜÜÜôäd£VgTÄqÜl¶£(‰jõ¹»âZ£(eœÔóJjm< 8JšÍf¥$ålœe<å¬Õi@YJ„°÷¾Ýž˜ššÙ±{÷þƒ‡öïß?777==­* Î7ÂØJ5êmäý~>ùp¬Ë2âÌ”rmq9½3ƒÖzc}-ÍF ãA¿×]_§ÃÕµå¥å³ý^w3éÔZ«JbJÃ0äaÕê@¨u¨7>çöçYë0¢œœósˆà Fͽ#äÿaÚ�_]ÏTÎkg]áßEïÜü~|él¨‹ªX[Îv|é u9ì¹Ò.ņKInÏJËùYw�ž~s6gñ`‹pg÷žz£SI-•)ò*Ïóñp`ŒÙìŸ/y9ç#çÜfÿÓhí½’çà1†Î]…1F)cŒ+K©”1s€Çk}=®×âz(Â0J áž GˆòÖ!ÀÁx:F4BŽRÇ,ŽX”4&'““Q³™´:�N'j6E\G"$"I#j´ƒ¸NĈõ@fƦî0Õ€¹\UDp©í©'M®8àzÕ)­¬å½þhe­êŒ­Ÿ<}úðã4W‰Åh\.=qê‰Gëž]f·k y<9=ã9ïåãæôÔ/zÑ¡›n®·&€²k®¿AÄɱS§,Æg××E½4ÝáprvNð8—DD8êÓS%E‹£a29ÕØ¹“6›>ŽI£í¢È‹ 1;×ܹ³b Â(ª·f«ý¥¥•�µ�ÅÓóƒîÆ™c§z‹kY·Ÿ÷†ë§Ï.;¹rzacq¥è�„ÇÌ#P†cZ‹“N³#«Åõééé©Ù™}{X@"IsDèî]{''fkµFRo\{ý ‡®»þÆ›o™™ÛÑžšnu&g¦çvìÜÝl´Û­‰Z­17·sÇÜ®¹é¹Ù©éÉÉI†èts¢·²V ÆY¯¿~zWj´Þ%F›,/‡£��š!%ÅhøÄ?ñøcgOŸZ8u|þÌ©2MÀãÁ Ë2Œ1Ã$äÂ;Ö„o4k"‚(Š“z\o°0^ë '¦w\Ó­sr^2êÒŠïÓÐåbJËÕjØ—¨œÙ—2ß²DsiAìKìlo1Sòô×—žmô/Å’g›ÁÀeäm®ô áÊÆeñy ^šç¿èÅEUU•D¥ãQ¯×“Ua�ö` EœÒ󧤌ÖRim7­¼)¥Œ ‚<òZ•E‘¥¡àQlvM7{¤Ø8\¥\)‰µÈ:SJ0–Q†1á#†0¡„…aˆ(1FU®´ÆŒÒ@ÐPxB=¥4ˆ€ ‡) £¤Ù kM*"*b Ä"ŒÃ�G1å¦Ì²ÆÇqÍH/¥ ‚È{dÁ%ÊšáhdŒ™l5ç&¦òáàèmÌ/ù<ãF¯�<Ù==¿~òôðìÊ‹áâÒ§?t÷êñ(-I^õOŸ=ûر?úÉîñ3*/»kk½^�‡ÁôŽ�žÐ³+«7Üxó¡n AØèLì¿ö†Ù½{wìÝ×™™K&Ú³û´wì,­ ëÍ©�»P X=™Ø½³1;ONHÆšs;pR“„ø0ôah[íhb±eÂx¼¶Ú+Æi@˜ÕÆ(Ûª7BÂBÔxŸU¸’¾ªôh¼vúÌúü‚�ÓµõS�>ò…Ç–NϧÃQ1J‘ArˆSêTLMMÍNÏíšÛ5;5ÝiNÌNÍ! Q˜T¥b<D„1�3¥ÌD»=ÑéÌMÎÔÃÄJ3ì½~™£õÞÂñSj<^8zì±{?7^],-¢²hñ`" '’¨NYÑïû¬˜Œj³ÍöêÂÂúâY§”SryqáÌ©“Œ‘F=qÎ Á½wXG¡Ü[ë12àiXDÆ…\îöžÿÒ—yÂ1Îc£Ás^­ËƒGà67üädÊæ¶Uຊ+_& r¹¾È•·”ÿá¬íMS¶Á‰-#û¥ÃöIÌ…�•mxWx'"OŠÃ¨Eؙܹ;it–VÖ¬µiš†‚9«UYZ¥�ó›{Þ:£¬–ƃQJ1Æ`�syGï(FŒ`‚°3ÚI‰”¥b&¨1š„à:%ܹÀÙ!jl€P€)±G k™÷Ì{ŠpD9Ç{�¥R•Þ”{±Yã1¢”s‚™#Ê9a1;Œ!€ xÞS„) ¬mL9õ(âŒÕe‰œ›?zl}aa"ŠY¥ªþ ;¦7?o†CÙë™ñ ]_¯,2SÕ�ÛÙª�WO>ú�éõg‚°n�ZYë?¹zjþÔãÇüÌçŽ<ü°×fnj:aÚO³¢b< "ÄœïÜ»Ÿ„ÑŽû ÆA§5¹kwj]Žq25ݘ�3"( jNO¸áKé È "žŠB‹™¤œ7ˆâ  BhïW»ëœeYZ©8F^™z:)uQ¨<íÔ“‰¸–⫪ ÊA_�R—çYwcéôé…ãÇWÆÝnwieíìÙq¯×¢ÞÊJ¾1ˆ¬®‚2U–ç£áÒÂü°·‘q 8#º*Áhì¬@Jå*µºpv¸ºžu7–Ï,}ôÑÞòâÙOô‡‹Ë£¥¥|e-[]Jùq†Ké³¢èõÇ«kãî‘j¶ÑœˆâfVé¸LÓ[n¹)©E�=öhQåQmJþxg0Çò`)#Bˆ0Ž  ÓggvîºöæÛ”x3½ß´‚+’Ç[e3W×?xPÙ²ổŦŠ_Þ\ê¯u~B~KQË+G”íE½¶Æx†#nÑUÚꬮÐeòÊõfžüKBÈ#l€XDªR¿òÕ¯§ùx<–Ræiæ�oÁ{£UU”ª’›Ôa‚0òàœ3Úi­½÷QŒ)X‚Õ“Ø­Ë’c ZWéØE#Ö’ªpé€Ë"´†ë*´šKÅ•fƆEˆÆEÖÚשa 'Q‹C,PŽXDƒ€ „z0!¨@ !6kt›'‰œ'3€DˆVRi¹¶ÜXnÌL½8_¬¯õæøøÇ»÷^Ȳ™$ÆeQll˜Ð9fŒ+ò¼·Ž­äÔ:™»*ã^R[–ýn;ä´*ÖÏÎך¢?ösþèÙ#Ç÷í:ÐŽ U¡3S³Q˜P&LĘ$ˆiRטHBH\Ó{ByxL(gJ)ãXÖZç¬õÆ¥ÔzWYI 2F9«­Êˆ†œª2AlidΑåÈê"¥^uêq'‰™5¶È]YV£ÑâÉã+'NeëÝS�}áÌá#«§NŸxô‘µ3óëgç—N�8uäÈÊéÓ«óó&Ï�’Õh´¾´èªªŽŠþ èŠ�~÷ÌbºÚõy)ýµùÓÕ°YÚ;»;·»ÕÁEyŸ`ŠªrãìÂxuMŽG®¨PY©ñ¸;¿z˜j´fÛ“­Fsÿþý„Ñ¿ðHwÐ�j"FB[ƒ�Ïò±² `ŒÄõ�p&•Zï÷_ð’—m�O£”"„ÀYç‚óŠ^x« ®©|7ê¯\ë¢�lÌÿ—$ÏŠÑ» ¢lß6¿P}kÚQa{VÅÀgáDé7Ò`=²(iQv¦gßö¶·�àaƒ°aܳ15†±,ªõn¢-ç�ú¾ïþØÂcÇqiç?ñЧ>O5nFõVÜpÒÊBRÌjµ:¡"n´Eœ ³, ã(J Y䜲f³É Eãœ1Á©à”Ê{kµ3Q-ÊeÞj5(�ª*1qFaÄ­Sà�TÂÎ9ÍŽ#A x§­,‰UÆ­Ptâ(ÂH�Çy¯Û[^>óøa(óлáò²ÏóÑÚª�l‘»JÊqZ¥éÆâҸדÃqÖt——»gM–¢JÆÛvøô±ã+§FëëÃõõÅSgN}â̱ãÝÅål82•쮬vWV­TÞÚ|œŽC™K£ôx9mBÆ“@`„êõú8ÏfwÌÝù‚ç¯÷'Ož,ËÒƒ%„ôû�_«ÅQ8cT–e·ß~;€ èª*B±÷Ö:m¬ºà¯æ|\Âþ¼“ ô¬þ<¯®ˆ�ú‹&-œsþÉÑ$„ÁäB‚Ö¦)ÈùoÆù±�‹¢ä&Éc­=ÿÈ|Ñýy¸ÚÊ;ÿ¢snSYäü,È•cÒæÜÉ¥/ZïÏ›þžßvß‘ï-7VúgN�–V]š7“á|�%ÂkGÞx³) Rà0EQÈÊb®¢!£1—R«¼àž‘z»5»gׯx8Ê xX–•uPkµGeYX¯)QI»©ZŒ¥AøÈJ'hª¥'Xk©ó<ñ$�•EÄ0ÃBb±)ªŒQdea@²,ûÂèÀ¸ÈCLóœòV FʲtÆË\šÂT£ŠZF­´*lY"6#&hUUF*Д �$„{í8‹òÜ]µƒ [\.¯X 1­çgzöÌJ”W¶ÊR9ð1ÍZ�4Dت4©4^é�X­~Í 79„­µ�(aÀC,( "Þ#‚(x¾Òuax@6š0¦ÓÍŸ¯Š€ýßlWoµá+IžqÒâB›Þ‹Ô›�pé³ùy´Øb¤ñéX²ù)rÁ¬m:@ÏÖ:e›ÇösòÛÿ ¶¢&?Û&Óù�PJ7}91Âh“(ã=ÆØ#,DÈaÁÁo¸ù¦—¿â�~á I­> ›�öŽÙ¹2/œ±�Õ&UYx)‘RA"Dr‡Àq’VEwmýè#�þüƒó‡�ÈA¿�0v¥4RÙÊ �¼Ge¡Œ±yšÉ²b€ª,=qôHwe)$D—™UÒ•)‹ˆÒ‰z�c‚�k&µQ·‡´mFÑò™3ýÕ5l,si½¾¼ôÄã‡kQˆ�ùü§>uâØÑ¥ù…$Æý^•µ0°²jÕäm1 F‘5¦¨bΰq¶”‚а`¼Ìr°†2(‹±àÔZ+K5ì§‚DÄsd)®2%< '�öÕ`ì¬BH¥*e´õFiâ!Co#$6VWGƒÞ©GÏœ=õè‘GHHYMHYNÖjf8çµÖa–e¹9ý³©Ö\PLÀX¯M„ãV§½gß^¾�•´†‡�ÖZKY‹“‰zSf….¥*J¸×À˜˜qhó4`_T¥Gà±7È2‚Á‚AÁ˜"ÀÈ#ïASJ§$r¬Q² !'#k°³%;« -3ŠÅÞ; Îj­’(Hâ�P Èi- Aƒr¶¿Ñ£Å!!P™f7Ýxýäd§»±6 ¢(*Ë!ßét*)ãY‘ÇÙÍ7ßl­EBì¦ÜÐÕõ�,S¹ér'xºã–¶‰O‹†O/ˆ�Ãù,çÒdârÀÑÒ€ËL¢œîÙ¾8{¡Ì—2†ù”pä³±ÿÚRfœw›)£o­uÆ"Jc= b¬×ZÅ�úó_ü’ý×zâä)J‚•••õõõzR‹ÃÀM”£‘e6+|^ø¢c0Æ,¤�ÊÜk“82‰9gùÒŠîõp%]QÅXxc‹q¾º¸¶¾ÚÓʇ<4•DÖÕ„ÀZro§ê±ð†iÃ�ÆRAQB^V½AÑâRû²”£‘/KjŒ�«ÁÐæ™Í3áÑx}­·°Ø`ܦÙpyµŒ@Ê:‘Rù`€´QYQF¬SãÔiÅ‘çÚAQ©¨6ÈN±1Æ:pL��žlÕ‚ b!î #ŽQ'¨Å ò¥!¨ô¼T5L©w !Jñf/�SŠ´µe…�õ•¬G!CàtI¬1²X]ZXï.­u£€N6’V%˜àµåµf­™Äu­-Á, c,µg™÷! áZBêÍf{jŠÇ±ç<“Qı5^•ŠXÔ©µ¨E (sNçyH¦)@Π΃ PJ§ Yåeá•¶RRd �”BÖ`k9ö.¤$ä„P븇!å‚ìœ×ÚÊYíeU�GŒyÆ,F6“P0Tcït…V)ç4!`�öV£(ñÈÙf-䨝�= RªápáÄñ�ÐÕ¥³gΜ�FΙ];æìÝWÊÊx'‚(ÍËV«sðе˜qÄ9‡½‚ÿ‚ÊåèÂ[<,_…/UÊÚ‚ÄþBsøí½ª¶¶ UO.•Z¹ln±™+_ÞcñB—íV—.o1yéìΖ'…°´¥²¤»…‘÷OŠU8ÖZÊÜZH aôÕ¯}m­9Ñ��BˆÕRkÉ‚”š*/ƒj4–i–gc¥*`H"—æ™.*"MÍášö0©�..dàP�Š …§2«œ4N:/51ŽY[c´Åy .F¾†Phlì@(mÇ™Žp¥P.Óµ�"¤”nœ˜žmrᲕ•Ï a�°n´²&¬Ÿ©7q%Í8­z_–5B‰2!!®ª\UË4%Z5EàË’h-Òy Ö€·qY­°s\@1ñ@¢[©¬vVSj¤ 2€�óÆbgñ'F—²ÊXìŒLÓÈ:l½w‹�EÖpâF#ìí êÁûVŽÖ:¥šµúæÜÉx8ª×jÎX­5çœRêŒU•ôUÅÀs@^ì±µ^#4³s×¾kÕ&&4ƈ‹RÛ´,ûÝ^o}ƒRÎ# q©ª„2 Ä#†I„à¼3V«Ê[Þ;¥±³Ô£QìržbªRç2.¢< ¬1²òFo25œ± v–‚Ç‚Gsp¡ˆÓz 8_UP|–ŽÆ£%ˆSd�DV3ä�ªˆ÷±àÔèáòò=ó·ŸþØGÝU©J@./³¢R�F«ªÔp8D”>öDwcø5oøZ×BR)@¾‹Õ«ë:¨l3)?ê‡Æ/¡ËU¥.”Õºp‡ãMCŒð…•®-ÌE¶Ô‰¹¼¢ÌådµÎ§WruÏŠôµe*—tyFîÀ&ÈaŒ7%BŒFòÞ{°à�q€ #ÕʪbÍöë¾îM«Ý>bÜ2ÞÎrTÐ$‰%FU6ªò‘*ò²Ì«¢lÕ³Ó3Ó� W©b0ÂR©ô` #—æyoh -ˆˆYÈ÷FÝ¥á±ðàó‚È ŠÜåiƒ“Ø#ª3J8+¬o‰ -BR®l‹M*�j„Ö)‹®ZlôH)g“º¥(/C nœÙ¬@"Ê³Þ $`œpN=2U Þ F Úl�y¥” Ä)]¥Ó&�‰µL¼ÅÎx-µªXÀÃ;‡�¤vP¦ ”¶•7U+J©ÑàÀgŒE€Çã´(ŠMm#«�íNMÛ¶tý£Oôçç«2™ |nrvc¥+ ‡‰ÕŽñ(&%„XçµQE‡‰5È86ZõÎÔÔÞ½ÉäTcv.ê´ãV'iOVõÒl�¹Ñ•óÒ:†ØcT–ÊiG<`穃Za@Nj¯²œmm¥@[«uQ²ª´ÖPÈXW¤™QÊj�¼ßdok­�3œÓª*ªªÂàc8¥uVºªÒyie¥Ë"8ŠÏÁÎR@V«€RTÉr}cïÔä´ßµÞ4Ú-ål{br¢3Ù[fýqÚŒ¾ù[¾…!X_’s�VÖ]!éôêúòÎTàÉ© "â3ðù.76xa›dÓ‡jË€~ÑŸòªô¬¾|&"Û\Ú¥™Ö–­g¤#_¸ÃMÖÜ–(¸M–ó¬hfçSFï=€óÞ:gœ6Pi…€ã0å\DZ^o½þMo:zâD¡¤²¦Ñn°8,½ÑNó€qØUU‘çi‘¦Ùx´1¿Tô†e^‚ÇcF)ñR›¬àQë¹GÌᘅ Ü!=Îå0Í{==Ç”F€\šG¨V�s�³¶ÈÔhL­o‡‰ÉKb\HXiÕ±iÓNj¡“fPUn\ÐÊ0ã�™r¦:/" “2Ë9&Øùˆ ììÆÆ& –ié)Þôï1 kŒU¶¥!£Eñ Š4B°·2«ro4Ã#p=UVÖZk‹,†ùx¤¥’Z•R¦y‰ݴδUå=*GiG „x©Šn¯!"k­•ÚkÓi·A[ŽIEŒPä·¿ðK/êrô¶/¢Qÿ”°ñ9D9džàœœF" )cµñ„…ˆãýžk®yåë^窬TزDx†,²À1OшhÈ=8-¥Lså`<ާ4 �óM€Îƒ|œVY‘F£nÏ–¥-*lt€é¨Û¬¬§½¾Í lœ«”) H`„½ÃÎ�”ã�~ÖR„±õUšë¼Ü|lWEy®ƒM9±~cqÅ•2@Ää%6NŽ3]TešqÊöìÜå¬-³¼HDz(�s”Rƒ|¦eVz[í¼G!È�3Îik´ÊÓ¾®FNË<�Çcåì¨(sp%¥•àQgvrnO½=�Ô:”ã4OsiUeœO‹RZq± «dw0vÎ..g•\Y_ûU–ë¬ ¨Rãb²9�<®òJ`°€®Kµ9sŠ‚Á£l”9ã­A”…SC¨$4÷ :-E9A¬ÓºîÎ;&ìkíÙ½÷Ö›I³e‚(šèLïÝ£)YínHg8çœÞÂ8+”2²2yVd£ÔÐÚ*m­ƒÊX‡°ñ¸R*«ÊRJkk+£ xƒæÂSæõqŒâzá ‰c�bÌ…©²> 9o�¡à7Í 8FY”µ$‰ýÜ'>ñȃ÷휛ªOL¬ z,Ž ¢Ÿ¾÷ó?ü˜sôŸ×÷ð¨F£„0d¥1¦�¹Ú¨ÿKëz¶ñö‚ ½ûëºÍö•¥í¨/'F² N[ Vnñ  +”EÙæ¦\Š›åµ ·Íe>ãͽ´Ó³%maËã³¥�m&y›E0Œ0ò€qÊœ7eY€1#*„°Þ[ãµ÷Àø¾ƒn{ÎsJ­”5@ y�Ä; &Œ¢f§™$8kª2ï mQÉ¢¬ŒVÞ"F¹Œ1„P6z½A¯§*!Xã¥â˜0„9¡Å8]9»X¦)ÅyÎç½R|Å‚‘ª(«¼¸çU%;­¶Õ9‰`ÔTEÙˆ“ZQ„½±¶R2+�N¤i*¥ìt:yž+eʲD&g¦•³™,�óÒZã,fTké�wÚ ¡Ày-sJí ך™šn6›{÷Øwíµ·=ÿù7ÝyçÁ[nÙÍ 7ßvÇ5o8tÍõ7Ý|Ûu×ßrèæ[®¹é–©™Ù=öï;x`ß5o¾õ¶k]{àà¡íÝ·ÿ9wܹÿºC·ÜyûÌž�»wìÄÒÔc[õƨ?(²Üj“e#c¼™69çâZÒh5ƒ(�2äP(¢ñ8[\^MË*lÔi’Ф>ÖJ" IlO¦&;»vOîÚsð¦[ö]wÃÄî�;öïC�X ŒõQ\k·Ûõz!ˆ("Ʀ¼V«5êÍZ­n¼/¤4õf£Þl¦yQåEE9Œ*¥ò²ÌŠ<-ËAš®nlôò¢t~¬tiLªt®´Á˜ˆ@K©¥¤˜0B9Á o]„„cL6Μ6“íŽ*+äíé3§:ÓSPgjZûé{?{Ç]/üÎïÿ—” ï=xˆ0Mó0 �sÖYН6êÿ1f*ç“�‹ÆAžV­ÂcL ¥„"„΋lp/4)Ù²¦´9àrþ³—FÛKsšMÿ¨-[ß—KA0Æ‚ÉyÚñÓp ü9•÷›—v9xÛô1½¨µsá±.©Ù¦¡²å¯6ïáE¯\84³9Cs~¨Åz¯ÁmÎÐXï��0vÂaZ°Ž ,˜ìC< x ;"f]÷ü—ee'3;öÝT92 Êb$T)û]_ŒÛQP¦câÑúêZ™<ŠûyÙÏKEx¦}šKäI€DÞÙBÕ£Z™YZuÚ3aÒa³$Âód½;.r… ^kúfÝNµ‹¤öèâJÔžÚà†]sûöì<05¹cn×þ={öíÞ·ÿ¶;î¼þ¶ç^{ûí×?ÿ®æ�}�Cë{w¼ó¹Ó×_Ó¾v¼wÇÎçÜ´ÿ…Ï›¾õúæ5û’»§oº¦[3·ÞÔ6VäyÁ�ˆ½b}qõ–žóðN½ûOÿ꛿ó{^øªW Œ c�(PQ«7 a‚q†€xûdE÷ɇ§þ}uýß\è2ë²ïrTÁOëçìÊ/o®u¹rÖ6ư±ø©\éÊÒ«/zzö¢£lóø¿MÊu…=ÃË1†/Äž-“Â+Lûž±bf½óÞnqV;„=`°~rfö†›oY]ë*eÀXâ! ‚€Óv½¶¾¾à&¦§öïÙ-ólu~‘ë YŽÇÚ*‰,`ìð€‰Hh­{ýn:rç$›¼�¢ˆ1&¥¬ªŠ&†1朇a@)¦ Á¹2/ò�à!BŒÑ”gµ„¼3úüŠRJù¤ç ¡œqÎ�Rº¨Æ…Çå`Ì©ÅñÆFumÍ"Lê ªÅ#owÝtÝ®k¹€ Ò‚°{,€6ƒ¸$L»3ž©³‡�<ö™ÏÌy|°ºº~vyy~qcmC¦iÞïgëÝ�3 k'NŸ=ö„g»wïn%õµµ5‰œ‹¹KBqQ‹¥V¹Ì¥¬�÷ë‹‹ÍP˜lŒUÅ­Îú}�PHÈÆòrÖbëË4ÅÈ×k5­G( BdM¯×ÛX_·Ö:©×—W¢ ܽsÏxœ�Ò´Þl pDjat;ý·ß|s3Žò~áĉ�?¾pòôÉ£O<þè#OyüìÉ“k‹ËU–{­"Ì Hš¢?ê.-u–ªÁX8”Æ!a³�É=3»&êÍ=s;o¹áÆý{÷}Û·¿íMßðÍí©éçÜuW�Ôή¬:„kh6›Y–9ç(&༱*äBk cʼ÷Jɪª”ªŒQëëëŸÿüý�=úÇúg·ßõüþx �ðWâ¦õÔ¼üÕõež©œŸ@¼0ÿØ’ vi‰ìÊ¡ìžùör!qyk©•gà ٦´u%ú—#ÅmßËÙW.çÿ¸%€mƒ¯[Ü Œ?U$DÞ!èIrÂD*‹*óf{ò–ÛnwžÈq ÚêRÇ"pÚL·Ûý~?n&×]hçÜl"¸ ]–GŒfÙØ1DÂ#§­Œ#„ëtQäι λDÁck!ă%Ôs�)ÆP(ÅaÇ(‰p&(Ãà�·à rÎ;+eéÁ ,eØ$LŸÏ��1ÎÀÞ(M%ˆQé]¡�²az΂fcçu×´÷ï=x×󦯻5k6õvî¯v×OÎ/<ôØ©û>zï½'xàø½Ÿ]{ìñÑÂéµGO=úà‰/<|êð‘3GO>ñàýÇî»åðÑÕÃG–{üð'î}äŸÜxüØžÙÃþh­·aS‚töìé*uÊd}°–7&âÀô{ÝcÇú'N¬=~¤�pPIg &Dk§ËF=Y__sNÊGÃQo#ä¬]¯£²rj~ñØÉ£÷=tì�‡Ž|þÁŧ†ë«‹gï¾ûï>þ‰O�òry£W ¤:µ¶¶´Ñâ¨Õi§y>�¬µa2LÒÑXksÎFA©¢ÈT•YYz-W—–zàÁw¿÷�ê�–g¬=5¥”vWË\ÿ²¿¶ �—ëi_:?¸}�ÝfBå¢z×6½ÏêÑžÉYëÂpW`²r鱞ó.*mϲÛW.Î~.8 ZFxN»ás*÷›GTÆAì<–Ê¢ÖàöÜÞý®'„ãc²¬¼1#ÆH.sÍ€ÆBå”TÃá`i‰zC�õÈ!Jö±áñ'ÒÓgŽ}ú3Ç>wŸŒ"Ø,ø˜3g�Wùpz¢‘DbÔ]ﮬœ]8Ä´Ñn5:í¬’þÈG˼ºîÚ›úóg‡ K‹�{â¾ûÿìg¾p˜äY›‘ ΄¬bìk…`ÊÈ^/_^Ì/d«Ýb½§cÈJZI\”´RÂ:›Ž]–W½�¥éÊÚòO¬œ:Õ_^©Šò‘‡~à¡ïùÔ§Ïv»7Ýñ<Ö¬ã$®Œ>³xV„Áäôç\•„Á9 Þ#çœ1Ê^3l82�óSÍfoiYIéœ/¤"”[·ùM&Oÿò“§j_OÏX®®/sPt¡T×ùˆ¶½ŸÊåªX[ß [,—š\ÔŠØfoW8ÕqÑÇ1Âç{ò_\mqûèÒn*ÛØÒ|Þ*p¡n�=E@apàœ¦«CØ%<0@€Št8îìÜ{ýsž4Û kk˜3ïܨ?B‘—%iÅ×ÞqË wÞ–ª, øDœtGk«ãñX[IkÓ²J¥Ì”–Þ9‚”ÑyÊ1Â^ª²ª*ï½RFV)UŠ‘v^ZS2æñV—E>ʳ±×Š‚ÇÈ‚×ÞŒ,cteµÚ,­£�ÑÞ{pÆ*íœaœPN6«f*Ï�ÒÔ#Fˆ0’Ê’%I¦5¡<¡NËÉV»HÇkK‹½¥ù²¿XÙ¢0WÚÌ·¨«cŹt�#Trbæbˆ.¨®t:ÆJÕ�0@•% ÏÔk5 ù°×_<ûñ÷ÿù§ÿä/ÒSgU¸wÏ®úD»V�g¦&O=ñøc|n2d‰Óûµ¹€oœ|"¬ŠšÕ§~ðèCŸ;sìðü©#qLŽ=öÐãÝWöÖC0Ͽ햩v+ æ(U…¨ÅÃ<ݽkÏKî|~¹¼rô³÷÷ŽïŸ:Tj.‰kÈ58aZ2'‰“^æÄTªÀéÀHœ§(ûl$¬ª脼°NÄbäë×)mrc_çd" cäq™£ä]ˆ+ÏXÊß2úoÿæ+,X]IéÊwunl¶c^=«Ê–M£Ë¥)_Äù_¬…sÅ¥¶K€ÀcÎéx\ÊfÒzGᑱÚí½Ï}Ncnæøü<¡”eÆÑjÚ!Í5÷Þ|-©±îÆJ°fÅQ „ðˆe4L<–0ÄC ­¡!CœÓÞc¥T¥uÚ{ë�¶N9§ÁUÞV´àDΖe!Ë ީ¢Ð²Ð²rVk#µ–È[�äõ¹ïþØÒ£�ψ¸‰ØÆ™…áòŠ+ò|¼QCk‹^w)¤†‚tå(@ºÅhºröì‡Ç«‹¬,Ž~þsjm-RæñÏÞ»ròÄp}5ÄXZ•9ôеל=súOÞýî|e)RŠ«J8‰ª¼õ(hÆ�˜‹‰ÅÈxSzSRp!Å1£‚zì•Ó…7%'ŽaëtQ¤ýDàd¥SEÌ¡“ˆ‡È©ÁÙÓ'¾ð`º±ö’ßàÞõ_õ¾‡îßwhkçÌF>εI¤œ/dE)µÖ"çÀä &À)bØR§ˆ–3�¤ôwNv~íW~¹* ÆXë/ør^ôÃ9D¹è‡«ëËTž$S]š7ÀÓw/ y—#ì^Zwº\4|JÄ÷É8/~¼% mSƒÚ&æºs‡q)²\ªE[ùŒmÓ#Ù¢'Û M^nÄgËàåàír7çÉ»ç<8ð=Y%CŒòa@!KÁ‹°ˆ"eüPU…7½ðùûo¼îä™3‚²0ˆB˜¢~6J‘*…7!�Ú³ Òõ«¢,ój0FYV©TÚQ¥ ‡hFðÒH –q‚�WªÔZJUY+c+ç5¡À•Yªdn�2JjYɲ°JzgœÕZVÈ;°ÆY½9ì�Î=à:ðÞmÚ­e¼ Æ*�=¦Hz[!g‰;­7^מ™Â€™‚¥‡Ž¬ÞÿØ™{Xzø±š55Bj'È/3™U 8Ã!Š™œ*�{„’È'‘ñò¨›‚̈65R†~ UEoÚe5#63ÙjPê7†üÅÝûí?Þxôxzꬌ'šµR$!´Áûj¸Ø_ÈÍØØ¬õ³õ•ÄÙÝIâÖ»5¥[Þ³,·ëëó�<ºqêôâ±£AÄz ~nj摸çc ž™hbW§82�@qÂ-±…/‡&M] ‚P[‡,ÄÒœA 0£^«¢’c¥3Ê\½èb(å8Œ Κ\W#au`åÞÉVäuy>À¶ÝŒ‡£�{>þÑú|Ъï»é:'¨#Tj…Blª@�ñN!kˆÓÁ »:ÜXûO¿ðó˜aÀž ÈÁÕÇÿ§@åRU® é³—ª:^ôȹ§l¸D}ëÒüæÂ=Ÿ˜í'9žm—Þ=¹ÎŸü•§DÛ$›ûy:?ÁV~-–õ¶Á• •.'[¹5¬¢s›ƒË*o"„¬.Bé,Â$W¢$HZëùØQrèÆ›^ô⯬¬t»Ý8ŽCäEªÀ…�æê°·:ìj°½Q¯ÛícaR™a–ÒTY$jµF³�yš��7BpL‘K(’Ræyj­pÖ(ï-ca È!o AŒ¨Ê\V€cŒ!äÏ7ü�QUUX«ŸüXo¬–eQÆhÎ9ç¬(òB—Ò)ffÏν×쯼M«âÔ©SŸüðG»'Ogg×êín6NpUäUUÁK§=c8à“²,«RY‡ æРRÝ2Ø '!N‚x% §³nÙÏ|5ÊAMä2ëºõZ\Çl_ÔÎ��Yxè°ïg3µ:ñ.©Ç¹©Ž/Ÿ¹åEw4vtåÐÇŠ(½3½~ � !+"ëh¥Û<ÈÖ»£Õõµ3óÆ“­ö©O=üxÀ™±*÷­.¹ÀÚT•ªÇ$0ØG4³yi¥ÆV!e±ÚªBÚ”Î+„=¡À&¬sºž„çÄ_@{PÈÛ€xá�ÍF5FˆÓ'Ÿ8vûm·Þu××\s€svûË^r׋^<.òL–¹¬´ÖÆYŠ Fž �‘ÇÞƒ³ÞŠQð³ógžwÇsEgÁ…,4¿�ݯ¿â¯®/P¹È°ä|ìÛd‚�ø äü{¬;÷:B0ÞÜ!›?\hrÎÉ!ÀøüÈÅ¥¸pÏçeí/śͰxéÌöj(îssTåB?• A „Î7!À9äýæ+œÛ|eóW°yVà7OiÓž|±Î^¸óMBÝæÇ)Æãó»=¿!ïŸrIuÎ;»yôÍ#žÏùÿÜÜÛSŸu;Oþ›ÇùôÉã«FφÇWŽ,ž=º°øðâJFxŽp·Ì*˰2u–…>~Œ\ê`½Âë(8ëÉÑaz&•y-rÍ„õó" ×�/85„�°J©éù\&¸çËRc i@R„‡ëÚ®H�ÑpìH¯r½Âæ>÷¶L³QÆ·pÍ~i?ÿé/tŸX†ÜÚRbì›31oaÏ*&”΋má�d8Å5k}Ue<С�Ø;†|@­@( ˜Òaeh½Á›��"7\ð¸!⩳ ÃGF©�"ÞH6F]Mª §õÙ€‘Üú±r©­ œª&ï=3¸öo|ù[þÅç7ª Sëm•%ЏÈVÈ�Z26¦tÒê,"R€®Ô†Y[ÉN®ŽÖ+™é’QÄ8æAe;£ËªªŒ‚÷•.ˆÛ¥tÖ`Ð8&–ÎeåD�`mC�¹±º*5¶%µ™—¼¤Õ8®EFz#}6p(�«*lìDÀË…ùlq¾ÕŒÏ¤ë'mê;õÓé°¯´u$¤5+ñq‘+‚¡+Çf¸$Vc ³ö˜/_ù¶·B«F)sÊE+Ñ·gÖ5¹D9ÿÂaÃó`vQ]î|ư¥\ã6֓Ϩ‹|Ñ%_NÎ.‘ؾœµ}ösåV+ÏhÙrÑ:7ÙºÕƒ çŒÑˆq%ÿä­ßæ0yð�‡<"s»÷�0˜_ë6¦§6ŠüÀ]wþûßüo¯zë·Þõ oü®ŸÿÙïûÕ_~þ·|óΗ¿ôßù#ªÙúÌÉÓ§ÆÙ‘*¨¥@3�\%ÉDX›0A2ÀhÑ399ª%O”éή~îèñO?~ää ÷ÀÂÉ#ýå{O™—ƒ%SŽ– ²0ìåÄ™€æÄœê.žé-‘ºˆ'랃öª”…RUñž&=…ikzÿmÏ!I¸¼>ꉇ‰ 3ÙÒží¾œ-7z®’œeê3sÝqŽ� žÅ4¦»CäI£Ñò,�Ax¦ªÚXŸWæÔplk�p¶1¶eªòJ—ù""‡G«_õ½ßú–ï~ǑųGæO ²ÁäLcb2&TUj`mžËA¯¿æ�ª‰�ZÜ©O|èo?Bf&n|ùKÖM%f'+�³A™�<�M¥D!Œ˜Òy©³F;Œ›ü‘3‡³»¦š‰-›N1™6C®UƘÐRÕâzH9â0Ù¨Š•*;Ûíî9t(h6-#Ýlœj4›#UFÍN¦5A\odYA)Ÿ™™+ŠÊI_d%"1ž)Õ«ò‘·cq+¥TQ41\\Ÿ^hiï—Vu‘ì, H²"fl EµQÈ*p*Í©PL|òè‘øÚ¿þ§`�‰¢�L$A;í¼±V_•cù)S¹’àu)¨l‡]Ï4Ìxiݲ ¶%àrNŽ—÷gl`lÓ¡ÙrŸ—žÀ¢æ•´åa+Ý�-ß|¡³Ù…¹Ú¥]œ§°j+”EYk eT„@¨´Âðk¿é›ozîs�ÏÏ=yzfϾ7ßLë�±2¿ù›¿îãÚWþóoå?û6½c6ß5ó‚ïzÛ×¼óGÌu×ÍýðϾ÷�§Ÿû‚³™}èð™räÆ‹Ùøäp°˜¯.¦Ÿ}äÄ’¥¯ÿÁøê÷¯¿þ?ýÌ·ýúyã�üÐK¾ó;®óá¶ë¾ÿwþû¿ùƒÿñ¯þìw³v=š�‹‰vx`?ß¹#ÅB>B�Æ+¿ùæn¾ötº±˜ H]YHÁÌÜk÷^׺á¹/~ó[®}ñËF–{Ëqä‘™IŒ•«‹ÇÚûê9/ÎôGZyÓjbj.‰ãMN$½qµ<(>÷ØÑ½ÑÇOœ^ ã/}y>5Õ‹jð‘�Ý·xâTÖ{táôý'ŽlüÞ‡?tû?}Óž×}eó/ú‰?|÷Ôí7~ô‘ÏÞóÙO,-�Bº ½g1�'êšû�ao°¾ár5Ýžüð‡?Iã›ßö]þÌçïþÔ½cëχ'»Ý£«K‡—?óØ£gÖ×%ŠDЩ^8þÄúiÙ©ËŽƒ æp•z�aäúyŽ„(•v”u³±Ü×’Î5o½ëù–3‰@a,±O&Ú¹UޱÂéMI� FÔTªÊò2/â0‰Â¡E >5E걬ï%›¬Ä Zæ n0|àýqö3ŸE91h„tF\Iœê$Aà'Ü�à¾Ógæ^ø‚oþ©Ÿ4­I—L„ÍéJ™"¯¬vˆpJÙÕPû�&Sùb@åYyÂq³îÛw§· ûâNr˳½œÔã&Uÿ ïÌùqŸmxeðtm‚+9ÜyÏ•Ë'¥¼¨Jmm!•ˆkÒ˜¬¬Üòœ×~ý›KD?õࣃB×;³;÷œšÞõÿãÝe®q£ƒÛ“xrV7&ó¤£Ú3~zvïûÊ·~Ç÷ü¯¾à�oþì‰åžådbnÝó;¿æëk×ܘ×;ñõ7�3³3kMN>ç¹7}Íë¿â;þù[~ô�ÅÄä¨9Q¶¦¾éÿû©û�÷¼æ»¾ÿÖ×¼qçí/Òõɼþëßôöwì¸åöWË·ÞøÒ—÷(-âäÅßôæ—|Ó7wn½m×ó_ø¼7}Ã-¯CtíM£¸y¸Û+XØÍR 'Ä6éº[oºæ®çÜ6Q«a€éf­nXYð€•ýÝCÞö†×¿áþåÜ _vè+_óÝ?õs?üKïzóþÐ÷þôÏþäïý�ùo9ôßò­ÿâç~á?¼çoyí×ü›_ùÕ»¾îËf'm4ÜŽÙ·ýûû¿õ?l§uxuãLZÝbác_xä³'Ž Üñ•/¿ë¥/²N;c´–ëi:ô»þ»k_ùÕ0·÷†—¾ê-ßû¯ÞôÏÞqë«_÷ÕoýŽ5ÌÿðžOýý‘ãøÔ½Ëƾò-ßò­ß÷ŽW½å›oyþ÷=úàʨK#& gaÐéT?6Üx|ÔK®ÙwÃK_|ðöçÞðÜ;®¿ñ¦µÞ`qu�DZˆâR+G E¦ªZ«IBáœiÄQˆ©­Tð¬*•3Êh�\¥Ê4M{ë}ÀãðÔÂð%–Ýj"™sž¥…µ ¢(ÙÑ¨ï Øœ³-Ò EØ…€IDATÙ[ÛuC²óúç|Õ¾íßyëW½A…¨¹Ó7gžÿº7}Ç¿û÷où7?rë×½yúÎÌ>ÿ%û¾öMͯ¯Ýr“ïL ‰™·þà�|û¿þÑ2žøËÏ?úÉ3‹÷žž¯¯'�…Ç��yôÑñêêp}µ®7Q*‹ãˬ,|ëÏþØž7¼&zÁí¯ûáw¾ð[¿}ö9wš¨¶1Îx§S|è…wý‹ÿùÝÏ{‰Ø=ì=t׿éE¯ùz´��ÊÌâ°=sÃm?öïyç¼ï­¿ü_ÿÕûþüû~þWn~õ×é�ÿö¾ûWdYŸ›²ÔÎÎMÔf§‡²ð{æþéOþä×ý»÷šïzÇÜ ¿zïm/þºïý×_ù=?ð¿ûÞ_ü“?ÿù÷}àþð¿ôÞ÷ï}ÞK,„E/ã›oúНxt}ýø`øèÉÅ£'ÏÞúøGtö%wì{õËF�Ú_Þÿ¹�¼Š£æFw˜¥…�óf�wWVd7Æý\eˆc�½4²²Rc¨BR0� äÚÆX,î±O-÷l~~©?H=áY©z½4Ϫ¥n÷øâÙOøÌécݵ£ÝåGWî9üð|·diåt^<žeoøþ¸ñU¯Õq› EIj¢Î-ÓS„93Ö\ Çÿh@å ûø‹è…|ép²MÏãr9Ó6â]—›+|V¨{¹òÑSͨ+€ÒËMÈ?cWé©÷Úæü/´7~Æ3ß&Ýq0"¼Öš`^)­�ítf�ÃÒá (NZ_ñº7¾èU¯ûë�}ò?þ—_ûµßz÷sn{Þk_ýºl¥!J¤‚Re©V<X†p1=+™h^wƒŸž ²�&:7E/�Q‘ÈŽ œÔjS3$JXX…²nŽh]�¦1àÐÓDáO µ6ëÌ�ÖhÎðÉ9“Ô%01Iæv•˜�Mn�–ÂÎd8¹Úsoù™ÿü¼7} \û܃¯üÚ‡Vý‰ÏTÚîÞ½—‡! Åòh|ßñ“,-S3ÿôÇ|ú/´;wŒ;M˜è¸VÃŒN´;“€F‰f�g-ÞÙí¹L#QŸðŽb‰êŽSõ¸UH?2œÎî—��dÇ!ÕÞÕ¹áyo|ûþÊ{Þ7qíÍ¿ÿÑ�üíÃ÷=¾´ðƯÿúPDµZCJÃpè úåŸøÙßýÍß••²¦'wÜyGxðPçšë5«yR Il*_)xÇ�ýÔÏÿÞ{¾ÿç~î®×¾ö…_ýš—}Ý×þÌoýúë¿û;^ü–oøÚw¼�ÎLž_\Xë}ôãŸHË*j4yšê*·*³JR‡kÂÅÜÄÁlê=4ê2‰ÖÁö"z¢Í›²G}&ˆâ4l5-aÌÏ×|Ñ›¿¾ßˆüþÝ ¥S«a´ïy/ü§ïø7oÿÑÿþŸþùï|ç�ÿð~×ÿÒ»Þð¶·ßú†¯½îµ¯Åw|×ýú¯ßö†¯ÍDÄ¢fQŠhÖš,cÈñ€„µÈ�%ôªLËÿK=•geÙ¾9ñ¥ Ê–�’K�r‘2ñ3Ö|¶,Žm“als�R�ŸQúþÙ¶p¶l]ŠI�íùižKÏírx|Q}Ï!í¬s xd½õ˜0,–×W=`ÊŒOoNÞñŠWþ§ßüíozû÷ì¾íVhÅ7¾äA#²Èð$�Ø—wZKL€p–4Ú"naKo˜‘$T¬,,ûü#0VMa‡ ˆÂÊz…À`ŒõV%�ÈÖVOž8 yÖµ˜\ÉÂbÏ“Ä"d;ÀP¯'ípj AœjõFƒ2–•…QEÄ«ßþŽ·üÛŸzí;þí÷ÿ§_õ»vüøÉO;r´ß»ûÁV‚æíßøÖù_÷Ûæ—j7<¯Š&|P ‚¦tÚSOc&³>ÔXðŽGÑ´'Ìj_ö†IsÒ Ò1dC]ÆÈ0Jêí)mi09‡y� 'êƒ�¬yów|ÏÏü韾òŸ};žš¾íå_ £”V’”êü'ò_~õW~ø‡nÙ=}ýÞÉ{ïùçNºÂF¨ÂšÆœc"¦Æ×ƒZ@e�ãAWûžsÓžÛ®ÛûmáÓÅÁDç;~ð¾ïÇÞYß½s5¬Œ‡>ñøÒ¸oÖ÷ªçŠ#kó�9}r¸1¤( DQ‹û?¸ºrωã7V#¾HýGŽ?~ïâ™ûWOæùÃË+ìºýoø·ßû·¼ù»í?ÿ³_þ…wþÑ{ßòsÿáŸüÌOãÏþǹ¯ùÚú ^6ýòWu^üè†[“;_xÛ[Þzçwï+Þñý×¾êuɵ·=õ¶Ò€RœÔbÊ‘qÊWšR‰¶¡_]_Îý•gf]Éðü3èmš¯$¤^4ƒyÞKxvÓyYûgÄ•m|·ŒKµî/dU}qŒ€+¼çW˜#nIjxÊ·æé=˜óÜœòÍÊ ‚1³S;¡FjB8`žI탰$äeo|ÃÛÿí¿~ñ^=V)©(@F§4À4$Òœ"ÎÆ`¬Š Š!¶™xJ‹R~êž�/©Ó€FÄj0$ XLåÄ�³Eȉ8tJÉ<«'h Jú,gIõ„4¾Õ í™gªÝþ¾Ÿû?ù[¿ØîÚù³¿ñ[oûÙ_¾ñµßPMìí`f¯c50UVO¼lpã|LçaÛg0êîþ›¿þü'>ùÐßüí‰\=ùÄéÇ:òè}ë�;óà£Gxø‰ÃÇVW×]%³2×Xiƒ[õÎÉgOÌ/�‡ã¼æõ¿ô¿=• Ë Gyðóúë©€ÍÄì«^ôÜ�»›S»j”÷Üý�•¥ãÆæ”Y§ªjÔÏ—–‡«ËG¼ÿÔá#gOžžŸŸ_Y_;¾xâÄÚ™O?p߇ïþðÙÅå#GŽ<úÈc£¢°¿æŽç~Û÷|÷ë¾ñM?ðÎ÷�?ðŽ—}Í«ïøŠ|Îͯ~ó×ýðÏüt43ýàÉ�ÌŸùìÑÇ?sìhãÀþó ¿ð‹ü‡?ú®ÿòãÿí]¿õüµ?ûÓ‰®ÿÔñ£Ÿ;}ò{~ä‡q»9Â(ÚµkDI%ÉŽÝÓ‡®ïC¸œÒœsQ‡Õg}Ðù·�¿W›ë"°‹‡„üÅ+å„�‹Ø_›ÈzQ;g• !æ‚Ñç ²[D�)¢È9â,G6€$jx:Q­ ( â¦t¤B¼B”·Û’`Ͱã¨4e¦3KÆ®ªR‚8í­âÈTëË'Q¿_'ž ÷ÑOèþ‡?ý�þà¼Ö"÷|èOþæ=¿ñÁßû­OýÕÿüÝ¿÷ïýý»ßÿ¾—<çæ3?øÁßýíîƒáþˆ SÈzï�¢–DÌ„÷… xL Õ![CcV(‹ÖÇFœkÈRˆ8Ì9Èw½ìÍ?ú«¯ýáŸÏ{¡ž�ÑÓÁôÞzk+–P¶V¦®¯™öÔÛ³•r \ú{¿üŸ7N>Þ_<²±zx½ûøñS=ñØá£_xäð£‡øäч�>ø‰ïùˇïùËÓ|òñO~týþO,ݯ\YZ<þÄÊüÙ“ÇŸ8}êÈüÂQ»ÚSÝ�™fÜlѽ;;v×jB5PÕ®£‰@©…#Ü{âc÷|òøÄ_à£wÿñg>u÷òêýtÞ㔇µkñÜ´˜›Ú±c.¼{âlºÐµƒb}iåðñÃg‹«Ièî¢7ïSsµcYÏ´§\kÿ�/ùf4{ë·ÿð/ýÜ~øÇß{÷÷þÒïÿâ?ý½¿øî}¯øÕ¼Fì¹ ÏÝé¦nÓíëßþSïúOÿó¯þà“Ÿk\w«kÌÕÛ»©­Õ C#$ ïÃv­=7±9Š=C^x+Ô�OÜ¡ÐsˆG1A@Kì2âT]¨€„â0Âà1¾:Rÿ�(;y¦"~¶­ˆKŸý·á×n#Ó²¥ðûy3®‹ö°en±%N<£eË&øÙ ÖEz—Û_/<]?øÒ±•Ë©_„^O¥O÷éú¢[VWêÑ‚À#¼õ¬>†§}Ø#L<€C@€PG©§ÔRæsLX8¡Œe<¬÷ކôî¿üàOþØ�þôO¼óý~`¾9Ñš˜™¨dþWüÀ‘G6Uµ´¸�ç£ûwÖý¹ÏþÔßô>p%Øòþ{?ý'¿ûîßú…_úÃßx×~ÿ¿æoþøÌ¿ñø}ÝÃ�ó«,§5>aKdJRöø'?U.�í=úgð»I�ìÚ==·czjfÒxDB„¬Õj$� ©GIM4Úq’Ñxcum~½{veåìÊêÙV»vðÀž$¦QˆÃ�´š‘#6i' [ÒˆKƆA8â"j¶“f‡‡aVTY^PJã$©ÕjLÐ0A$ˆ X $ kí&£Ù�;öíÛ7==‡Éìôœ–Ú´÷à�þpدÊ]×jÎÍÖ:­¼Ìaºá'j²ÙN<÷²çÃD£¤â„2˜!XpÇA§ÓØ1íÜáE€',¤”cØz¤QÎkã�òÖ ëÀvÀœ£œuVkgŒ×¬çQ®å­1Tk+Ÿþ‹?ûëßþ�Ï|èýj¼vðÀÆ "hw¦sD a˜PK™CXcbˆ0nƒâ„b�¢„Ó9§ƒ¾,K«4v–G‚‡�ãD Í&jO˜ÖDYo¢0¢q"jmÌÂDׂ H’¤Þ£$` #G¨Å‘§œˆ€GQ½Ù‚È{O1Ö•nw&ÃN'S†5> QA$ŽÎŸ<³¾„š±m„º�e¦b´š<Š1¢Îzï‘'Ô2AÄÛb Ì nñ;ãAP¤DÖ «‘•ÈWØ—Ô+êu€¬AÖ9£�7Î9{ξÏ@ (óŒZN Æ]nÂúêú²NPàé”â-õWÞ¹ÜPÞå>u…&%öT. ÖWB¸Ú¦ýpiпˆ¾¼eoæÒ¾Èù“Ùf~s{YÉ-ó³K‘æÊçê/ºEÛ]€+øbg‹s¸âÎ[{�{}S;XO ç‰öØxb=uÀ<âhÀ#Á8²®·ºúê§VçO_³cgm¢æ˜ƒ‰N¤¨)ÊÑÌT«œ¡Z=ˆN˜g‚Æõ3Ê‚@z;® í�Qºg�0ÙÝš¦izš…Ai…4×LÌ\39½3‰[Øï£!-Áo=tÍò‰'þêþÑÇþâýA®ß¿{÷tçš�“×ï�½vÏôî™z³Ž›M2ÙSm1Ó™$84;uýîÙvH‹�ÕÓ�?rìÑÏ=üÙ�>üù¿ß=�›ª?5]«ŠÜ(MIP®,‘SDàPàÀ)É1b” J“8ª…¡`lÅ"61;é¼·Þ7êí8h©ÉS (¨”ç¢QU@E,¶ 0K âÊb„YÖ‚°F³ÖSÆê�HÄco¼•Þ*ä&>àÀyÜh"›UeäPžÍzk¢Ù®÷y[ài¥¥qÍN;Jâù“'�u#UEÎx_¬¤µ¥öÊ�ÁÎ�¤�< D…'(ó%À €: aÈ"ïˆâ=O1œÿsB!D�â[ cK¼wµIÿ�¥}²Mà½]ð6Ušíï—›#¹4_¹(¡¹ÈÚýB^“µör¹Â6gòŒ‚¾[N¢\ä9ÿŒ°úÅ Õ<#æ]Ú¬‚gb‹=Û_]¸· µ×¶HZ/þBxÀ��¼E`02 c�‘Bà´ȃQU§Ñv×Ûa" �æd s¶¸ºÂ^T%#HæYYf�ZÌ!„åEe,žžÞ'%±¢´fÒ < "ÑDšM×§g3d\èõ^¤l¹´–/,ëÕ�r©ä:_XÖÕëWý©J(ò:¥Ø¨qU¬o¬ïòÞš-F³³ :ÖDõV­Vky¨Ñê´âö"]8ýð±ÃŸY]'èaUfŒ„�³S³½TÿPrlү˟f6í eµ"÷S‡.®§ðWÉÕN,—c©[ÛyQ!ˆ”D)¦Uœ(Ž�ƒJSVË e´é�ºKËÿü{¿·Ý_xø‘'â¡o z´·d 6çvq¢lQÅú�k©XŒÖ×™RsmoíÊ¥žB‹ÌfqØw蜋q‚H”¨‰"[jn¾EPÂ(g¦“±å:Ýå…A0ž#™s-†B‚©’Åq<t{md1DHËé…×2D4PŒ#ÂENÇÃÍÑææÖÚ`°:§‚JgÁYK7sWØí„y#˜‡Á€Ñ4š¬GãµµKgGk—m%“ñdtíÚÕóç×VQ* ááhâ¯O’I´zþ’ §æÓá Xlˆƒ@¼¹veskýÊ•+/]Y[ß­¯�Ö7·V×Âá8£8ˆ²�¡ˆ*®Âq0Nâ0Á SDç®í…a(„!Ç¡”J¥V†›Ã PŒ¥Í:p>‘ÜÇ‚‡±Åå¶�÷æ.>q«mÀ_€eBQJ‘ PBI RJ!%œÀŠD„ÂYn» F3‰jP‚ƒJp¤„ÜGàLX‚’(åˆ ,×U[¶°Ûö5ÏtP2)”Lõ$Â(§2Re/µ#=’é‘d¯\2¤(R’$ÉÞ¯& RJ.x;–‚! RÙÿ³²WšÆB¤J „Æ�ÿJJž½‰�"e¿BH•²®|ÊdW‹eG@¬*Yt¹ÂÊö®$…`%‘’HŠòŸÀö@Oš-ÆPÕ•)’7çT`ï@L±¿•{”Œãkg(I¤²Ìï|˜`B0ØRDf Q „À a¹óâ„ L%¦’Z˜9Œ¹6v\ä@**�¶Õ—cËýÁù¡ÇÏŸYmÐŽãKN»íض†B2¯+I@>vÃcO>ó˜ <L@‘H¹âŒ`†°˜Æ$�j˜Ú!ž§íC�%ÛjÝ|Ç]V·suc5þò¡�'OÜXÚ1Š}ÎZ=h»±CB*!ø`ØEbŸªÀñD§‰Ñ:£Q‹p.—ÉÚVpe=~âr²²yá™§£ÁêÕ+2I7‡ƒ«q ñýhåÂ5c²ye#™$I(.­]! Ò)"ÑêÕgV®<5™\›FÖ±æ �’ˆ0.%,¨”’[ºÄ–Óé\Û±THe°1^_Ûººº~i4^¿zåÜ™§Nñ$^[[[ßÚ\ÛÜØŒ.]Y &S,ÂR!%!u숋4M‰Ri<�ãICÆ$v('h„R2ɉkõ$(…¹ÀÁãÏ|âön*±,ËÁV+¸¥„ƒ)°°…�`„J©eQË¢ŒL P”±¦c‚�` ˆdaäzÈja»�=�:6¶Â”E”²;Èq�k))¦R©ÊßäÄHu(q@)@ª ‘*Î*;Ne¯Í5ýž°z'¶:k_Œ#ûBÌìg”\T1ÉKXU�˜üô¡0Ö�É8ÿL.;¶÷‹j!ËyþTÔ»ŽëmNƒªX”ȽN‰ô%#Ó, ¨–öfÛ¶”’RÊS !×9qË-¯xÕ«Ÿ<óTDŒ1„�HR°'å\"MÆi’¤Attù°yùŠ ÂÉ¥Ëáµõds´uñ2O‚ÍádckýòµÁÖˆÚîõ�n×êv:K‹¡’“4Q¶muû´ÝFžK=Ïj·Ý~ñèQê¹�¹¹ùåCýÅ%·Û�…œF±Å„Z˜Q*JÁSÄã9ϱ•Leø£ÉÖµd¸îˆ8nÃ-žDƒõ�Ô‡+kãõu[æœ'AN†ë› a,J”%`ýì¥ñ•k,âxØQÚ#lÁõÀ�Çkk&&<‰•cŒ¾?qË³ÈøÚµ`s“O'*Žey”Zõ=—adŠ”X^\ìwç<ÇÁ' ·m—RkêRJÂì0ÌD0·ƒ� XÌnyRx21¦­No8õ#.V€•Dk9¸ä³é¡lŸáE°j=ŠvĤú«’YiÒç1˜ææÝi3ƒrÑ”Wå,›h´T�¼4®_Ê¢ †Ã¿T ¬Öµ§5jÄÍ»5u‹¯+j!ƒo6@'Jˆ’BišrÎ ¥I“Në[¾ë»®­mœ>ýTsÇq”Ržç FÃå#‡¡Ãñ¤Ûé/ÌÍ�76’Ñx¼º"'c: äú–Ü ¡/1šˆqlln¬®_¾´úÌÙ ®®rjÝxç] Çotúó É,eÙØët—Žx‹‹Øm+Û›?|´»¸l·»N«{ø† ‡ŽÎ-vZ=·Ó€$dalA )Ä#æaÛ*9Y賓£¸ÅÓd:­®+?`qÚâŠE‰ B‡’vËe”&QàÒ"¤´%q['0œªá”‘'Åq<™Îw;½–×òœVdz:hnay¡Õuç;í)i‹‘ÅnçØ¡¥;n:±¼pè˜åu¶RŽ)sZ­cnËë;n»×�ouæÛížåxóˇÚó}«Ób=›v˜°TŒRBÁÆ©�†8œ´°ô(¡ „¥cßhÙë’8ua” <Ž#Û¶dœøÃ!Są*Á¦´íy‡>vüø¡#7Ì--.>Ô_\˜¿áp÷ÐbïðÒ¡�õ—æ½V«Ýë8-wnq®Ómuû�V§%%B()•RžãØ–e1f1ƨ�€Ä‰”€-Ç'RQǦŽ-1áRJPð4šN£Iˆ%jYm%Éæhº>žÞxû]Bd ®¬�ŽwÜ¥Bòº¡YfÁˆƒí3g«£83ÀU½tYxåÚòYÓ%ûÿuß…Ïž9¿x>²f›I%Ùü°µ¤–ZhrI�1ûBŒ5s<ÚéÅçV1¥Î5YŸ:v¨ê`‚Êü"À˜"L!b‰¾â-oGÑú`8™L!BÌèÈŸlMÇ’ 'N8ŽÃ“tcmÍ¡D$�D‚1JÈ$v8”Kc–J‹«¶<�&+ëçŸ8¦þæX%À<˜„á8ŒÆ…ŒUÇéŠH®_^;ûÄÓWÏ] Aœ‰•jõ€ÙÔk-ßtãÒÉã7Ür³7?oµÚ@"l;^ÛmË$µ†˜»˜Ù@TÌẺBi@ùÓ`Â<Çi·ˆÅ¡<•<�±’H ÅSÄ%Uh}}3HÒÈÍw?�c Ø’c´3ß¾‹Ñ8pÛ³µ-…1(Ü„¾·\‚•R)%ŠÙ†T3M¶¶ £-¦Í$6ØWÁÊÅwŠö]éWË>Z¤Y‘M¹H¨\AZC–Ì‚w>…KM�"d±ë^—¬4É›¤’MPsáНt{$ G )„®À#Ëny‡Ž<ÿ%/þðÇÚ®m¬·º�0ŠÜvKIž„ÑÆÚº…Èxkà�Æ6Á< ÇãeˆÃ8HŽ‘„8SßMÓžÂlL.®†+kÓ+k[—W’�‰�‚•ª`}4¼º\„kë§Ï�/mÚ !�òW·¶.­m\X­n®nMÖþÚ(Úò‡×†ãQ°5 ¬nñðáÎÂRk~IZvŒ±íu¹ß÷©B®í¡†ãI’ A˜$¸Õï3¯Õêö¨çõ—¥„ âØ[^ò–—h¡wôx÷È Êmkaæ�ƒD€ `aÚ²YW &8EØåÊ’Ä�…‚¤`¥‚*I“x�"š"I[`;‘n¢h˜ÒXÌÙž«¢˜Iî`ì0Úr]×umÛNR5™L¦Ó)’³˜M�L:ÞŽ.­¬ÞýÀ´Ó¥ÌƘæù©R»éÉŽ!8ضý¥&;ì;¸<ÙªnÞÉØV~•#PK–×ÀÖnnÌ\_7e&G}µ–eîåT£uíNJýZ½ÝêíþßÌ´;hM¨9¯£Øm8;=/g�bföc,MSЉÍ,.¸ÍÜV»{e}U€úÊ·¾�ºöSO?=�„à˜Q?æ[mÊåïýÖo?þð'!á‹Ý¾J8JF‘Œ,Å—˜Jw\†%WQìpÑUdS˜ø(Œ&—¯�¯®É¡¯FÁèʵᅫãKk[ç.£q®n%ëc_òz-iW‡^L¬‰š\ÚºræÒd}Òî/y½oápâ´­þ²=·�HÑ`0â\r@Ó8If­Ö±›n=vó­G�ÜÔŸ;rìØ­7ßyï‰[î>vó�'ïy µ|Ô]Xrç%qbNÃXñ”òaec娍�9N™-Œ\©œVkÑö0¸žÓõ¬^—vtàlm‹«Hç\½Xù7B8—@IÒ$MÓ¥ÅCŠàÃÇŽ}ÿüà'ùä`0�ÇŽãP8¦TÊžëZM¶†Và!šŒ}EmׇQI‘J‚8à"A"¡)g)÷VAÔ³ìy¯c Éý N­‘ô#Ɖ8�•˜†8æŒ+’šJ”pK*Me¸6`¾h ê¥XŽâhs*¤â€½Þ|gáÈâ�'­V—ZöâòÒÂÂB«Óîôº�ùùùÇçºáÄM\ÀxbdÏÏ"Èóº ¬ÕŠ”…°•¤j0šFa*…%Aœ¨P8¬Å”=¸6àÓ”p)C®&8Vœú“dº®ž_¹úÌ•µs+£•�§;½yùÚÙÇN=ó‰ÇžþÄcë.�W®­ž½°vö¬ûÓ�­ñÚúhmmkuÕ £©�±m×q (ð§£ÁÖd¼ø£áhü‚Ïz‘@@)SJa €°…$H$µ=¶ƒí`Ûo´º[ * uh§‹¬‹Ù´-AÛÚ!inUAÆ"ze)Æ/ ·�*‡ðj P¥9›Òñ”�Zœóª0L¶eö´ «-­Lq‰`GK&Û8ß®fU9ò¿ÊN¡(ÁB0É…Jê2áì·Åþît1Âá¢û4HCfç^¤\Û-ëaB0ÉÆc%E¶’Ù²+¥„â\ ȡ̒üR)ßrßý_ú¶·ÿæ¾ëü¥ÎeËiyŽeI9O¬`c� »¶ºÞõú–×ò£Ðr�ét*%o{NBpËÆ =?ñc§(2fXÅÓ1$S’È)Å1HŸ‡›p$†®%Â`èû¡¸€˜¹ ÙD "Á"í$m‡Üž¤ËVtyà_ Ò»°„�¿3§Í÷o¹÷ˆ{bÞ=Òë?tüŽ[[‡–b‰ƒaÜG=7¶Èá1Ûº4U��l%?ô˜:syøøÙñ“®=ôD|nuüÌå§?ô‰ñ…1Æ®=ò×½|ú™dìw¨Ý‡LU'v`uºöÈS—?öĵ‡O�ž¼�»ž=ùÁ‡äùó“ÇO¡‹WèÊjÏŸ,¤a7»áº5Ú_xrxîÉÉŧã•+mɃá0I"N©”ŽÝfVw4ˆÎ>uv2ØŒ£-d§Gn¼A!Ê¥äI â'ƒÌfº0Îð� @ôN>#ÊV¨N6­ÔÎϪðæÌ—B8{í`�vèŠQ†«¿EY­ÒŒ^©Fu„Œu¢^Ú´ nf¥dp)¥Z®b€_Ü´CÕ¼銵 �`de†½H°2bûÈ !x§ö¥)úÕÒ±€>É“Ræ“%°BEâ„ãAPÏ!�á¾24Z1£Ò¢à!Œ1à‚g㢥œóÉÔOÒäë¾é¾øË¾üÿþÉ_¼tÅu[ —”Ò8Ž×ÖVƒf¸Õm­o­s΄„"Ïs†Ã!¥˜1–FÑ굄a˜Y–”B¤±Ë(VRñ �°< Ó0IL P 9ÂBOy˜¤¾Rœ‹Ð²Q"¢DÄVËfž&¡1Š‚±?¥[ˆ¸–'2EŒ“VÌÉò‘Äòü8�Ÿ_Nî�'ãÍÁµ3ç.=vú̃_züÔÕ§ž]¹:¹víÚ¹ó[—/­<õŒ¿¾¹yùÒÊ3gƒ�õ­ËW.œ:uáÉ'ƒÁ¦ ¦ëΟúÄç~øÜ�>óè#O?úÈú… Épˆ’ØN$WI„xäÅÃI�)‘ MQö-Úµ˜«TC�Q1ž^~æ¬ CH¯Óït:–eQŠýpÊ9— ¦apÇ�w;®— ”RÊ0BJÊŠfÎcÂÁv°šZŠû½ë^9am)©˜—\ìíÎTqAu"+MZ@U³®µ}(mýpõ KF¹yëÂÐ�صõg—œ-j¯Ê9V¥µ×’ðÀ]úÛ¥„k€Ý®›.2 ”¯ h¯¡)¥„ŒRÞ[˜“Vë_þ»{Û]wÿþÿù¿OŸ¿€ÞÜÚR ÚžùÓÁæz"âáx�!(•F1Ê&8‰B ÊŸ V½¹îÈ­l®_½v5Š* ¦X •Ä<òU@¡$¦mËÆ yÅq((NU$Qì¸8‘GÑTL}ŒÒñ8�F2±<»Ýï*¤°”2Š��q$‰ÝgýíÎò•ÕQÂhèð¯?xõüūϜ¿öôYÿüåte5¾rmnÄ+W’µU;a2¦~�6Ü4¦~@üé‚cu”„É$nxˆw0ðáÖôê%1ØP£A´¾£±Ç,ÕdÀ'Ãt²)ƒ‘%c Ç ¦HúŒÄI(„.¤= u�[ÑOÇ4ðÓáÖÆ¹ ñÖ8ØY–…Ýpà ˜á•k«Ý…ÞÈŸöo¹ãn`6`"…¢”„H|§î HáLMç`û u�kžZFàråc›))YiÔÏ,èçT+Ú®IuZ°®ço¶Ôy;¤ÔiÐæÕ [�z1Ô�TVûùUó=SG³ô¾RJH!„ÊfêzHuÐd­W¨—UÛ3ææÖ̬«”å”zKÕsDe9M.u,¥LÓ´?7ÇW ƒÉäÿÛ¯øiòÇïyO»ÛCˆ„SŸ€ò,û“`4¦‹0žn(Š £Žë8”P)•b›`—) È!‰HÂéDŠT&–œJI¥$2Å‚#‹$ˆŸ§! ”:QËhè�Ö‡›JG"µ–º¢kµÏ»ë–›Ÿw»ã8"å" Qœ�DPÉœñT$!¤¾¸töÒÆ•õÉúppy•F(ðíØo«¤OÄ-ÐxÜ·±�Ò6CL ˆ#œ„Ž®–L�ÉY£`*'.pKDr:¦iÔÁСàbéaa©ñ€ D`[œZ©��„б”gƒ¥8¡ &áæz:Ø´’Ø9ÙÚ¬®ÍuçlÛ Î^<›¨”zN"å�÷=àtæ¤Ä„:Øʦ³ ý5 ê€ðñ3«Áž=æÏ¡ûQJíÊu!Àù J‘ 0.’w_Z⪯cm)ÏâÕ«7– «¥Ô*/öªüŒät]F5³+®W†íîÏ;* ‡Ì™O_ó‡€ ÔÈÚŽQ‰‰G{²UºÏba°ô½¥«�{ý¬¿”ÒTðáhbÙŽTØm÷I»ýgï}ÿFàÿøÏüÌ$ z½Žˆ#°éQ̈ò,†D‚¥`ÚŽƒ¥t(¥–ÇÓ)õ²W¼òø‰›––ÝtÓM펧—"ERç±ïGÓ©J$¸Lâ4Œ˜EC~"vûÝÞÒ‚Óí�^§sÃá¹›ŽwOëŸ<~äÎ[ŽÜz²·¼‡Ôv¼®× 'S'H€äê™ÇN]:óÌtucpñʲÛr9§IL“Ä"\ñ©ˆ" é§ÉD¡hêûýî|¿+eB0ØI¢€G> ¥ÒD%!‚*q$_FSÜÆ’‚ÄŠàD¥XÅHF F#™¤~)J1€L£(MB*Ž=ƺž7ØÜB`Œ{ýþÆÖ楕«­¹ÞúhtèäM7Ü|‡ÄV"†Ù¦éà �H‰‚kÙÎTÐçãgPSý:>Ye#6 xqÝîê"\ H´ÖÅìPƒ «Ú8­=Íó�:8 £L NáüULÇŠï—>°ûC bÊÐâÖ.Q)ÞßÉ0PÝÉ6ì­í¡êÚ[ÝÒîª!®º ¢Ã ¯(ž¦P’K[ž›*‰U ®0&ã±ïÎϽó�Þ}Ûóïÿõwþv$RË¡sý¶)†¾)³Pø„"·ír%£$¦”ÞyçÝ®íAªn:r#“Re3§×ëõÚ�~¿ßmwl°%dF£ÁПLAª”ó­éx…í¥Åc·Þy얻玞8qÏýGï¼›Ì-à^W¹ˆRžYUf[^»Í•°lL‡kápc|íê‚Í–l;ÙÚ˜w�–cÙ )¦„Jâ42Jd˜B’H+1I¢H‰iàÇi"” C?Žc)%’ŠnÛn¯Õ¶1åq¤„t§åØ” •FÑtŒ'<ްÛ²�HK%„�€°I„A„$BH*Æ“áhqqÆ¥Xݼ†,ƒI¬p=d)Yߌ!òŽv§Ø¿0¸ªlj·ú¯xå…°…òú G)q]�Ù6´=p 3«…‘KÁëks�0xWRú@Cþ3«³‚w ZjOáj·kRr!Z…Çì¡à Í_X« œD- ©dYòvn]9~f‹ÂÐEЖæª#)U¤YÑ”àÅÚn„™š^ëð2£L³9”Óœ¹™ÒÐ¥¡´Ue.0´£Š§S,v•æŠòt´<¿¢[=C§§´z¥^Žv©·ï�,LQÛ/¶ gYtÜYXXÙÚ\8yâ§þë/ýŇ>Âúíád,A%)€�âqÏu}ä–G/\½ä-õ|V d<�‘H¢VFÃîÒ¢¤ôò¥«µ ¢ ýy†0ŸDáÆÈŠQ²æŸyèÔ¹GÏbnY´“*J¬Öâá£?lµ\”D|°™n®î÷dqÎÛ½dµ×‡1!�ùÞáV¯ïvºa”\½¶&¹é–Û‡~(°%l×îÍ/:~Ûí÷ÞsÏýwÜ~ï/~YgéÐK_ý¹·>ï~«ÕY½¶æ¸¶MV+Ê’>Ÿ\^¿„m«ñÆÖ%.&ÁtÓo�7.³"?ý`uu•Ú–BÀ¹œNÃÉ4Ƭ5 “4Åó�Ë­I‡J©ŒJ)¬äm·Ü…~Çaßó¼{]·C°•ñpãq°=Ëú¨ëæYÀ3õnµ'¥J—©Šû&òÚ¡“:骺fIµeb@mi‡"¡†?8_�|ÒžR4Ä{®*š.åx¡03_MÝ´—† j€bfS"·¯XϤ«)ý\¬à•?€ìdº a K@Ùz~oÀöš$ z‡M%?z÷¯ûê/×ûþÊ[˜ â(õý¶Å’ �I"U’€øíwýîù�«O¬�wõ9Ž…¥À R–Ã"Š6ü1Pâ¶< ¨íµÂé¤jëHw ÂøÊVze´þäåÿú#Ï]�Â4å 3ks8�ÇÃ�5L&«WûèG'Ž�8wyõêÖˆÓiõ®�»ú‰÷}ðýÿçOÎ?üÄú©ó«�ŸM×ýé•­‹�Ÿ}æòÚéóW.¯m]8åò•õÇŸ8ý—ï}ÿCÿä»þä=Àœ—~Îknþ½«Óá¥áZÈøÕéÚÅÎ’7ƒa¼†ÝXâ@¨ ŽÆóý¹h:Y_»–¦)uìX NqŠ”àˆ§2IeÛ›‹‚(M�vzs˜ô[ÉÀm‘µ­Õqä»õó,@âµ;7ßz·íõ%0•´ŒâÁöuæõ@¤jâ8ü¨Ç­ÚëL’¶P2Uuª$U½–jÑ�²^'³¨™½¯ö·«N¨Žï]ërêV ´hZ'Qåk©vž Í´¼k²—z™T5cJb3{…gоî­âjï“"|(êÈ@$¿"…Ï „ü˜§ƒã@¿ÿ޸ׇï¼õÏ?øÛms),æ&N·a´¥âWõ›þñ÷�sËÑ?üà{É|o„›ÃÑ\¿/SžÄa§×JÃMÆ §�åÑűò¹ Š­4^”N¦ƒsNücçNŸ '£ùù>0,ôžzæÜG>øG‡—Ž9zêÔ©OžÖ}ð£ùË??ýðÇ­4ÅAÈâXL¦xÏŸOÖ7„ïGA¼µ9\Ùܼ°¾zuk}s<\»ºÂ§átsóÏþâÏF"uNso=A޹0™œß|òÒù��=súÚ…µx Ø—ñT$¤ÕzêʹMâõ»©…—>~åüÕé` cL•í0à© #ÅÃK«Ïxsl#LiòØêÙóþÆáûnÿð™'N¯\ ²[íùÅCQÌ•$q R„h^Ã<ضç¤\ÖÜë@Æý¥õôpäFKm÷Ì'?úð‡ÿêÌ£‘ÁzŒÃ G4©)tˆðÀG!´±’R9 N7‚"êØò’'å¼k!,?zú‘£/¾ÿ¶7|ÞW~Ï¿ø7¿ú¿žÿ9Ÿ×+?÷ Þþõ w=ïÜÄèÂåœ>ó±³çß÷èãc‹^˜Žßý‘žõýô©›^ù’dyî/ûäékçS*[m+ަBF¡§>¹ù̃k—ŸFñ ‡¿è»¿ó…okïž»Ýû<ëð¡»î¾÷¶ÛïÆÄF„¹®g96 ø€Ëë`{¶Ž¤Žd°W`nÐQUu"ƒu­bÊbàÁ­N­œd]YLë´å²ÒûZgc0²UçªýU …Uê·›³È&ÜÃP†t¨Ë¨JWmf¯«ŽRº”ùå ƒÊÈæ²ò‹PRJ)@I´“Z)R)Š«4»;¯Zýömwþû_ø¯_ùO¾õ’DþøéSãà½gž±OÞúª¯üêÐîL�`ç�ßð-¿òGzãË_ißr;>zì¯Ïœyzk‹µ[`[ʵ'X®ÅÓÞñCÎrw´ØYüJ:Ps4†€àˆˆé‚ G:¹|áâcŸÜ¼rikkkkêßvÿßò½ß»¹9]ÛxæÁ�Ý@ÉÚéÇÁ¸¶ìw-·ec·=åÁf¼%\¹n&(#œ28ŠcpHü`ÄûãIZËK�Ûo;ñ²—á#7*§óùßòÏÞô�ÿâöW|ã_~×ÿÔ7|ÿ÷Oüì·ÿÈ�ÿËŸýù/|Ç;¾ùßÿÐwýØzÕ[¾æ›~ø?¼úŸ|ãW~ß¿úá_ûŸG^ü¢ßù›÷=táü…Éàj>ºµþákW×{�/ÿ¾óÍ¿øË_ù?à>ïþ ÝyÓ·}ÇM|ÖòMw.9é´»„YQ �\ˆ(Ф:f<Ø>%±&y n’òTmVÞ%.öÉ‹¼UÕ²!$7Èâ�xi38¶ºI”ºIx­m­sNPÃQV—ÙÔ­jQüªIÉk{Í•¬ŠQBý¨Ð³Ñ 7€ßv�ܶÊp)…RE1A¹óóö×IE€)ÀrÜVwq#DÈÑã_õ]ßý£¿ñ¿ÿõù•/þöïüþ_ü/ÿê'–Ìs»G¸ðìÞá»Ö�·¾ã~ñÛ~þgßñ?þÆoþ¦'ÆÃ¿xð¡'¯­>xöé«iôÈ•KO][ 1NÒW¾ñóc×}äêå'×W>öÌ©Í`Ĭ ‘ÃÑ"³h”€¶- $ßš H›ž›[°-¾ríÃø‡ñ•«Lp.ÅÓW¯LÓ¹ôôÊùMP´žŒ#Â7ƒá€OáH¨4 ƒ–mY™ðõœ �·½äÅ_ü–·mŽAá´}æ€çI§ƒæ� oλñö^üʹ罠wÏóÜÛn_xàEö�÷Üöº/ºóµo<ùªÏÛdí!i“c7á÷üÛoûO?ÿúïøg¯øúozþ›ßzë¾øußðO¿ýÇþóò _‘ö–’C7¦ËÇñò�!ëÆÈãÊìrŽ‚La�2â8 z`¶çÜ�x ,-×ÙÄ’á6µht½„’Q«¶JPíg3´ëëD…µ]ú™Z“Zž±ª_©æ[%ª.CpmFRc÷s–þ^\¼^dï–uõÍ5P3ƒY~"ÚÜK|:(†Ýz)”¦©ãxˆ°i’¯…ݹ±Ùî�ÃGn~ÙËnù+ŽÜÿ‚¹£'ÂH&�ìZsIBÁéÄÌ�I»]uôÐËÞôÅ¿ðûïüÆú]/xõk^ñ_øŽïû¾ÿð‹¿tÿË^þøÓgŸ>é÷ßý§·ß÷üŸüåÿö=?ôC_öö·R^^]Œ†Ò�P”ƃ±¿58±| þ_ù—N=ñȉ#Gž|è᳟øäøÂ¥+gž ÆÓXHÚ�[Sчž>•.¶ñ±…KÒŸ´ÈÀVÃaÈ䄇ƒÁÀ�’i†¡²é'Ï?5¤äË¿îkq«3×_BÀ„BîÂBbQå´p§Ç�6´çâ<½¶ñÑ3gÞÿØ#öñGÿâÁOœÛB)mÍyGol?i-Ý ¬ù;>ç�Ç^ùšC/{ùâ _òªôµ|î—Jç(oÏ£þ2î-“ÎR¶ÄF6F6‹R‹§’2’ðXˆz*ÛsèQêÒ”hZš_ÁU£™ÏITg³÷�AŒ¦R*MSÎ9dæ,?Îy’$qç¿ÍÆÝ«dºU”—v¬2·§UDl D›'UÕFB!óÚåqA@0¢9Ý‹’H ÈßÌÞ/–†„ÙI{HÅ”®8S’OAæÃöU¾€brPZüY@¾“v ¸,RJ.øö²ÔYŠi_vÚÙ—âñç€iÆ£Œ`’Ë …„B€bÌÙ~a…1BÎ a)B`颻Զ�›*Œ½¹Èéa»‡Üyh/K«§ÜË™gÊ#1rQ‹A QÛê÷¹×‚î’l�öñû¾üëÞð]ß÷Šw|—¸÷~¸ýŽW|õ×þÓüÑoýÎýªÏ{ãk¾ôMpôxtóM·¾éKìÜ+o8²pû­·½è~Ú²£hCêJ·�o¿í†?ø­ÿ±td~,ƒ•Ñ`éyÏ»ÿkßúŽÿö_ßñS?ÿÍ?õ3ÿô?ýâýêo|Ç¿ÿ©/ý'ÿâëÿõ�|ë�ýÜ·ÿô/}ÛÏüü×üà¿åûÿÝ[¿ÿû_üåo:½1\¼í�[^ùÆöóÿó?ú3pâΠ=7+J±%->Š­„’Ø‚©´#¾qá©?z×oþÎoýêÿâÏÿëœþØû?úþ?ûÃÿý¿ô“?ýîßø}>àHØãHÅn+êôùâquüNëÖâ¹ã¢{÷–,g™�y umðÚ´Û¶z”¸ÌòÁ’R˱ l1D‰°þ.z*ÍAù£õ™î§ÕÑzÒP$ÏlHÁ7TƒÎ’ñ€�Á8%•TÛEo•©rà*·Ë›Ù½Š¹H.NUÊ]šèEÖÅò¥�T)ܵ¡w1`Ï�­:iQ×ò¹ŽÛ¥4¨¨¥Ûª ±äE¢GÌù›‹Ï1 ÅÔm/®dñ%?]¡Ö.Kvßd¬-ÛΦ²T A&«�3«‹m24JÈLÝe}þìO°¬€(D`Û}Hr®Ò”[ÔŽ§‘�(ö£Õ‹WΞ;÷ø£O|âC{ÿÿý³?ûí?<õ±GdÄmbßwǽO?úäŸýþ»?øž÷ýÆÿøÍ£ÇOÞ÷ò—.ß~këØ¡Ûžÿü^üâ…ùCÁ0’�šï-ß|ÓdqùðÝw‡žóÒ7¾þ%Ÿ÷ylnžz]«³ä-rÛ ¬=ß]8|ôÄíþ4þð¼pqåôµkÖáÃääñ§Æ[xع떛^ñXîÏÝrS*¥ëµ-’ÉÁ Ûu’4øèûþø·~åçþäwþ×'?øÞéÕ ‡þ‰3�?9½²æL8Û ¶ž¾øäC�>üàÇþæ=yáÑ3Á…ÕÁS—;Ø ‚h˜$Ϭ¯?µ¾6–’8mHÁߘò±@1ŨEÝ@霸ñ÷þò=?ðŸþãÿï§~æá�?¶vþš æV°>ýع_úñ_ü�ñ¿û¿~÷gäçþã÷ÿðïÿÆï~ç׿ãOÿâ}_þ¶·ýùþæ¿ü÷_ýéŸù9)k¹q´˜uúá‡úë÷=ú�¿zç¯ÿ¿�|è=vH$F×ìhÒSbÎ!LÆsm—�è8Ô¥êÞ;n¹rþé_ýÅŸƒõLú—2æyŽÓrlצ€8ŽeJ8g\!pI›à`,þSo ¯¯7ùé˜ÊÔNÈïo)ªv!„ÍxC¥®³]Jª–Ôì*¡�îýžúÝÞ¢™5Sse¦§i8>©Å¼™õÄJY !¤n‘µôeuûÉ¹è ‘KÕ»k)2ëö@V{ÚZ ”!¤!ˆ" °@ ÈÍ2 @�cB"©�T$’ +IÔ4�׫?üCÿöïûË¥¹îÂ|¿Ýö0Q%, ÉÖØ "4™¤“‘Ã(Nâ­$=„¨qš¤HË¢·KÚ*P“D©.¡©¾S7 h^Ž&*&Z—Òj;Cu�óê?µÔ¼†•)õ- †ƒ@›—4!(å^æƒÉ{3¥¯¨ã×Áõü»uØÒÊ£êÄ��HȬØ!‰€#ÅAm—¹Ðv# @d;Ç;“c’ýG&Ù’“táèâ=Ï¿³ÕµÓÄ�“)WQÇÁ}—8’Ç[×üõki0–"’e2oy‚wO›-�0�:\v°åä`js�“PާÉd‚R±uþ¼FvÍ!²€ðɹþ ž×Q©„'*�ë·n:yÌ¢(]Fì¶uüæcËÇá‹-«`mríþ?�n­ýÊOÿćÿô�¨?œƒôDß]öÈÑŽOÃÑhÌÚ-_È ?¦�9hwBæË#Ž –•(5N“ók×Þü _ ®C0 œJ¡m¶=Ž�cPA’(I�Ä’ç¼ j÷u°l×íWžM³§ü¥µ¤UoH¡ ÕX$k©Ã7?áª8céEBbCËaf�d¦›i>î®Ý/ªóaÙy“¥wP‘ì-�W1Ì'ùHH+ ˜! Ð ƒ!Tõfš°ßÓÁœñ¬äÑ·_î¤bYÖ‚A)…”‘�>bX‚ É¡$ �ÊX‘±RPV€&! [Aû"zÃsØp´µ0×í´]GƒÕ«ÓÁ:Eܲ¡7×ê-÷I ‡*$Fþ ×w§Ó¡…ISˆ#PÒq,Û£”p†¸ Çi0 ®\‰/¯’­É"P'ˆ;Y(–úb¸¬‡àO”’¨wt>µ¹ \Bâ´œn¿ã¶m¡R©øx°~÷±£oxÙKn?ºä¨ÄVIÛ&[ëWÂÉ–Õrc«“éFÂSÆÌ€¶¬N‹P;â|N7ÆÃ{_üÂ^þ2? 3IyFí b1#’$©BX" ‘Œ(F€`…ìhï(ÍoëÍx–ƒí:ýÊ>‘·¥ÌaÛ\hçï IC�Òê›ËeÚßÖ­K�ZT]{@›úh§«-¢â?µœóZ"Èj³¤.¯*îÜP•ÒšµΆMÖ¨¯^ÄR—EûÕÕ.‘þeº**P$à X²}úY\eª¶Û�<ˆ"ŒŒ‰ÄH"$ L…T"�H&¥È¥jY¯yõçÞsû�áÄ�ý Ž‚Í-:J* �Œâé0HË‘.ÙG¸ëF6N-ìõ»\ dá)÷|<ßG>Ð ²!:1×_t4ñן¾ ¦aø£uð€QnÙàµèÕµK~8jõ[ãdʱ"º�IRÆ•ò£…VÑn/P7ަ[›X)!Òø4‰–ŽÞ!¹1&L Ò0¢@=/MSàBE)´<¿B*!;õØ[ÞöÕ �©ã"‚•RI’ÄqÇ©ä )ʈC‘…€)DÂa‰¶‹‡Å«p�¦l׬Ãþ'Á5“ n| 5â†PC¢U4ÊÕ‰ÈbO ,&†ñs…­®EfðÉ%–em»¥N\ tºU"Þ:×5qPG'Sª�•ÆõKìÑ9ÙAqçU„ÛÎû€�æÊg\J~×ùØc_û¶·;qcˆ?K¾°ëº®Û"„`BˆâH R‚Bp¥„Qôë{~8ض}%+{”–5tK»ö¡ðWS  ¥R!øŽg@„”TëBr;ÅÙ+{G(•½²w²ý¤B¥²ßæ¢÷ù¶ß©X[­Ï,:‰¼ù\L;ªâ†¥}V'À¡08"ç"2͵UV¹ö‰T<{튯i;3oƇ_ô{ºëIc)@ ¨J§T)ô3µ’Ò lrGNP ò#RÉ3E™â1Ærl±gÈJ‹ÞK!’K‰B‘í€#�â¥Drà …­dKá–ÄDÆTR*U ÀH J)JŒÌ&D¢ dê±¶Ân*ÙÝ/}åÑ�y0› P®MXÛ˜r–º"Jð–ß—VGY8|ì{1Z$­¾ÓóœN×íî/u°K8 D¶¹/[椄…¶â�²$ç�ElÓOC.�Xn·¿|HR–(H”J¶AµØF')Ÿã˜SPœ'‡V¥[>I-‚z zãÍT¤–ŠI:HX‚¬Åa„ËškQ›¶=çÚÊjœò×}á—±`Ôk³ÖElÇf Á! ¡@ ²0q0u‰íPFApöDïíÓ£¿#ûõ÷ õ÷/Õ(¼2z¤ºWNr¡vB: j¦žóžJÚ­`î°,H„ ¦€*…‘B8�苦%̹¶Ì­‹ºqë†-z-4 *Š$Òž–²®v”Ó¢û”Ò\4¬XO«“©ËœÖ«UA˜Åh©mwiæ:¨^±ôYTº,Îü×á˜÷[´,IAúRÅážõß…‘J¶¸º ˜2Ë‹½ò ¯ÝŠCÕõR†·ü —Òs\2€Íáæd8âQ¨Â$ÜL®®NV®ù«kÃKW�·$î3÷ÈÜr¿Ó#ŒÞvÏ=«ãÑz0�ŽGæ; �0Žfu:=·ß™úa’pJ)%”1‹Q;æb8÷æÚ�žÚ M²'¨Ón;”!!ba iÇq¬¸L¢X¥¼e;D¨Ð÷-Jûý¾Óò$¨ÍÑøÌ3O¿õkÞŽm;Žc„d<œ(·yÇÁ6»¯ÞÈå2Øáæ JÕXí QØXŠ¥ªÿa€C=ÙÉs’¯iûÕ! ³á®öBJ-–l*>;7¨öšBKÞH‹U«Kê”gú•*J¢y1Ÿ®¯Ž²Ö�òÔ9CMßLÏÓ@!•B išH)%F½cGoþ¬ŽAº‡Ý^/ôý�+W‚­­h:a±)AiŠ£ØKÁ‰8lŽÄÚNÃk[ã+kbk2^Y�‡AàÇ‘’Çn¿µsìYèC¿#;&‰mÛ`3¥”m¹ív·Óëû~§B"äµÚ–×!ÔO¦Ä²S¡.£„s¤dœ&aú‘eYív·Õê` A“i<7¯¬Zº¶çXöd2QJÅB~à#¾÷E/|à5¯ÚX_ó<a"””²×8ø`3{”}›ÖŸ±;HÊÜD×ô¶w‡ðwŸe¬íâæ…‘"Wq•+¥ŽJdfW§.e®µ™ñ~‹‰Å&P.hŸ9CfÀ.7›�­*si.e®±öUüqÝPj•™cˆ’‡+?\ô‚0{ÒÓ IP„ p©!¾‚—¾îõ÷½ì%Ož;çlj²�™b2¥)O’`:Ã!ı«À‘`q?žø<ˆâ­Q<šDã饳—ûÝ…îÂbûЂ»Øï,,¸¶N¦W/_™úþÑcÇ-ËB ·FAø~H¨Å[\ZöãäÊêµ$ÓÀã(–|äq#D£ˆ.EGA’F �¦>$Ü€bÞ²Œh»Ý¦ˆ~òñÇŽ~Ë?ù¦(ºó ˜²4{Ö²ªàíz…:HV¶çØ•ðBÆ3“œ·\nÉQÈ…î/.Ñ«˜­¡6Wo îf0“Í&V¸nl¥:ªI)eŒ™‹]ÕVõ󿂲¹Ï_dÙ/CÁõy5à T§¡Y�ÜÔî¿(@iÀ4df ¸%¥Í,¥”Dí68Þ ^öÙwÝûÀû?ü!.�ør·ÛEDަ)OR«8ã8Ĥq8QD‘a0ÅJB˜�0] îðÂÕµËW?Lã„(8ºth©7'ÂX…1EÀ^êϧaÐs[HÈ^«m3Û”9¶úç2ˆ j4‡q2 ‚ ‰£”§JFq<ñÇq1L°‡æ�TŽãX–Óö:?ô°Ýr¿å;¿SâtÚBIÎ9!ÄbÖ�9ئûªY}4ƒÏvª×ÙÊ*Ã|Ÿ±¡’S÷Iƒ‰,ñ—iéîò�hW's$Ú³ƒz=]Ãnµû×aë«<ÇÍÿªNþ¹AÞ“OüÁÌ*,ÏNJ?îƒÓ-U&…㌘@Z”�À’+J%ñkßüæ7þ£ôÉóçR ¯oÂ-f{qmJ]†]šð(–‘À<¥I(ÃDÆœ§L)+Us˜‘-ß¿¼6¹°BG!Žƒá°ë¹·¹a™¹Ó•kž”—-®äxÚ#Ì•°Ôj‹ ˜sÛ'±ê¹-%ˆƒk{�ŽF“ÉÄßÜ\O’(I#žÄ®cƒLâ0˜ ŽãX^ Yô©3g×/_ûÚü ÈuÃã8J…´ˆE`\79ضë®k5÷73Ÿý™•ð²m©ŽX×�¾—¸FŠ®¶µgBAšOÞ=·�›º´£I4ó{ëT�«ÃŒuÅ¥¢oHsY×¹1”ÚŠ(8ól©A sÇ‹hʧ¥7µt/ ï Jq†¦È®#T„|Îé'˜D)ÿüüµ_ÿ¯¾û™ÁšjÛ[Ó1…’$Ž‚8ŽR$8U •‚ñh*b‰¸í1×cžk9�WÖIw"Õ§‹œR?Ù¸ºzme•¥r;l£átå±''—®FW×Z±ˆ¯m’qè&’E Œ¦.5�\…q"ú¶Ç(m9nËõ¦“IH¬¸‹acíZú¾ïG"ùÓ$åƒ�Á«_þæ¶£ÁdŠ-Ës[RJÉUÊSœMŠª %y`0¶ëé¯ì¶å÷Ù{¯ ܽí�ä8Ý U¤í*â J %Tü0Ô‹®Ïœó(Õ‚Jå5í¯ UûEErøbL;yS,1”ÅfÚß™™f ³`]æ,°”{UgûKWm¦«®ËyÍ·êEfÞå%QjÎ�`"•ÄóD`À-ËÁ©TŒAË�¨äæÏzþ[¿í[V¦Ã@ñHq*Á! !&q,9bD5 &i$£ØG‚`Š”RI¬¢ÄŽ„‰ðêZ2ZZ%V/_‚©Ï#ÿÚ: óC­n²5_]�\]u¤Š¶†—Ÿ~&Þ¯�¿Ô¡¶%@„±�-‹1‡2 ‘“7¿ó¶[[Œ­^º¸5Ø C¿7ß[½vms(Sò¾ùŸäs?¥b`iIóïM…�;b9ÅsOçœ+¥,B)ÆêA(Y—YfœùÕŽTUQm爹�K@ØÂR H(¢¨Êûý Û>úüûy«;‘(!4: )QøBpž$7Ž”ªaˆcRH” ˆˆCN‘âQêo�7Zž5 :azC§;Ü\GÓ)žNÝ8l%Q¼¶ÒÞÅáOG£Kçq0 6×�?á+khuÃZY§£q‡C:ëëƒóçVžx ƒàn>‰°t�ôžÞ¸òÀ îÿì—½ôégžüÙ_ýÅ»î¹/á"NE$RJ-)1#–” $ä*z…%:�þûìž#ñ•\±[B}(Y”E)¸sM"ûd.i®?¨ _3 Á•ÈÈ銃¥ò—V.EË©u!u=Ø¢^Hî9´:ꆯ.­NQ]ªºUjŠSè3#ú*Ú­šÊT—ö266ak‚ánxËÖ©Í›û7%û^Bú5)Xm{/µGF;×RçÝ !Õž¶™Ü][%Å#¢�Óº÷e/™Pœ´½¹[oâm/¶™=7·5�pŒÃ$u¼v0 --[˜¬^¼Øq<Œq*¢X&„"×uRÓéXŠÔb¤ y–…¥äqHAµlË&˜‚r(± ÆJOU!ÒÈWID…Œ§“®ç¶9ÒŸ¯^\¼l'ü¦¹E1öï9yâÒãO¾ìî{ŸwÓmöGüÑ�}ü›¾õÙ‰„sJ„F€2¢¤:àˆ<ØjûHÜ-:’}åšçL¥—j´½žšá[uthàêô¢6oÐJ’¿®jpK°(¨è‹hÍ«ÙjY0±!²®ãeÑú¨çcc—Þ0�h0âÕ­˜‘”\¸6*•:«ž~O^3ær´yôŒÇHîvqBQ )œpÛyÑk_{ÛË_ֽ햴?·pÇ�Þ±cs7�tÓÍw½ðS¤¶’ @"á| O3˜5`äyBHÄ ¤ÒÆÔc.C¸ ( SQ¢¤Ë, ª@ I0¡ Iû®YQñ ÃÓ8œ$Áû?ò¡oýÞÞ¾aYxV)¥”KÁ¥�BlFc…¤BÊYÊ%8–ƒMïHŠÅ.Û¹K &¥,%1M LRI ˆ`Í ‡¦w­-£k³¨—œÊíl©¼V*Cmœw„XŠ/.%—2WdA„Æ2q.e¦Ñ’½Šæ…½eof¯L»0Îþ<"á<ÿ°Ôy²b§¡84S,©å;ÏC(%Ê©…BB!…` {�s€°BXeê,™RKöN) ʰ¤vP§€¶Ñ¥R!“üM� ¤ÊEVJ bµFWš¨/ÕLó³.!%Ú{·]Á™áCF Ož %3œkŽåÿ,Þ©;nC!¥ ‚ŘìLMe‡‘ žíœ`B& l êØ õ: Èr\”I"¸ä ÇBºõ¶/ù†o|ý×}í¿îë>ë ^äywœ­ §Ñ‘c· Üê–ç½è¾—¾zùØÍN«/]ûÜÊE¯Oñy²ŽÄ„‡#�spŠAS¦‚Ä" Ú.”?…()ÒucH[ ËÑÈ’ÐõZ!�SÜâbJ9â�g·Ï^Þøœ/{Ë«ßøU’{Žt‰ÀŒËrˆëBÛÞM)u�¸@,L¶1²ð¶2ô¶ÊÚgJŸàï09ûÔ}µI c¯2JQE(™¿dAB5o¡ =Ê¢/¨…áT ×ó /³vçŸÌÃë|–e§Ó N(•‰B!Ya˜­Å ÀÞyl­û©v}‹�_CÕ¥nf_Ìôª+¯•&7ëŠ~†¢™–y­a{ÀÜZ7кUó¿bÆ €m¨^$Í€,×–Ëê Av‡‡“Ì ‰¬V[åØs—C�µ¸,>£všp…Qgnî¦;îxÉ+_ù_úE¯ûü7(%?þñ��»pöÁ|ï_ü%M剥Ã/~ÞýGº‹/¼çsÝ%§3§Z�©B[I:Qj"äf“d˜$¸åm…SA•í:’ ˱ÁÓ±`,¤8`x=�×ã\‡b–çµúqL,w>µÚƒX¼ýŸOB(¶Çn[ÄJÒô Ð>Ø †Á>Pßã�òŒD[.‚]@UÑàÂC @wfÇÞ̬UgoêTêleþÅMÈêëfAÌ�j3·¼Áî#£¾dõL of_ËàÒþ›¿h.(mPp«‹¡JÄÌÉ- £ˆD¬«ÔÕ±�j7™Ã}E`'§Ì’RJI’f ®öòâÑÇ¿àK¿ð�=`9ÖÔ?ñÈ£�>ôðúÙK§>øq¹vˆ'8í,Üpó½/\¾õŽ£·Þ…Ûíê¬Z½Û›AšP žíC'!3Š`(eX:vê1xÀ#¯ãÆaÄ%ò:‹ÈêÿÍãgбÜù%?IÔ#@.uìé§m¶ôiчTzÕY¼R‚¢ilCµUòFÚ\MûtÃìY@ Ø,<Õ¤£^7iofümžlÎti%¤–a}gªFÎd>®~²šc6¡Óz¾bg"×þÔª�V_·d~xê„;µNj`ÙZÝ0ó2j|ùtõtdyçXeeD ¡V*UÆIqP‹ËK/üìW¼ùkßþCÿñǾö¾~eåZ¥ñ8Œ&á©ÇÏ\¾´v T©D'OÜz× ž¿|ìÆ»î{Á ^üJo~ùòæ $h Ò â²(ž2Å-žDÃ-ùHɶg;òÂ<¦XJ…œþ© WÔâÒ/üæÿ­V„Q«Û"•JÈî~úWá>E{¸îK_çcÌ�׬¡’5H ÁØY©ŸZ´«Uâݺ½áænÜù• g_®¯Û„ºÑ E¨¥j7KW5Ì `å"è°¼†"žYE§a©ºÊ邌[•j jÆMòª—, ‡7‹«- ¨!Y ©¤ÊlžJŒ‰e¹N»£an+U %šIæûw¼æÕïøWß{~m-¡t”Ä^ož ã­•�`s8¼²þàû>xñÜùÑ`üÔã§®œ¿üÀý/¼ó¾û·¸˜ÚlÂÐ5’(áY¬… G¨“Ê`sƒOVóÉÀc˜2‚[ÖÓëW/E£oÿá/û]è8“p¤@¸ãI¬”8°Ýÿàs�†~%Ÿ)iÓR`²lÕÉñbÏ þ³xÐnøÙ÷†v¼Î|?'AA5E(–\Ì!ÃÌ1LóXe×–¹²×0�¬;*-€í:®—áÆªÞýÚÊ©ýl «Ã›y}ꊿ»Ç¶½; +‰0%Îeœð8R")F±:¸;׿ñdèzÐiuî¸íUoþŠg‚qܲW&ƒádthqN…Sp—YŒ‹x8QÓ M®]7C󵉱š �4wVª~¥É;šl¦²U»àÚ:DÑÎh‰eë—B’32•&µ”™]�"!cÕhÍÐÌF]µ¤êWê*†À¡á=1sd½IOÅàZ Ï¡®Lu?Z²µÒu¬“j+ZÕ°HSÖÁ7 ؇º‰T¸�9—J�㺶å2f#`”8‚cìö¤bã„Gž;°-yhþöÏ{õ´ï=3܈àèÉ#ÒÑÚU�É`< ·1jcÔVªoYÁtrquµ}ÃñÎmwÈNžŸ¼¼r~8Fs=²8?Æ0"òék›=}á¯=óÉ•u¿;ÿT~Ñ·¾cþùÏ bÝNǵ\bwœ–$�<·µšç*ã?Øf†•ŸÒµ-“æU’˜â�|ÕpUÉð‹ô*Õ‘8sÅef�A³!…–M N¥4/Rµ ]BC¡¬!•K­¡©Ù[?¡mþ×ÕJýsûÇ�r¦Uª3 EP ËX…‚T+]Åh¥š!UÑŠ¥.W1ÞÑ222°â|ÌÌnœ,„g”’8I¥„4"•œKfY 8ÄÀõ¤ëÅ…~^YäÌÊ¥c·Ý¥QLŽYàIHl,-ù>•œ*N€GQ¤ùòoøú/~ûÛ¿ì¿ùù¯{ý˜ÚO®^{zmãÃO<ñØÊ•À±û7Ýò¶oûÎoøžïûü¯ùÇßøƒÿÏ/ÿî|ÎWý£!e‚`¯Ói{�È�lÇM¢I˜ìÿ~V´žÃ|h¦G)½¹‹å­´UŠf¶*7•S¹LŠ%œbEgfœm°ÿÕsÁUæ`¨�6V!žuM‚:áÞ\Ù>')Ë÷SW+W9€ºî4òQ-éì%GË×½H6œóð—:ÙñT[U¹~W5œ/Q°„�óUÝÑÊ…’ˆ‹vl3[Œ±eYŒ±ÝA@EÑš|b´x¨¥CÊ×­xuJ+S$¨RËmÓäÀ=˜j¨QÜO®Ç;4ÉùáqÎóƒÉ„RZ’‡A1B,B³é €�’ $ ‰°B l‹!”a°E HÉ(‰™$ŒºÂžK½%±Œ“¶´Úßøƒÿæ–—¿œYÞä~h§>‹¦.÷ua°6tƒÈ�9ö’]èz–û/¿û®®‡�ù£oÿÖïû·¿ü›¯zû7lÍuÞüßûýÿý×Þúï~ü+~øgú¯ùâö+¾àö/ÿF~ä|Ã=qk‰t�XnO KÆŽ‡aj[¸…8xHoAêæŸ›”(¯Ž…©ˆºWi„⺳¨™'ÍÐŒ××ßWî^=ž*“H]ᨕ¬„¡"Rf,1Øï)-ì¤/ùœc1–­Úœâž³G‰Rš�µ•Ù¢¹.‰Bm[•ÏË+„ )/XoµG„ªtZ%.HÓ4×éjÒ®»~M Ò¥ˆÕ€æzöUÔºÖá•«ú˜�úRàPü:máÒTÜ@HìÌæ7`¤U+±8ï!­“k‚NÖö ókªeš)½_tÀÅu0gŸ{é‚Xi“r›ï;{œH�"•"�  ¸@¸Ó;~Ëíÿò?þÈO?rúÌH¡g67Ç€®ŽÇí#‡H«Í][uÝ •«áø¯úØÚp<�¦ª??¶ÙÄ"¯zÛ[ÿÃÿúµ»¿à ìö[ÈM'ÄbO-, ¹Üê#ËCˆ"™aøP R I‰”hÇ4¨²á¨ÍòOš÷'ªš~Oó•æ"»ÍËæ¦Su¤1ÎÚ;¹R¤ÓŽœ—Ø’rýÀ"ëpÃyõà÷°×1kÓ¨Ü"ÚËæRUµ‘^Ç�nî$7¹)ÍT%ûÚg]ùÈPV‚¸^¨áî€"Ñ@6ºŸý?[º´�|€ŽmE[¦Ó6ºÌŒ¢3’Ü¡V‹iÚ+’q<À^5³ª”r±†õ#¥—‰¸±£—˜ùZ�P8’)RŠR*–€¡Õƒ……¯xÇ·½å»þé5À—Rq%I×l"ä»öãë+ÿçý£Çúèåó_õmßúk¿ó»'î¸;«–»¬ �En÷'Òæ¬ n7œïÅó=Ñë)¯«ˆÊ¢[@™Ü< x›E×*Ë`äûSh(Aýíx—ç<üÛl«\w4;PƒÙ¿­�TŸ…’;�ú‰lmפŠ©ãRÑܪ …KÆj¨µƒëE‹fö+æ‘:[ÿlàü†B¡asf ¤Ú›)é%W/­¶)]g+ÍÍ’â)ÈÊ–¢’b«¼Ž²ÉRz'P�À)¥/U"€™IY­o5I•¿r…ÄLí @f¢VÛޤB"®�,–ÀpŠñ˜ó1RjáåC¼ñ‹¾ÿ—åGÿço~ç�ýDÜ›ÿƒ|èÏyì±­Í»¿à /}Û›ÿí¯ý×Ïþʯ€n/Ðb]JÇnƒd„´» 7Z¸ ¡ŒJ ‘˜ @Jâ’²v4`RŠ‚¢ píþnëû�"³RMæz�l]Æÿ¸³ÒPݣί T`–ŠG±lP .Kàu4(Ú:ª–ëj˜Î·Mb]šS7ÃQê̬“6ï'×y &}fsšÖ1\¢l™ ¡k8Ò�@³Êiõ€K“êyi«ê«ªh.4y&J¢¡!¨æFZÑ„P&µ’¦Ø…ªKy«êÎe-•RH7uU{yÂÑ( 0E ‘1ľí¶§0l#ÌÆ“‰£˜£°¥$•ËTbÉA¥I……‰D AqÅŸãòéQAj®�×°…ðéïžÍBiHPjHV éNöùjÿ?ëÛ—¦’‹E‹bIi7‰ÁzmÀ:ޝj,ZåZÄ¥�ÙÎÂ,u°™e“æƒE3Ëèæd­IâÙ¼øcÞ4¤PÏæù¬[¨RETܰ–”TÛÓ*ÝpZ{Ã�Û¯—6EË#V­l�V8G �«gÛ^…‘¤$ÊzöŒ‚+%V€0ƃŠ&1 "OQˆ•Œ¡ß=l{sØîŸ¼íîD1O)Ïu�€ê¹Î¢cwæÛ½ÁÖz›P'rê»ØæÓ¥ˆ »íu(bŒ1& 3@ŒJJÈj^X!¤0’H*¥Éb[¾d,ª$Ïõwk‚›Óå}šŸÅs‚I3XN=g(mtžµè5lùýSÏb†2×Iïµúƒ/ÜØ0þ­í©hQÌf÷®­Ãh'ÒÍ¥§j5°¹G™q4ÄbW™pŠH0-×´¶• ÄT]t¿§Œ@IéÍmÂÿ®øÒ”¢VÕ¦X‚¨kº4,žTQ‰uu¿â± )JÒÅZ’±Üø–ÚxÅ^Ùqî~—PH€,©d*‘Â@¤ñ´�éœÛ¦©d0¢JBÉ”Ã4J,¯Íc"b†°�¥MR‡µ†[[‹½nEmÇë÷úq1»Em'Q�bÌ�@�"(A”Hb Ìävƒž í$*ã ßëW´`0h0£ó÷Å(k¹'þþ²žeÈXçW@«?š~Æ®�pƒš«=–eŸ0©ÒÚY�F�¥Ùƒ:a\\,ÝñËæw‰j¿ª—U ?‹7V¾.Å?¯vkª­‚R¶UöBdSeù–�-·¤„ÀX(•É·d� ´óf»ÊEY2]QéÏïìPeÚ&!…1‚AÚH¼pØsjˆ*D$dX)TÊõt’‹€)¥ª„¸â½©�á´Äsº¯°¯aÌ×�Ù¨I˧ |V+Ø r7£Ø#vWXê æŸÿìY·b-½ x��™Ç]±ãH`/þ› å~¤�¢P�«3tM¤” Äί2%” R„S„B )G?c.ò†:ð’™H_[Ó×f0ÝYÃí[úÓB¥ëœhq¨b&QX¬¢ |(žu5שjÃTEéµTö¥¯Ö ×MÒÖÌ#®×¦ÍÑk3Ñæ‰ÂƒLJXjmº©e'+ÆIf>(( -W?�OtíF‘€ŠŸlØ#Êç&îÞ9­"ˆ�Ö°!KnÝh”ý\‘ì6ÈæÛ³÷ìaÔ#�@Uk¤yR«·6 J:�Ú?Ô+ ?«r«Â .:4m£^[a×’D™¹æÔÏð³–\³h‘g6W´½ƒ Hµç\œ8­£{1SÚ˜mG54ú r&Uº¯[¤D¯bÎÜ÷EŽTǦuªžEéI¨;˜B$¼‡Y¯\¿FPº»J‡ZtHuX†ºžœ©|]÷ST2Ú-¦ƒÒ80#o®9³iÈÐþé\¯kziÐ64¤(§öy ´AmÝÈ—!]Ó6JÍPšºö¾WLa¤0l|ÔD^ua¸Y«Ñ¬­R7è×ädêø€«‰§y4Tæk¹af /ÖŰ3£CbiJߌh¨mñ¢umŠª+bd…¶UÓ‹ÃzÍCe¶‰Ê§6'(Vrëz*ùd~–ò )Šc4!RôaŒ‹Š5{V +1娩 é÷Å2EñLóqå,;Ùµ×{—}Û6á=×%_ÿ¼SοÞ·ªŒg7´þZ‘ÙŸÿÌ ¶,zÐ;–îíìnÑÒyí·Á©�ÕÌÅ¡ºzÑ']w>‡ÂÏ °¤n@¦!›¯ÙàÖýæg[´JEèm5ò­’I”ÊS¥vtµ<¨©©R˜huVJ�è=”p{yØ´~±nXÉ�ÞV3ž¬ÿQ$sÔ†ÏRù¦îΙ‰jÈ"¥eÈÆÕÐésn-¿CI1³Ä‚33¢/U-ö[0|®’žºD¤aO¥ùÎÿíûß™Ê=j´ÔúK\Ã.¬åä�©Ân ¬ŸyÇ^7w@þ\=Ð&Ci`m6yF…m0k®–hñZòà:cZEID½´yLMÛ0œ¯Ë´ ™Ž™¡ÕQšt©ƒ“7aò#XNëÅÍ÷�61×Úñº.Wµü¸‡h " –56P�NjU ,³°%Žñ¼¤¦eë‚�É›:tM)‰iòTWá@•ûà:m÷uŽÄ7s6·ôûŸ:&¥)ä…/¥¶»îUº”º"-Á$o¹KUn.VIˆëZVuQl ëU—T�§V±i®ÎP�lj¥gr¿Úuƒêš„áZ)í~ê uÄ!%ì™a¼:ÿQg@‹ëSW좬ÂêR%íIåÎR›—>ó:¥¡*s—þºÜê*�P¹6—¼ ‰rÉ]U3Œª3Î|€&š)–ÁT.®ë´5ÏÔŸ}ðØ<·ÈAuD¹3«aEÜg9Øñw^ÈÚ—GÌSÞ™­hso²y�Ǭ*_zRŠÃ†ÈþYÎu*¥$…¤Úv+•CoÞd6»íÒ4—÷(û¿ �îÌaIm¹IÛ©ƒHiCþ­¡E—Õ)BÖ| AP¤…×⾪¼Â¥?×2VͺéÑ|bŒßÏF f)�ÔéÍ.m……qq1‹N:#sÍ>£ k˜‡ªìËåtPrS\Õ<ƒi8�;Ó¸<ûY¼ÝfdiÙU.*AiœÍœM5”þ{*vÝøFs²’‡�B .x©Èœ'Ä»©0ì5D`Âé”òo³Ã¨‹žgÒÏ!Al?]ÅñŽj¤\"_Ê-Z>’Í”ò©" >!Q)Â.óÙ=Ø EË¿=;¶¢5ÏöœýU  õ‚’¥Œ$o–pÎóc†ó¿¶LŸEô¥#ÌËh9¡tÑEU)îK¢,Ù<ÂJJž¦q>òRüv)%–„PJ«h=sùâ:hUÞJ":Å ]äÁÞulj©~ñÞ-^ÄâÕ©Îå{Z fª«W¡ÕùM˜/ãîÍS˜ ("Â·Ï P˜ç+Vuö%˜ª®L5æÈ#ýêÆ/­y±V¦­˜iBÙý2*Ò™KtIDAT™Õߊ˜Ø«ÂÒ¼’£œ«ôB{ØÅ}€*.xi`%�ò["m3£š½C Õ¶cµÓÇÕÐjÏz¡ÂÛ °üPÈÎ¦í´›ezµSÛ<"…¾*)Xe¬š‰*Z1!D67Wm¼—f!3§Uœ9/U~ª#–PϯJQ~õ¤0c,+yU«Éu=ç*»†Ö'ɦ´�º‰wÃÌNõ·¹Ã(Y«jÑ©þ)5Š…-ö©V½*¥ùÐ!ÊJ ˆ}wΰP•Õ»¾ˆU 5Ñ´ÖJÚ^…¶~¨M@ó˪-‘ÁÞÁO³HŒö‘0£«™n•F¨I1á:ÌP±Ok®y>WÍç¿}/²_„ôsÈêØ¤PÍtg^ß’Š ì“Í rÝÏþ:Ö±‡Ì`ÐÒe•:»‹ƒKt�†Ú™ùpëÐÍu‘iÃóÑFšEwUg›ŠMÚ¬É?³^ª_ÕÓºZ¤¡W¡©>ÕÔµ\au”-×%5‘›Ö&+9¬ ƒ.¼æñ`�b„v^d6~©¢=SÇFZבҢûª@C\×òÕÆOÐBº§¿¢«æ5¹¾ÚNÀ§´äU%Z.â æ%EÄAÑP¨>eT73úˆÍ ”‰›«hâ 2ŠP—ñ›ï7sq¨z_iKA:Ã"p@*•&Ìuð:uá:íáÒ2•È“‹™M]ŠWwòU¿¢�81×Ö ó(uæ¦.g¬óFZŒT„Rêz P¯°b𬧡P u=§ê|Oõ¬ë\EUšöNDV'ùëˆ8µ…‹‰äÌ'¹Ú2ÉÞÏAtu¥í&:ÞÚXd_ÖJ˜�³¬Õpªñ)¸îžùßBú²ßÙþg¹6X‰†¸ð"‘p1¿4+íV“uƒ(A«¹u\~ÓÊj ç^åÏ%à$Iò@¾øÇu1x‰ö¼”ÙÔÕÊŠo­IµHW­Z”N wTEÚüb¾Uô«E”m—l •Ð_3kôf[SlDWïQCêm@JŸuÚæÊi¾Y9­¬‡_ĬmÑ©`%�R­z�ês^ á‹·¢vV;“XÇ@Œ¯‹Á¨º¶¥øivù[çWä³×|½ ÑßNÌþ·Ðh¹¾êâ>º÷€´RI3�n]ð§q*°Ë‚ª�h·a„E¾T˜a ‰9a0ó è†íãÌz*°wœ›1;’¥—”�qìåÃ%¥ù•j¿¤znEV­ÿh÷Sr6%)À4MÓ4-ʨTóJ©eYEô3BÛ„}\Š…bþâ Œ¡ˆPÀD!@FµwLqx"?…�P v~(¾2gž±¸”\J±3âSGÿœëµd/´­Ì޲ý÷“¡‰²ßÌþ²Z®$„ˆ‚m�Œ·ßÙáa¬kf–®W>ë£Õƒ‚òM)EÎÚc°hîL”Ì·B¤\ ™ Ã`¨í äïG…Š�¢�"z)q¾B0ň ÀJ"%Q>¦Sz̲Œ§˜<íÆ4B ¥òW¶æ ;%„‚ d3Æ�lþ ‚w¦8FUçcrëS1)¶+êlG‰$#”¾bÏðüÞñ”rßKÉ\‹0?˜Ý|t‡N±ÚJ©ân‹ÿ,î#¼- T¡FÝ›�m)„ñ.·ŠŽç,Ÿ†ÉIT¹Ü5nU>ùÜŽ Q>‡¤%æÑ‚TwC«�ÕÈl %´(pµ-m'Eö¥E>ÊìF-…S¥ø»È—‘ËÕ%ßuýH-ÅgÚÞ 8.>T¥A³^M‘�µøWÕ¸–Ûxf·~VÿDË?vÞ:–b(À‘Í\ËPá +.ZµXE ˜¹„«·ýÆÅM bZ&žº*\•AK‹>0DFæ1£OEᢺ“’.N,¢nÍ�…æíÿk ⪠ƒrµ_¸y~ØÙÐûîþwæµZâ¥ñˆæ‘¥¾H]=¶ þ­8X*ý-´÷w+5£!uã#Zï«}ê û†ö§ T��ö8Q]>½Gí±`*sq\óºžúOu¢¢(Тkc4#ÅYµìkÈqgææ=\_Y¬ »T¯Ûû½rOÉ ÉÝ7+%—|¬§ÚS©Ø*gŠñu&ò¸'MØX× ­;ý™òzM•áØ¬€ë�s4‰I©öÞ±0{άi�4òê0KgÈ ¯¡O­*ÓZgSJ „uûªÏd8ÔÆÐ¸*º^wŸU­F öP—‚hgY h¢ÒJÕ¡VJ€ÔRhP{“íí+Ô‘$–k2€fVëֶŠa3g©MªÌM˜rêÖªÚs‹"ÔëÄ™ûXud£Ú[*Du=m¨çéÚ¯³ÑÞ¥uÌ ãò©Æ¿mÍÚ^]MÏ6ïÀCE髸\ä( C£¸.žÓÇ…€B'ÌòS†E~ö‘AÃÃÛ“ êÖ³¹÷ªCœÁ]Z^múß`IÌù¢¶BÐÐî=›"gó(vÛîU¦É¥sôWõ+U˜D‰zZK-\5FÅ!€<$,Ry—B¹âêWáui]ñ¾ÉÏz¦•¯&X×ñÚ—ƒ1…ŠÎ[‹þ*Šhyk >¦ZÃ,Ùhs•I;UÚ¤S¢U’˜)×;sV½ço‘D¸vð¥tÃW{*ÕÇ¡èìKÌßÕ@u {/¹z‰t½˜úh3æ&b‚u�zƒ°ÇÌdâ9,íF†µÑt¦ 0³±‘õN0Ú k制—:·c…q“Òˆ’Ao©!Ì¡¤1šÛ™ŒçÐ �§ègÌù¨¦h£%g…T·XÂ+2 h•½«�^{å¾óòW†¼Îy½ª5ÍlÏBÆ¥4û>P|€sn|Œ1c¬8Ž1Æ@@"%@€•Ú–~�\) RR)‘ÓÈæ_í”B•"£L颖ÜpÁñ`„Æ´þ#•ÍÔ>V”©ÞÊUÝ”"¤µ*ñ’Ã(ŠÇ™¹ù¢æMÓÞ‚¹tJ^êÍïûƒ˜ßEišÑÌE�œÒíW7•&;µÒñ׵ߊ'(v¶ìL‹õÅ¿ÂÈÒäÓbÏãC01@ŒÌEª|eò‡3;¶ü†ÌŽ$»áAǯ®q;–Q åãuÙs5RÑ27× /WQ¹%}³º^BñDê˜ Jæ%Ÿ_)Ë&!œ«˜XÏsëÌ(ËÈj…ÙâdBÚ Dq ór±=Ç¢„fž÷zK×=¿Ðiš !òSÈ®{YàGɺzrq>¯ZxÝÄX‰øªÚS¯=ÚûDʼð£p�Û©«ù6É@«—¼¬À¬ÃõÏü.­ï-Ù÷:3QÅ*h¿¢8h2³_W[О24 \©+Ó•£§ú–ÆLèêL(§�ÃÊ\Í«¦bÕ¿ÒvìÖK·Sé¢T•ß fŒ«î|ñÞ­�B¶�Uˆ—"³DÕ¤DÛx«ƒ8–î-wg•©j$µôûZWÖíO“˜¦¼¹ÃÚ[ŠýM 3Ð%뀪˜nB»\ZŠbMµ t™î¬R„eQ/<å©"⯣áq½­õkBŽ^.ûï+ýÑz°&ˆ¦j¼©eC3xh³o˜%y[É,Ñ´ÕA›êP€Í‹MpG¦É²�hF*Õ„¦õ f1›&�EÉæjiif:=U¢Î9ÍìðÚ¡%¡…ºÕõWʈÒÒ|I=ª§¡i.²• bëƒ÷R?溿t¿%YÃ;å‚'˜&jKö2#è)³ö~²äQfòá×ñbÕÍýhGvÌ]úºr^Ú*Y-@Æ X0‘¿™—øJ¤Õ™ym:U¤Ó¨¶÷Ûnmh€J�•Ò4eðWË‘nÊ›Ïk;Ù+—iè A ѦRªyFREí#eA´3ù3­Y—)2•,e)¡ÅJϵ6Ÿ)LiÈ<š„FiH²Óõ©A÷›ÑÀæÛ´©åU,Þ™5¥ Œ†ñ”¶¶^¥Â,:gíÈžÖFå«aï>¯ 2f˜£šˆöÌX4Çÿª�RK&»n€y¦›)ÝýÏ‚¥ÎR7Áì™ÕÎëfëûº‹bè%ä�m&mæÕ®–¿rZ­ë/XÕ$Ù©Íëû¢™?ï_%µ´í%Ç£í&ögVGµu]³°Þ®á-ˆÏ_7ºçúfÝê¸g>•9®Šs޵éXµ·¶/Z…:•{­•4„EÚ{´.Ù/�pVÅóFV‰¡ËL(¢q´‡Tw·5¿ºuu¿j§ºÔ”jèqë¢æaˆ6–¬Fa¯S\ä™Î �®µæ¥VD‰²[Ô}]�о ÙÅ.úž° é£ ƒ*¶¡S ÆÁ ë¸”šûp/åÔu‹ÂUßo"¥º'CÍÑ{cÁºâ˜Ö[—è³´Ö°˜X˜ øuŠZëQ�žIŠ³Í¦ˆðžfR%¥›9�<£:× Ôl('˜ßÜí©hy2êÊÍÝÑ©£4o8—®MiW £{«šœŠ¶†n¨!Î"DÚNv¤ ·_Õ4§á¥g»@C)K/TB©ÇwW ¾uE§ºÊRêWRËnµZÙüv¯Û“R¶¼–Rʱ�4M³«î8N&X™Ož+¥@ájí¸þ"Ê‚—{fªÛ³ßTºI=×\ ®‰Ú‘‘:E-7„öxJt>U¼²÷UJ 貺û$ëÁX�«ÃCÅ ©T©Óè¿�n¦½F|Z£©šáÓº`± uJÉmWé5·˜xí@7µ=²eh”‡"+üèu-ô:äg‰û:ú€ýÁÚ±-¨gõÖ5Íøí%À3a!M\‹¹<½¯¶°ágJ(´£ŽJZ B+•#ª»-&•Ú{¥9Ë>oYÖ“§Ÿ\__�“øOþäOV¯­vÚPXpG)¨mÙZJ,$ó(UÏ‘yå™aµãDEîW¶C4¥ ™¿ÛïhY5¶RKáLäEó¦ŽÙH #P?¥¯•?©ÓÔÊ #%}mÏF+_mÎ šp+U=P�²m‚ º¿¦‹zÐMUÁ¾JËXÊÀ®£_Õ$€Èë‡uØÜ¬œU½pææ«ò {Ró|·vµ¹Áœ9D5S`$©3$²ZXgÀëžzÃØµÞÄPFÏüÙœâ4ϼêêiÅù’jÙ\”«{Kê�U A P2.Ú¥7p¥`Œ·¶¶Â0tçá‡æœGQ¤!(¥I’d fÕ"•¶V®kóŠ=WÉg“ð6àj±juº5ûÂGÊ¡uŒ†³æºb)ƒ)Þ{up,-�@5¼0GNq¤b/ªÔà5Ë©U{*Õ‚aÉlem•jÆVJgš ô¨XõÒJ‹Îäo%˜h8¾öÎub„ÍÑ Ô�X›K¸ ƒ'm…£ŽÕØÜ‰ÐŽ“櫊××ôki¥öÈ 7t'ÏF<ª´RM†Åöž*½²F´–CL8ïÜÛMìbO;›ÕÞýuÄÃu)dC*qÈWw•ýàØN’$q?ðÀã4M¿äK¾dyy9 #J)cÛ³µ™SI’DüØÆMÔ,þŽÍò’íˆUìëâC³ÍPƒV5JÚÍùSµý•&4bM pÚaØ"0¡4úPE˘#�Yà¤ùS›Ö�fµ:TzGÛˆ*‰Ï”hÓ^/ƒ±nì®Wš߇m²új7¨dyÌ!“2šÁ¦ƒ‘óI[™¬ë&Ö/ ,‹†2L79óÁß�k›#;Í…¶}97sç§É µþdf5ù wC ¢:„XM·µÐÃÒÒ•ô%ó_aKKKI’ŒÇã»îºË¶ìŒ†Ö²Ø`0TJ%I’ç+å ÉFFíº–&S÷f8ród¢lÖ�1–èàÌsÚ¢v©3YGš[ê|4̽ vAÛ07” ëîs3×@@¼·«�E­£ù1¯´hlC¹ø:J†™¶&åVíJî +3ôÚÞ£-Égä¥Â²m¤5ûà0»íP9ÔvéÕ\ woµw¢�˜)9Ñœ.oæé7r* Ùp~eñÁ®–­êjui�6Ü0°{&ð«x{Æu¯¶nõOЇ”Ã[«ÁBé±É¾‚RšõáÓ4=zô¨ã8Sší'IÒÕÕÕ Â[¢[† Û�ö樢àªú æÁ4ƒ ºŽ`¢„Þ)þy�ÖNó¤¹Úl/Ži¬®ÖEˆjñá¬{€µÏs]0¾q¾7ëÕ–s§«=ÙÆT?l±3}R‚0T�à% µjRÞD²yÙ¼nèµ O‰0ÍPÎd˜·it"óy°y¡µ.–2ÜZf°è̩ՙ=�’ÁɨS40Fà‰!ª0ÛÏx)iÊURjëeõšue¢ÒežélªO²Û#fJJȧ4JÚ!¥Y“ªÞÉNíHÔ©Xæ{Ëæ ²i˜Òþs³•¸ *ƈ‚ÂÙ3Œ¨ $…y*“˜# YžQÛuZQÛ¶.^¼–E£(Ê0`qg_gYVÆ”Z (BDE)MÓ4I’ìc–e%i”•¹”RHšˆì[!RÊ ]6�²™�4M³•IÓXJÎˤf<•L@pŨ�½“�W<•”X<•ÁLK„SÊð´’næWm¤œ#&2³’/»A“´d°Šú¥‡ªØ3+‰È很­ËÀ´ôÉEoWêÿi¥ýŠ !„Zœf¨ªå�jvÓ€�Û„üu°ì¬Í�l–hñ2ɯÒu4 ™nXí<ì%Ú í`,T×Kcu3j3…¤Š,!ÛëP�άK&J½"( ˆ”æ�Ô^õ¿ìÏ«Áe¶eoæ¿­Š³Çxµýó<€ÈÍuIÝ#_çâ’}>³]¥^`|œ?ÅÕç7‡®l•�Û¯¢S)ù®ü” Þ:ísß{fýºIæU�Öû4éðÞ¬öiJ·Hž”ªí™hXž¯/g•1æ8Ž”Òu]ß÷…I’„a˜$é`08~üøÖÖ°Õòâ8F9Ž“$ ÄqÚívÆãq†ë´[Q”´ZJ­$I:�NLjÀù¶‡`ŒQB³ËuÝ$I(¡úЇ6771Æžç)¥‚ hyÎåx<¶,Ës=!„eYBDZlÛÎý–em�;¹®†¡mÛI’¤ijYV–Wí·€ÙIX"¨¯FXud6 »âÚ9ÿÆ"l½ØtÙ/rA[F×>PÅ,$×kÑZ[-º½Êùa–º)-Åöm_¨)5€(6`Ì5ó*ž¢ÿ•RÏbý #Î$V7ƒqëZe•½C—Ѐ)±š‘kõ ´ ·A÷ÁpÏä4dØ ¹N@§‡»ýtT÷hÎ'ª«PG[[£¬ƒØšM¼V­¯]½.³Ö–Ì¥›™dþ¥ì8+³ŒÇã,W°m;›ãíõ:§N�Z^^fŒµZ­$I“$ ‚€1VR¤eYÀ›L}!”ã(…Â0À¶íZ–ÃËS¨ ²:[†ý~ÿ}ïßâââÑ#G£( Ã0óÙÐe¯ÛB ‡cÆX’$Ù㜦i6Rƒzì±'®\¹bÛ,Ëx8ç­–›¼aB›æú@]­ÆÝi¾™ÅƒëP¡Jsm¯î:ø3ª¨ÄÆ™bm?<Ëçª.0¯üTÑäuy@�'ÖvÎgÎ ˜á _»3—£Ôfå™dçûÅú^Mb”™È-ƒòL<ú̘ êÇ�®{¥(Š¥xízâR}IËé43ÚÒvÍ:9̇Òöp¢hh�‹Ñ­¯*ÌT^3ìZU¶½NhY[ÀMÓ4Ë?²”¥(CYÊ«òð‡1–­U†”RDZ.\¸tùòå“'oÌöfY¬ßïÚ¶†aVÝr;ŽcÎ9c$Š¢V«Õí¶ c¥�ʱ-„P†Y¥Ë²¬ìÛ-faŒ[^ËŸ†ãÑôù¼�s™&¢åµ,渎›Ä\ à\̺Ýnv3d_JÉR„Й3gVWW…Pï~÷»§Ó©m³ÉÄÇû�ïyžÖdkGšä”uE0m÷þ:æBêœA5=-–eJ±¿ÁghápÕ2`){(!­óG©aj>så«“ØZ§R~)M×WÝC�àY Í€äîÌåäS&€9âÔv´RMJ/†àjTn ¡Õ~G;šða陼¤›¯Cæ6<·û=Ž&§]òóu9osªöŠ„É …�†õ–:¬^‘Fí•U7DŽU\µbžsXeu˲Ò4å\ž9sæå/eq)c:™I"…PÓ$áŽãI)\×vk}}]JH¾±>t—Q+S/ŸLà ˆ\×Ë2‰Ü7„Q˜ÒÇ?þñÛn»�B)¶m;"¥”ï‡Ýn[)E)Žãx:�rÎÛm/IB¥d:�¶ÛÞxrêÔ)Ë¢Ýn듟üä;ßùÎ_ÿõ_ϳ²ZÓùóç³¢Öââb¿×朷Z­8N²ÜÈuX«åZ–•¦Ü²„ç!E ny­Ó§ŸšL&wÞy;¥ôÊ••ÕÕUp][JÉ9xž÷®wýÑã�ŸêvÛÓéô¯þêýçÎ�£”&IÊKSÁ{á _˜$ÉâââñãÇ¥”Žc ‡ÃápÅ‘çz9GÙ¾x� W­ŽCa_À°:xL�1*vª‹?4�­ó¥y,m~_Ǻ{Çlõ9DMo©J=R-Íi#kmJ¤m¬jy©ÍWP[¢©›$­+. D3g fÆužU;f?SÑkOïa/xÕÜM˜922“¶ Nª >¶Ô12 ` lþpšŒA:¢ ÇF�ÚàÎΡ0ð¸MÁ«Ò‚ÄöU¼nSÔáÊ«OèØrto^NÉ;«}¹®‹òýðé§Ÿ~ÿûßÿÍßüÍçÎ�‹ãôá‡yâ‰'¾ê«¾êðáÃ�>úh$¡w¾ó�ïÿû¥””’K—.ýîïýáïýÞïI))¥£ñÐ÷ýK—W®^]ulš}oÖ6ÏÀul!ÔÊÊÊ _øÂ(JΞ=ûàƒþÖoýÖ™3g„Pïz×»Ò”_ºtukkë¶Ûn;sæìoÿö;?üᯭ­a¼�W1F,ËZ^^VJ=z„1�^ÏqƘøȤʘTW�iâ×zô±O¾þ ¯=yò˜ï�îºë¶¿ø‹?�N‡·Þz²Óqo½õfµ3Á—mŽãÀÊÊ•Ñxðê×|6É3gO¿ù«¿Bªäì¹3/xá}gÏ�‰ÿÃùëÏ~ÕKæ}ü#ÿøë¿æÍ_ý7Ýz‚+�(JÇ ;-3œÊT"ÉÆó˜+Î�ÒH!Ä¥TaJ!@ä£@Jq)¹”™u”1uöCö¾P*»Þ¢†,ßâ8.êr–ˆK­'¨}l?™Ü…T U¦Š�e?dÀüL6c÷W…☶Ñ]Wy(•ªa{©/R¥ŠÊS(˲2RŸ}W ÊÆV´²i¥aá’Ø†¶®U¼.yí7³%á í,gé’e˜3x�¡ìáÐöØMÑÀ)¥WJ¢l+Ÿúµ½°“gáû>DI% %IÂyÇ\J„I"E”$aGI"¸”aÆi#¤¢(�œ'Œ’( 0†$ 2×8Ó4F+”P2Œ£LÝ Â¥H'”F³ä&·4&XBU™'Þ yvþ~În^¼Ù´ƒ¥ÚªÏŒSX*„UV;ÂX‘ÝL%g…ß;»§øÞ/ÈWÎyZ+Þî¥á b2‘Û¸:8„!8­–üÌó3YŠ\�[WZq”ºº_]4AÉ‚”â3œõYg%Š¢¯ùš·Ù—}ÙÞð†½èEAÜsÏ=·Ývçü�o|ã™3gÎ�;—¥þð‡{ü±ápxôèÑ���÷¼ç=<ð!$Š¢×¾öµËKË+++G� †žç¹®›]Jð`0¸xñâ}÷Ý—ELa~üãßûÞ÷Ò—¾4MÓ���S§N½æ5¯9yòdš¦�Nçá‡~ì±Çy䑳gÏjC`m‘°.ÎÒ~¬n¸½IÙJ{?¯iiîÕPŽPF!ç&(d3BÒ\¬¿nEÎ’Èá…ª ˆªíokl3 nu‘isÉŒêa7éITflB „1NÒ$+ XÌjµZc×q)¥qg˜û¬®°5Ø©²±­L­‹sÞv=�R)$%¸n !bÛnÅíV7I8cvµ÷¼v6%¦”Ê ’žë•œ1¼Îþh«ëב¯–"«¹¦AT;RbHµ€œ¹“LǤˆ)>´B—?J]å¡èl«•ŠºÇÒPïjRŒ6O6TÇbÀ(ñTšÞ¯Ä•MåŠÊ’yú•åFUË›½óªW½êØ 7v:�lb‘râĉ»ï¾ûÖ[o½ûî»»ÝîáÇ_ò’—ÜrË- ½^ïöÛo¿ë®»î¸ãŽÛo»Ý÷ý×½îu7Þxã©'O=z´ÝnÏÍõ³Û]JiÛvÊÌÏÏÏÏÏg�³¿øÅ7Üpë_ýê¥Å%Û²Ÿ÷¼ç½ãïXZZ ”Ò»ï¾ûøñãq·Z­N§S4RyjœÉΩÖÐKöÅlµÍ,„†y¸dL§¹"Q×,5TPëPòuÝf­Ç-p‹RuÚå2|…¹z3s´`f7ÛP`4 ´­…&´ÇÅËÇ9Ïæ…mË‚ I‚Iš¦Y®#¥ ‚ +<0Êúý~6¹œ5;ÇãqËuã$β@)%F8C.¦OJ¡$Ùa!‘#ʨ-¥ÌuɸàYš˜3̼÷ê”;öˈ… ü™èjg¾¹IQ™Ûý|oÉ ä*Z°ó³ÊYEL•´Z‹“¨¥f�– ¬.«zˆ†¸ º®{MûQ”€ËÚgÛ`f½�Ü g?ÄqlÛV–©PjaLÇ“qEJ†­V+Š_fµû>û�$Ð c!Ãò€´ 36Æîvw™û𯊎Šÿ‘QÍXõ`w—«23®ÿñ; ¥.áñk2´ã666677A-®hùð0'Ó ¼ks«(ŠÃÃÃÓ§OMŽÚ¶Ý?Ø?}êtÈЋ¢ØÚÜÒZÉÆ"a?‘PýµÎþØå u×2—\«âJ .ÈêOÜ7®å7!¨>CãGDY}è÷rÆÿ[bA’’BV{#n—®ë¾ýöÛÏ>ûl2™œ9sæÉ'Ÿ¬ªjÞÌ¿þúë7niÑÙl¶³½sttÔ¶­·öÃ?¬ªêµ×^ûã…?>ûì³P]ØÚÚ˜N§£®su]ïînÓp®@Ím4«¤ºªA‡"È*Æ0¬Ï-ô´rÒ_2�-gòÓ ^ãŒc•bï½âKŠárÃ5ZBº2Éæ‚µÚ  )Æp2°Þu›ôH8“@l°4Áq‹ì¦ðàî.Ì,䨿ó9dZëª*ÂapxxmÃãC¸þÁ`0™L´ÖÓétscÓ97›ÍÚ¶½}ûöx<†î|>‡| ¿J©%¶xñ]pÀ2™7ó»wûåÖ/aöùê¤]O&ÎB éóþd¶Í…Z“0éIÒn&¾¹W¤½·£¥.ѱÖ°Ph­ªª®k8WH°;Ç�WÐÉ9×ZË‚e€ÜÚ±a_²ÎNgÓëׯ_¿~ÝZ»···¿¿pp0=:úŸ�>úåÆ�§/\˜M&Ê9åÜ ªnþrswgwPUo¿ýöÖÖÖ Ï¿P•Õl>ƒ8¯iº«WÿöÎ;ï\»ö�&“YY–·nÝÚß?¨êœ¹�ï:ÛÝÙ¿3 "ñZ*Ï?âÄ�z�̳O$S®ëƒ�PWz*+ ,ú¦XŠU™ÅãÅÁî]¼¹91# C!+_�éÄäšÇI"�),Wµª�JâŽpî’ü¸/é„6´ÿ(»‹)Ûvó�gÀt\lUUóùÜ{=o†:FÓ4Aºª´�^@F©Ã`0¨ª *c››ûû�ÂÞsÏ=ãÑp>Ÿ—e9�àü€þÊh4šÏçP燓Éd<Ïf3xDPºÜßßß»g¢<@È($Q çr:Ÿƒ†ZW^E>3Hõ{Á•Üâs¾:ç°Ìù¨œôˆ4!ŽõÌÁF×ó®À¸ý‹ÕÆ2;öB²žó!™h±ž—¡ã:OaŠ~øáÓO?­ëúOÏýi<ùå—÷Þ{ïÝ»wG£ÑK/½RxŬëú_ö~7�}óÍ7»»»ÂüËýåÿþí`Pݸùóüç¿ôñOgGÎwÃa}ûέwß}÷ûï¿ÿüóÏ¿ùûW°¾€#üÅ_|ðÁ°›¶ �`Rö�- W´* :‹äåÊò!GZÇS”“²OJ±¤µ ô�!z�3;2À  é@·NÐ÷p}àž{0„P”T°Šœd9~X1.Ãü£¬@6\Ç>+Ð`óÞ³aœ&ðU˜`iŒQڙ•¥.Šš‡±WGY–Öêº/ŸƒÒºÐªR¾®Ê�³ àö¶óu5tVu­3º;–Ù´qVÁ)>™N@?N…ù|>§³y0!VÇÄþ²sJUY×ÖûÖZe ñ•1ÌBÉp<>šMÛ¥"YŒ�~Š1c�SCØø‚úYøŠƒ˜8Ú K B÷‚£[s5ÕØŽ"®'„¯$÷ QÑbOïl’ ãïÂi:ÞÜcɤ’ ocøí�$~bZ…­áÐ,(©�N»,M�7ɉ‡>6üÀ[PÂoSÈA5f¡á[SJ}õõWo¾ùæO<ñÌ3ÏXg½ò—/_>ûèÙétúðÃoom�F£¿^ùëíÛ·«²êºn2�”eyçÎ� .h­Ç£ñ¥K—®þís¯üwß}÷òË/¿ñÆ—/_~ðÁoþró­·Þš7G£qµ½³yöìÙ²(úé§÷Þ{ïçŸ~úé§÷÷÷¯\¹X«³Ù Šq Ó�ËcÂ# r´¡È™yÊ’�ð¸Ç¡«’©•aðó²,M¡¼²Öµ^YïasÓ+Ë•#}Œ6U@ó+¡+Î*Ôª¬Y7L èKÂ#Áúqñ# c®uå4’vQ|žõ6‡)åxè“»ŽÑe@®®pdâjxü|Ôª«`N@N>Î 5Þ§bß%*apÜi2DdE¸ì0.¨®• q^ Éã¸ÙfŒB6º0$TþÞL‡°ÊdºôÖÍ9à–Üæ4êq—Ÿqrt%Òç£÷zyä‘×_ýüùóPC÷{ÿý÷ïîî¶];™L@$©íZȼõÀ9wõêÕ¦iþqã¿þúëùóçoݺYUÅ�?þß�?+åšf¦µì±G_}õÕíííÉäp{{ØcP^¾víZY– Ùº¿¿¯•®ëúàà€CN÷6ðFjC…k=�@ ®ÙŒ] ’+‰6ðõÕļ©ôìU`h,xÅÔE�÷L®[Ψ uCµ)‡È˜œ¶Yãæ2Jrõ É ‰~IŽ=­µVÔâ gH³Ì�|>r oÙÉ ÀÝ9’I†ÌçÀø@ÁþšcÌ ˜÷“5{I˜ŸŒk0—�±·?¸e‚bEÙS®ßÓ +àTos¸Y9CoÓ^ØÙ# œˆ9’Žc\°—{-ñ—–eùû‡lkmÛ¶`³³½³`AŽF�=öØÞÞ^Û¶P­:<:|þßž¿ï¾û®\¹òã�?^»víܹs§Oï>óÌ¿Þ{ï™ÉäÐÚ¶(ôx<üóŸ_¨Ê¢ëšÁ úøã�G£Áã�?~ñâÅ÷ßÿ“O>¹xñ"`ñÏüîÌÁÝçÜÎöN>qJn‰qõ(œ�“ÿ¤àÔ[ì’O¯ä;& ôEÂÑ’³HÈV<'‚$÷$I! œÅ&Ød’ÔÖŠû¨G¥MÞhUÄ{ý²´â¨ùDJÇÈ+’$”·q3 ãî0~šÜ£IœR¦bR/VD¦•(Þ$ ª‚ ©…ŠÉÑÄ¢ÔIù׊\B¡í/¸�¸++´grþN¢W9 ]JJIÊ>í9…~nbÈ›`(€w¶§"@KBcÒ+ '£á¨0 e©¦i676góÙÎÿá¹çž;wîÜSO=¥”:::šN§�>òèC=šÇF›Îµ§N�zñ…_|ñÅx ®ê­Í­K—.½òÊ+{{{uUß¾}ûhr´½µíœkÚ&Sop­>·RâQà6ŠLP!k�(ÌÇí¢L´W”ÔO“»Mr7®ñš.\+UõIßüF®C’âÉï�cAÞ@ë¤|iPxpžƒi╤œ2–èÈ„ñ�›5A¡_šDU‚�„Êp¾!µ«¹–¦°±öÒVøwŠs(/rø’A$3‰LfÙûLÆN¶›”3B9·ˆËÝBŸ+2R¹7‹âDAãOœ¼skkëX0É`Ú Xïý¼™Ïæ³´µ] ¬¯A=��­Í-Pσ–>ÐS¬³]k‹¢OÕá`¸°ßÙ.ˆæÍüÔ©SƒÁÀyØ<ÁÛ”óõÁ´ë´B²ß’’_d““¦Ä ã½'__DÊ’ &©x?�̱ñDÉG�$S ÷fäU—“©�`áµBÙåS™ÕóI+ÛºŽ¤û‰ž�Ìê�ÃäXu'XL%¸‚~Y–Á> ¸ Äš˜pµñ5 J\àI®ƒŸ©Í•ƒ-ÎÉ_¹d'\]­ïâ#gºkAE{Kyj�ËÃòPqOøL/ú.¯…yÜ*9Õóè[\×D*´¾ëš®kœë´öÎuM;«ë²4…Qº4E]V…6uY¥g“©ëì|:«Š²Ð¦k[×ÙAU+çgóf2™M¦ «”ÙÙ>5Ÿ·Î©ù¼­ªAYÔMÛíl(Š…˜…6Q̧P$çÉ—¦ iŽ%xÕ$JTXË1¯„¿Hž=F-)$Ü$%ºgV¿, M¾8†÷ÈaŽDâm4‰}Ù¨}›œ)Î-H®Ø‚Å \[yÓK°èí0cõ=Á¸B˜ø¬ê-˜r=.=êõ讓‘ËМ w>üŸ“ZxÂ8Ø «Î2®rÉ›,Ž ¹]蹑ËqÉfØa#�ñ²²:½ü]'VTLfàp0„ü ,KÌwΦÀH貄½”�J$¿F£‘ÑõÖæN]�»ViU•Åp>·F×ãÑf]�m§­³eYZgAZ N”¢(š¶ÐW“ýîafZ�%Ð>\¤P|ø Ï¡c ×eèì�m2“såx[á-?uTI ÷$˜*¦¹`(K\þ ¥§„q"d轂EraŸ‚¸1(ð³.ÊÅy ÒÎZieÉ™p6'ë6¾Á@TŒŸdxþ d6“K!”Ss¼½ŽmÜiÍÕ<±D¼b$sŠ?ÜÑ›”û M–,*ÁõzÁf½š¸P–Y¹’ÛW¤ö¾g¼Ól.9RœôŸ¼ä È"moþÇÅ@MÛxïË¢¬ªÊ: äè² ªRð £Ñèððp2™5€ŒƒØlÖµ­-Ëz>o‹¢lšÎ˜r>·]ç†Ãºk]ÛØ¶m�& ê,Óé´iš²(—Ÿ0˦&ûî8p³GŸ‰F_ïcàJ©B•n Þ,Ñ_K»ˆD¨øx–,ý-:çÚ%耕~˜‘pécr/ÜØª!àºј^Þkk½ÖEYÖEQ-íL©WàŠ¸b#صÆÅŸ˜‹°@X/b ir ³¤¤\]Æ& ð2úXc9@aqðï­s�Rε°±á·K`*Èy¦ç¢×Úï�wÚ9íàïÞx«lç»Æ6VY«lëÚÖµ�sx3ŠÛ<ø¾‚±ÄréúøªBÝàøŽ¼ÕÞÆž:ð‚*hUÚ{×uʹP23J ª Þ ï�ÿ ï„ÿÕ·Ò˜ª( ­�Ø ¿M å!c€ÙSÑ…JÇò¨ªº,ÃoÉ�?Þa“�À†%ØÅ$vR >4pwÇûZ¿IG0Y °0ÄIáTK¢~l¹b‹0"X‚:xxÄ ±Ô¨ÅO)©{+Úq±Ÿ€›l@üRÊtÖÁ6RµöF9 2H�µ¸Æ£q]VñY4H´«j=Jw£qå|;W¦pU­«Zw¶+J]”:E ›_×õ`0hÚ… $ü6 [Ã3Œ7ÏdZ†¹A‘8¼ƒñM¸qe,N¸C—Êe{• ˆ³XŽ7U]! ç bä&žƒžB�83ÀŽ@ñ3"�%9H5Ùà%Ãs®Ñ"0C=eR-DXB/‡L³°G‹­È¨’¥RY#(ɩÖÄaÃp;-X*pEÅ^)ܤa“�Í‹#>œô†ö‚¸$—@�èÇ$㌡óòg&�¿&³"½ò!ˆÌ›ÿpÞYÉ£ÃRI™Z€*È�R®HÆ‹Swíå‘&¡1y+ÉÀräÆ1êW80?�Ã`yÿ¤�TJDLò�8"Éɘ“2Y �›9&.�™:� ‰I4OMöùIJîa M¿ÌŽn/\U>08D,Ö)Â_Š¡V$flRºéÕâº&ÉO’>.®Íp<®€&(±Êc-( ‘Å8 '×ß[õ"5p“ìè¢d?§lhŠ¢*Š*”§Ü |øgR¶Š´FŽù"Æ”ŠRá4†A‘-îÄ�ÜØe3©k'JÁÍEPG†7éø€ß_þQ^¯¢¨Ê²êL�-qNYëc_2¤?îðf™žÅå "ú“è‚p2 ñ‰£T;™AÇHVR„-_†¸>ö�s@Ä‚àÞ�‘¯‰[Cx\ÁS'>“bMŒš# ßà¿„÷¨Uï`/'ë$¨Ùƒª`¸¶àp…Nç5æäb>J<ß`r’ÆñƒÂþ1$‰hxGK&d†�Jnï6©_ŸòNy¯U¢ctL¶ÓÊ)O¢'È'‰c�Øngl\.#ö/�'š ´K ÉIÚ[^‘m…X ‹ã®’<*Ä.í„1“66»&k�¤Ô‡ÜÒG`®�’•>ŒÁ*¿1Ó*QÝÀ¬ €�+#y‚ $ǪB§·/-D‚ÉŽ'¢ú$ÖŽÄhp«]åæ2`Ù¤+Á«rsd!‚S"åa%VÄÝ#¤ Æ%9E¢˜}’\$CCûÈHœtµÊ¼éŃ%s5„,‰r/F#'CZËÿ˜K¸É¼ô%ô… Es5®^úÞ·ãS'æ®Ê¨–äÚHË»dì ��‰¸œ‹ëÁÈŠßò¹Âé¶æ*¹O 1Xà –hL¾(þwòå, u�¼’Y}ö'µÏ„ü…ñÅ»jÎªŽ·c¢'í^e\jnœæC¨P"ÞRM§Ìa’ŵØaÄG!R¦ªSƒäIr‡…Â>.R,mÝ‹”‚ʦHˆÎñú"/kJŠXú_è^õ |�±fE &PnE‘ É™š£ï/Tx¹Ž1FsÅ@R=ERñ“¯\ñ�9)g$?Ö|ZCŒ"Ù„ éŸYÿÍ\ð™S“”2ó¼ý»¢¤Ocž %vÁ#–œ¸œLdbDMúIpý?ŽK+”ÔâLZh2á�"w%.éIžª%‰i>è$RäªÁ™Œa”±')îPrG/ M¼è|Ÿ£Wo–ãO£œ;]·Q¯D³ê|‰´Ä¶Í¤ú5ÉüÅyv w ƒ%äµäC`ð~u\ÍŠq2œú/õÃ…sgìß=áå\ç\~ë\gmkmë\ç½]Î$c­_ÒMº¤¢('¾Õ¹«±÷-x±€ëgQTÆ”Î)kµR¥÷…sÆ9ã}á},ñ¤–Æ+­÷60õà£z†ªÔõИX>ÀbÁ²4Ð@åúº$ š$syÊ.„°±°ÖÜcP‹NkeŒ‚ 6¼`tBK „0±ÍCQ^kpÓ ~ð“P� ¿]ü$š-ø’J´�גּÁ°gùQ^^N™Öúé¼�5]ç0h‚ <±€ËKÐ^§]¦,á:­÷Ê]žçOû t"aºÄ‘�`�N&^˜€ƒ†ﮜšØDÈ{o½³~I¿@˜4²¶³ ﬷N9_hShc”Vίx´,ÿ ù§Óƒ/8‰ºb³�xã¥ø¹q„Œ8î( !‡Ï_Áõ…Žýâ®½Š [ኢ€Õt�צ.wB`’Sü�1¡­ªª`‰‹Ì@ãZ ¸‡�@óá.`¸•ó¶í\gµW¥)ÀDîn<ž®³¶íº¦íšÖuV9o”¦Ð�€MæÿU!ÒvD ~À%tEXtdate:create2011-04-25T00:18:20-07:00ñ®8Ñ%tEXtdate:modify2011-04-25T00:18:20-07:00€ó€mtEXtjpeg:colorspace2,uUŸ tEXtjpeg:sampling-factor1x1,1x1,1x1é•üpIEND®B`‚soldair-node-qrcode-5d87b5f/examples/save.js000066400000000000000000000004151465424452300211160ustar00rootroot00000000000000const QRCode = require('../lib') const path = './tmp.png' QRCode.toFile(path, 'life of the party bros', { color: { dark: '#00F', // Blue modules light: '#0000' // Transparent background } }, function (err) { if (err) throw err console.log('saved.') }) soldair-node-qrcode-5d87b5f/examples/server.js000066400000000000000000000031541465424452300214710ustar00rootroot00000000000000const QRCode = require('../lib') const http = require('http') function testQRCode (req, res) { res.writeHead(200, { 'Content-Type': 'text/html' }) const jungleBook = "The moonlight was blocked out of the mouth of the cave, for Shere Khan's\n" + 'great square head and shoulders were thrust into the entrance. Tabaqui,\n' + 'behind him, was squeaking: "My lord, my lord, it went in here!"\n' + '\n' + '"Shere Khan does us great honor," said Father Wolf, but his eyes were\n' + 'very angry. "What does Shere Khan need?"\n' + '\n' + "\"My quarry. A man's cub went this way,\" said Shere Khan. \"Its parents\n" + 'have run off. Give it to me."\n' + '\n' + "Shere Khan had jumped at a woodcutter's campfire, as Father Wolf had\n" + 'said, and was furious from the pain of his burned feet. But Father Wolf\n' + 'knew that the mouth of the cave was too narrow for a tiger to come in\n' + "by. Even where he was, Shere Khan's shoulders and forepaws were cramped\n" + "for want of room, as a man's would be if he tried to fight in a barrel.\n" + '\n' + '"The Wolves are a free people," said Father Wolf. "They take orders from\n' + "the Head of the Pack, and not from any striped cattle-killer. The man's\n" + 'cub is ours--to kill if we choose."' // QRCode.QRCodeDraw.color.dark = '#d4d4d4'; QRCode.toDataURL(jungleBook, function (err, url) { if (err) console.log('error: ' + err) res.end("node-qrcode") }) } http.createServer(testQRCode).listen(3030) console.log('test server started on port 3030') soldair-node-qrcode-5d87b5f/examples/vendors/000077500000000000000000000000001465424452300213025ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/examples/vendors/excanvas/000077500000000000000000000000001465424452300231125ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/examples/vendors/excanvas/README000066400000000000000000000015371465424452300240000ustar00rootroot00000000000000ExplorerCanvas Copyright 2006 Google Inc. ------------------------------------------------------------------------------- DESCRIPTION Firefox, Safari and Opera 9 support the canvas tag to allow 2D command-based drawing operations. ExplorerCanvas brings the same functionality to Internet Explorer; web developers only need to include a single script tag in their existing canvas webpages to enable this support. ------------------------------------------------------------------------------- INSTALLATION Include the ExplorerCanvas tag in the same directory as your HTML files, and add the following code to your page, preferably in the tag. If you run into trouble, please look at the included example code to see how to best implement thissoldair-node-qrcode-5d87b5f/examples/vendors/excanvas/excanvas.compiled.js000066400000000000000000000261431465424452300270610ustar00rootroot00000000000000// Copyright 2006 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_|| b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d','","");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("g.x)g.x=e.x;if(h.y==null||e.yg.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_), z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l')}else a.push('');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("')}a.push("");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(), this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a, 0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager= M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})(); soldair-node-qrcode-5d87b5f/examples/vendors/excanvas/excanvas.js000066400000000000000000000646451465424452300252770ustar00rootroot00000000000000// Copyright 2006 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Known Issues: // // * Patterns are not implemented. // * Radial gradient are not implemented. The VML version of these look very // different from the canvas one. // * Clipping paths are not implemented. // * Coordsize. The width and height attribute have higher priority than the // width and height style values which isn't correct. // * Painting mode isn't implemented. // * Canvas width/height should is using content-box by default. IE in // Quirks mode will draw the canvas using border-box. Either change your // doctype to HTML5 // (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) // or use Box Sizing Behavior from WebFX // (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) // * Non uniform scaling does not correctly scale strokes. // * Optimize. There is always room for speed improvements. // Only add this code if we do not already have a canvas implementation if (!document.createElement('canvas').getContext) { (function() { // alias some functions to make (compiled) code shorter var m = Math; var mr = m.round; var ms = m.sin; var mc = m.cos; var abs = m.abs; var sqrt = m.sqrt; // this is used for sub pixel precision var Z = 10; var Z2 = Z / 2; /** * This funtion is assigned to the elements as element.getContext(). * @this {HTMLElement} * @return {CanvasRenderingContext2D_} */ function getContext() { return this.context_ || (this.context_ = new CanvasRenderingContext2D_(this)); } var slice = Array.prototype.slice; /** * Binds a function to an object. The returned function will always use the * passed in {@code obj} as {@code this}. * * Example: * * g = bind(f, obj, a, b) * g(c, d) // will do f.call(obj, a, b, c, d) * * @param {Function} f The function to bind the object to * @param {Object} obj The object that should act as this when the function * is called * @param {*} var_args Rest arguments that will be used as the initial * arguments when the function is called * @return {Function} A new function that has bound this */ function bind(f, obj, var_args) { var a = slice.call(arguments, 2); return function() { return f.apply(obj, a.concat(slice.call(arguments))); }; } var G_vmlCanvasManager_ = { init: function(opt_doc) { if (/MSIE/.test(navigator.userAgent) && !window.opera) { var doc = opt_doc || document; // Create a dummy element so that IE will allow canvas elements to be // recognized. doc.createElement('canvas'); doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); } }, init_: function(doc) { // create xmlns if (!doc.namespaces['g_vml_']) { doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', '#default#VML'); } if (!doc.namespaces['g_o_']) { doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', '#default#VML'); } // Setup default CSS. Only add one style sheet per document if (!doc.styleSheets['ex_canvas_']) { var ss = doc.createStyleSheet(); ss.owningElement.id = 'ex_canvas_'; ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + // default size is 300x150 in Gecko and Opera 'text-align:left;width:300px;height:150px}' + 'g_vml_\\:*{behavior:url(#default#VML)}' + 'g_o_\\:*{behavior:url(#default#VML)}'; } // find all canvas elements var els = doc.getElementsByTagName('canvas'); for (var i = 0; i < els.length; i++) { this.initElement(els[i]); } }, /** * Public initializes a canvas element so that it can be used as canvas * element from now on. This is called automatically before the page is * loaded but if you are creating elements using createElement you need to * make sure this is called on the element. * @param {HTMLElement} el The canvas element to initialize. * @return {HTMLElement} the element that was created. */ initElement: function(el) { if (!el.getContext) { el.getContext = getContext; // Remove fallback content. There is no way to hide text nodes so we // just remove all childNodes. We could hide all elements and remove // text nodes but who really cares about the fallback content. el.innerHTML = ''; // do not use inline function because that will leak memory el.attachEvent('onpropertychange', onPropertyChange); el.attachEvent('onresize', onResize); var attrs = el.attributes; if (attrs.width && attrs.width.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setWidth_(attrs.width.nodeValue); el.style.width = attrs.width.nodeValue + 'px'; } else { el.width = el.clientWidth; } if (attrs.height && attrs.height.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setHeight_(attrs.height.nodeValue); el.style.height = attrs.height.nodeValue + 'px'; } else { el.height = el.clientHeight; } //el.getContext().setCoordsize_() } return el; } }; function onPropertyChange(e) { var el = e.srcElement; switch (e.propertyName) { case 'width': el.style.width = el.attributes.width.nodeValue + 'px'; el.getContext().clearRect(); break; case 'height': el.style.height = el.attributes.height.nodeValue + 'px'; el.getContext().clearRect(); break; } } function onResize(e) { var el = e.srcElement; if (el.firstChild) { el.firstChild.style.width = el.clientWidth + 'px'; el.firstChild.style.height = el.clientHeight + 'px'; } } G_vmlCanvasManager_.init(); // precompute "00" to "FF" var dec2hex = []; for (var i = 0; i < 16; i++) { for (var j = 0; j < 16; j++) { dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); } } function createMatrixIdentity() { return [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]; } function matrixMultiply(m1, m2) { var result = createMatrixIdentity(); for (var x = 0; x < 3; x++) { for (var y = 0; y < 3; y++) { var sum = 0; for (var z = 0; z < 3; z++) { sum += m1[x][z] * m2[z][y]; } result[x][y] = sum; } } return result; } function copyState(o1, o2) { o2.fillStyle = o1.fillStyle; o2.lineCap = o1.lineCap; o2.lineJoin = o1.lineJoin; o2.lineWidth = o1.lineWidth; o2.miterLimit = o1.miterLimit; o2.shadowBlur = o1.shadowBlur; o2.shadowColor = o1.shadowColor; o2.shadowOffsetX = o1.shadowOffsetX; o2.shadowOffsetY = o1.shadowOffsetY; o2.strokeStyle = o1.strokeStyle; o2.globalAlpha = o1.globalAlpha; o2.arcScaleX_ = o1.arcScaleX_; o2.arcScaleY_ = o1.arcScaleY_; o2.lineScale_ = o1.lineScale_; } function processStyle(styleString) { var str, alpha = 1; styleString = String(styleString); if (styleString.substring(0, 3) == 'rgb') { var start = styleString.indexOf('(', 3); var end = styleString.indexOf(')', start + 1); var guts = styleString.substring(start + 1, end).split(','); str = '#'; for (var i = 0; i < 3; i++) { str += dec2hex[Number(guts[i])]; } if (guts.length == 4 && styleString.substr(3, 1) == 'a') { alpha = guts[3]; } } else { str = styleString; } return {color: str, alpha: alpha}; } function processLineCap(lineCap) { switch (lineCap) { case 'butt': return 'flat'; case 'round': return 'round'; case 'square': default: return 'square'; } } /** * This class implements CanvasRenderingContext2D interface as described by * the WHATWG. * @param {HTMLElement} surfaceElement The element that the 2D context should * be associated with */ function CanvasRenderingContext2D_(surfaceElement) { this.m_ = createMatrixIdentity(); this.mStack_ = []; this.aStack_ = []; this.currentPath_ = []; // Canvas context properties this.strokeStyle = '#000'; this.fillStyle = '#000'; this.lineWidth = 1; this.lineJoin = 'miter'; this.lineCap = 'butt'; this.miterLimit = Z * 1; this.globalAlpha = 1; this.canvas = surfaceElement; var el = surfaceElement.ownerDocument.createElement('div'); el.style.width = surfaceElement.clientWidth + 'px'; el.style.height = surfaceElement.clientHeight + 'px'; el.style.overflow = 'hidden'; el.style.position = 'absolute'; surfaceElement.appendChild(el); this.element_ = el; this.arcScaleX_ = 1; this.arcScaleY_ = 1; this.lineScale_ = 1; } var contextPrototype = CanvasRenderingContext2D_.prototype; contextPrototype.clearRect = function() { this.element_.innerHTML = ''; }; contextPrototype.beginPath = function() { // TODO: Branch current matrix so that save/restore has no effect // as per safari docs. this.currentPath_ = []; }; contextPrototype.moveTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.lineTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { var p = this.getCoords_(aX, aY); var cp1 = this.getCoords_(aCP1x, aCP1y); var cp2 = this.getCoords_(aCP2x, aCP2y); bezierCurveTo(this, cp1, cp2, p); }; // Helper function that takes the already fixed cordinates. function bezierCurveTo(self, cp1, cp2, p) { self.currentPath_.push({ type: 'bezierCurveTo', cp1x: cp1.x, cp1y: cp1.y, cp2x: cp2.x, cp2y: cp2.y, x: p.x, y: p.y }); self.currentX_ = p.x; self.currentY_ = p.y; } contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { // the following is lifted almost directly from // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes var cp = this.getCoords_(aCPx, aCPy); var p = this.getCoords_(aX, aY); var cp1 = { x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) }; var cp2 = { x: cp1.x + (p.x - this.currentX_) / 3.0, y: cp1.y + (p.y - this.currentY_) / 3.0 }; bezierCurveTo(this, cp1, cp2, p); }; contextPrototype.arc = function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { aRadius *= Z; var arcType = aClockwise ? 'at' : 'wa'; var xStart = aX + mc(aStartAngle) * aRadius - Z2; var yStart = aY + ms(aStartAngle) * aRadius - Z2; var xEnd = aX + mc(aEndAngle) * aRadius - Z2; var yEnd = aY + ms(aEndAngle) * aRadius - Z2; // IE won't render arches drawn counter clockwise if xStart == xEnd. if (xStart == xEnd && !aClockwise) { xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something // that can be represented in binary } var p = this.getCoords_(aX, aY); var pStart = this.getCoords_(xStart, yStart); var pEnd = this.getCoords_(xEnd, yEnd); this.currentPath_.push({type: arcType, x: p.x, y: p.y, radius: aRadius, xStart: pStart.x, yStart: pStart.y, xEnd: pEnd.x, yEnd: pEnd.y}); }; contextPrototype.rect = function(aX, aY, aWidth, aHeight) { this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); }; contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.stroke(); this.currentPath_ = oldPath; }; contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.fill(); this.currentPath_ = oldPath; }; contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { var gradient = new CanvasGradient_('gradient'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.x1_ = aX1; gradient.y1_ = aY1; return gradient; }; contextPrototype.createRadialGradient = function(aX0, aY0, aR0, aX1, aY1, aR1) { var gradient = new CanvasGradient_('gradientradial'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.r0_ = aR0; gradient.x1_ = aX1; gradient.y1_ = aY1; gradient.r1_ = aR1; return gradient; }; contextPrototype.drawImage = function(image, var_args) { var dx, dy, dw, dh, sx, sy, sw, sh; // to find the original width we overide the width and height var oldRuntimeWidth = image.runtimeStyle.width; var oldRuntimeHeight = image.runtimeStyle.height; image.runtimeStyle.width = 'auto'; image.runtimeStyle.height = 'auto'; // get the original size var w = image.width; var h = image.height; // and remove overides image.runtimeStyle.width = oldRuntimeWidth; image.runtimeStyle.height = oldRuntimeHeight; if (arguments.length == 3) { dx = arguments[1]; dy = arguments[2]; sx = sy = 0; sw = dw = w; sh = dh = h; } else if (arguments.length == 5) { dx = arguments[1]; dy = arguments[2]; dw = arguments[3]; dh = arguments[4]; sx = sy = 0; sw = w; sh = h; } else if (arguments.length == 9) { sx = arguments[1]; sy = arguments[2]; sw = arguments[3]; sh = arguments[4]; dx = arguments[5]; dy = arguments[6]; dw = arguments[7]; dh = arguments[8]; } else { throw Error('Invalid number of arguments'); } var d = this.getCoords_(dx, dy); var w2 = sw / 2; var h2 = sh / 2; var vmlStr = []; var W = 10; var H = 10; // For some reason that I've now forgotten, using divs didn't work vmlStr.push(' ' , '', ''); this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); }; contextPrototype.stroke = function(aFill) { var lineStr = []; var lineOpen = false; var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); var color = a.color; var opacity = a.alpha * this.globalAlpha; var W = 10; var H = 10; lineStr.push(''); if (!aFill) { var lineWidth = this.lineScale_ * this.lineWidth; // VML cannot correctly render a line if the width is less than 1px. // In that case, we dilute the color to make the line look thinner. if (lineWidth < 1) { opacity *= lineWidth; } lineStr.push( '' ); } else if (typeof this.fillStyle == 'object') { var fillStyle = this.fillStyle; var angle = 0; var focus = {x: 0, y: 0}; // additional offset var shift = 0; // scale factor for offset var expansion = 1; if (fillStyle.type_ == 'gradient') { var x0 = fillStyle.x0_ / this.arcScaleX_; var y0 = fillStyle.y0_ / this.arcScaleY_; var x1 = fillStyle.x1_ / this.arcScaleX_; var y1 = fillStyle.y1_ / this.arcScaleY_; var p0 = this.getCoords_(x0, y0); var p1 = this.getCoords_(x1, y1); var dx = p1.x - p0.x; var dy = p1.y - p0.y; angle = Math.atan2(dx, dy) * 180 / Math.PI; // The angle should be a non-negative number. if (angle < 0) { angle += 360; } // Very small angles produce an unexpected result because they are // converted to a scientific notation string. if (angle < 1e-6) { angle = 0; } } else { var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); var width = max.x - min.x; var height = max.y - min.y; focus = { x: (p0.x - min.x) / width, y: (p0.y - min.y) / height }; width /= this.arcScaleX_ * Z; height /= this.arcScaleY_ * Z; var dimension = m.max(width, height); shift = 2 * fillStyle.r0_ / dimension; expansion = 2 * fillStyle.r1_ / dimension - shift; } // We need to sort the color stops in ascending order by offset, // otherwise IE won't interpret it correctly. var stops = fillStyle.colors_; stops.sort(function(cs1, cs2) { return cs1.offset - cs2.offset; }); var length = stops.length; var color1 = stops[0].color; var color2 = stops[length - 1].color; var opacity1 = stops[0].alpha * this.globalAlpha; var opacity2 = stops[length - 1].alpha * this.globalAlpha; var colors = []; for (var i = 0; i < length; i++) { var stop = stops[i]; colors.push(stop.offset * expansion + shift + ' ' + stop.color); } // When colors attribute is used, the meanings of opacity and o:opacity2 // are reversed. lineStr.push(''); } else { lineStr.push(''); } lineStr.push(''); this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); }; contextPrototype.fill = function() { this.stroke(true); } contextPrototype.closePath = function() { this.currentPath_.push({type: 'close'}); }; /** * @private */ contextPrototype.getCoords_ = function(aX, aY) { var m = this.m_; return { x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 } }; contextPrototype.save = function() { var o = {}; copyState(this, o); this.aStack_.push(o); this.mStack_.push(this.m_); this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); }; contextPrototype.restore = function() { copyState(this.aStack_.pop(), this); this.m_ = this.mStack_.pop(); }; function matrixIsFinite(m) { for (var j = 0; j < 3; j++) { for (var k = 0; k < 2; k++) { if (!isFinite(m[j][k]) || isNaN(m[j][k])) { return false; } } } return true; } function setM(ctx, m, updateLineScale) { if (!matrixIsFinite(m)) { return; } ctx.m_ = m; if (updateLineScale) { // Get the line scale. // Determinant of this.m_ means how much the area is enlarged by the // transformation. So its square root can be used as a scale factor // for width. var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; ctx.lineScale_ = sqrt(abs(det)); } } contextPrototype.translate = function(aX, aY) { var m1 = [ [1, 0, 0], [0, 1, 0], [aX, aY, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.rotate = function(aRot) { var c = mc(aRot); var s = ms(aRot); var m1 = [ [c, s, 0], [-s, c, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.scale = function(aX, aY) { this.arcScaleX_ *= aX; this.arcScaleY_ *= aY; var m1 = [ [aX, 0, 0], [0, aY, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { var m1 = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { var m = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, m, true); }; /******** STUBS ********/ contextPrototype.clip = function() { // TODO: Implement }; contextPrototype.arcTo = function() { // TODO: Implement }; contextPrototype.createPattern = function() { return new CanvasPattern_; }; // Gradient / Pattern Stubs function CanvasGradient_(aType) { this.type_ = aType; this.x0_ = 0; this.y0_ = 0; this.r0_ = 0; this.x1_ = 0; this.y1_ = 0; this.r1_ = 0; this.colors_ = []; } CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { aColor = processStyle(aColor); this.colors_.push({offset: aOffset, color: aColor.color, alpha: aColor.alpha}); }; function CanvasPattern_() {} // set up externs G_vmlCanvasManager = G_vmlCanvasManager_; CanvasRenderingContext2D = CanvasRenderingContext2D_; CanvasGradient = CanvasGradient_; CanvasPattern = CanvasPattern_; })(); } // if soldair-node-qrcode-5d87b5f/helper/000077500000000000000000000000001465424452300172635ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/helper/to-sjis-browser.js000066400000000000000000000000711465424452300226700ustar00rootroot00000000000000/* global QRCode */ QRCode.toSJIS = require('./to-sjis') soldair-node-qrcode-5d87b5f/helper/to-sjis.js000066400000000000000000000532421465424452300212170ustar00rootroot00000000000000const SJIS_UTF8 = [ [0x8140, ' ã€�。,.・:;?ï¼�゛゜´`¨^ ̄_ヽヾã‚�ゞ〃ä»�々〆〇ー―â€�ï¼�\~∥|…‥‘’“â€�()〔〕[]{ï½�〈〉《》「ã€�『ã€�ã€�】+ï¼�±×'], [0x8180, '÷ï¼�≠<>≦≧∞∴♂♀°′″℃'], [0x818f, '¥$¢£%#&*@§☆★○â—�◎◇◆□■△▲▽▼'], [0x81a6, '※〒→â†�↑↓〓'], [0x81b8, '∈∋⊆⊇⊂⊃∪∩'], [0x81c8, '∧∨¬⇒⇔∀∃'], [0x81da, '∠⊥⌒∂∇≡≒≪≫√∽âˆ�∵∫∬'], [0x81f0, 'ʼn♯♭♪†‡¶'], [0x824f, 'ï¼�123456789'], [0x8260, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'], [0x8281, 'ï½�bcdefghijklï½�nï½�ï½�qrstuvwxyz'], [0x829f, 'ã��ã�‚ã�ƒã�„ã�…ã�†ã�‡ã�ˆã�‰ã�Šã�‹ã�Œã��ã�Žã��ã��ã�‘ã�’ã�“ã�”ã�•ã�–ã�—ã�˜ã�™ã�šã�›ã�œã��ã�žã�Ÿã� ã�¡ã�¢ã�£ã�¤ã�¥ã�¦ã�§ã�¨ã�©ã�ªã�«ã�¬ã�­ã�®ã�¯ã�°ã�±ã�²ã�³ã�´ã�µã�¶ã�·ã�¸ã�¹ã�ºã�»ã�¼ã�½ã�¾ã�¿ã‚€ã‚�もゃやゅゆょよらりるれã‚�ゎã‚�ã‚�ã‚‘ã‚’ã‚“'], [0x8340, 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダãƒ�ヂッツヅテデトドナニヌãƒ�ノãƒ�ãƒ�パヒビピフブプヘベペホボãƒ�マミ'], [0x8380, 'ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ'], [0x839f, 'ΑΒΓΔΕΖΗΘΙΚΛΜÎ�ΞΟΠΡΣΤΥΦΧΨΩ'], [0x83bf, 'αβγδεζηθικλμνξοπÏ�στυφχψω'], [0x8440, 'Ð�БВГДЕÐ�ЖЗИЙКЛМÐ�ОПРСТУФХЦЧШЩЪЫЬЭЮЯ'], [0x8470, 'абвгдеёжзийклмн'], [0x8480, 'опрÑ�туфхцчшщъыьÑ�ÑŽÑ�'], [0x8780, 'ã€�〟'], [0x889f, '亜唖娃阿哀愛挨姶逢葵茜ç©�悪æ�¡æ¸¥æ—­è‘¦èŠ¦é¯µæ¢“åœ§æ–¡æ‰±å®›å§�虻飴絢綾鮎或粟袷安庵按暗案闇éž�æ��以伊ä½�ä¾�å�‰å›²å¤·å§”å¨�尉惟æ„�慰易椅為ç•�異移維緯胃è�Žè¡£'], [0x88e0, '謂é�•é�ºåŒ»äº•亥域育éƒ�磯一壱溢逸稲茨芋鰯å…�å�°å’½å“¡å› å§»å¼•飲淫胤蔭'], [0x8940, '院陰隠韻å�‹å�³å®‡çƒ�羽迂雨å�¯éµœçªºä¸‘碓臼渦嘘唄æ¬�蔚鰻姥厩浦瓜é–�噂云é�‹é›²è��餌å�¡å–¶å¬°å½±æ˜ æ›³æ „永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦è¬�越閲榎厭円'], [0x8980, '園堰奄宴延怨掩æ�´æ²¿æ¼”炎焔煙燕猿ç¸�艶苑薗é� é‰›é´›å¡©æ–¼æ±šç”¥å‡¹å¤®å¥¥å¾€å¿œæŠ¼æ—ºæ¨ªæ¬§æ®´çŽ‹ç¿�襖鴬鴎黄岡沖è�»å„„屋憶臆桶牡乙俺å�¸æ�©æ¸©ç©�音下化仮何伽価佳加å�¯å˜‰å¤�å«�家寡科暇果架歌河ç�«ç�‚ç¦�禾稼箇花苛茄è�·è�¯è�“è�¦èª²å˜©è²¨è¿¦é�ŽéœžèšŠä¿„峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔æ�¢æ‡�戒æ‹�改'], [0x8a40, 'é­�晦械海ç�°ç•Œçš†çµµèŠ¥èŸ¹é–‹éšŽè²�凱劾外咳害崖慨概涯ç¢�蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇å�„廓拡撹格核殻ç�²ç¢ºç©«è¦šè§’赫較郭閣隔é�©å­¦å²³æ¥½é¡�顎掛笠樫'], [0x8a80, '橿梶é°�潟割å–�æ�°æ‹¬æ´»æ¸‡æ»‘è‘›è¤�轄且鰹å�¶æ¤›æ¨ºéž„株兜竃蒲釜鎌噛鴨栢茅è�±ç²¥åˆˆè‹…瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾æ�›æ•¢æŸ‘桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰è‚�艦莞観諌貫還鑑間閑関陥韓館舘丸å�«å²¸å·ŒçŽ©ç™Œçœ¼å²©ç¿«è´‹é›�頑顔願ä¼�伎å�±å–œå™¨åŸºå¥‡å¬‰å¯„å²�希幾忌æ�®æœºæ——既期棋棄'], [0x8b40, '機帰毅気汽畿祈季稀紀徽è¦�記貴起軌è¼�飢騎鬼亀å�½å„€å¦“宜戯技擬欺犠疑祇義蟻誼議掬è�Šéž å�‰å�ƒå–«æ¡”橘詰砧æ�µé»�å�´å®¢è„šè™�逆丘久仇休å�Šå�¸å®®å¼“急救'], [0x8b80, '朽求汲泣ç�¸ç�ƒç©¶çª®ç¬ˆç´šç³¾çµ¦æ—§ç‰›åŽ»å±…å·¨æ‹’æ‹ æŒ™æ¸ è™šè¨±è·�鋸æ¼�禦魚亨享京供侠僑兇競共凶å�”匡å�¿å�«å–¬å¢ƒå³¡å¼·å½Šæ€¯æ��æ�­æŒŸæ•™æ©‹æ³�狂狭矯胸脅興蕎郷é�¡éŸ¿é¥—驚仰å‡�å°­æš�業局曲極玉æ¡�ç²�僅勤å�‡å·¾éŒ¦æ–¤æ¬£æ¬½ç�´ç¦�禽筋緊芹è�Œè¡¿è¥Ÿè¬¹è¿‘金å�ŸéŠ€ä¹�倶å�¥åŒºç‹—玖矩苦躯駆駈駒具愚虞喰空å�¶å¯“é�‡éš…串櫛釧屑屈'], [0x8c40, '掘窟沓é�´è½¡çªªç†Šéšˆç²‚æ —ç¹°æ¡‘é�¬å‹²å�›è–«è¨“群è»�郡å�¦è¢ˆç¥�係傾刑兄啓圭ç�ªåž‹å¥‘形径æ�µæ…¶æ…§æ†©æŽ²æ�ºæ•¬æ™¯æ¡‚渓畦稽系経継繋罫茎è�Šè›�計詣警軽頚é¶�芸迎鯨'], [0x8c80, '劇戟撃激隙æ¡�傑欠決潔穴çµ�血訣月件倹倦å�¥å…¼åˆ¸å‰£å–§åœ�堅嫌建憲懸拳æ�²æ¤œæ¨©ç‰½çŠ¬çŒ®ç ”ç¡¯çµ¹çœŒè‚©è¦‹è¬™è³¢è»’é�£é�µé™ºé¡•験鹸元原厳幻弦減æº�玄ç�¾çµƒèˆ·è¨€è«ºé™�乎個å�¤å‘¼å›ºå§‘孤己庫弧戸故枯湖ç‹�糊袴股胡è�°è™Žèª‡è·¨éˆ·é›‡é¡§é¼“五互ä¼�å�ˆå‘‰å�¾å¨¯å¾Œå¾¡æ‚Ÿæ¢§æªŽç‘šç¢�語誤護é†�乞鯉交佼侯候倖光公功効勾厚å�£å�‘'], [0x8d40, 'å�Žå–‰å�‘垢好孔å­�å®�工巧巷幸広庚康弘æ�’慌抗拘控攻昂晃更æ�­æ ¡æ¢—構江洪浩港æº�甲皇硬稿糠紅紘絞綱耕考肯肱腔è†�航è�’行衡講貢購郊酵鉱砿鋼閤é™�'], [0x8d80, '項香高鴻剛劫å�·å�ˆå£•拷濠豪轟麹克刻告国穀酷鵠黒ç�„漉腰甑忽惚骨狛込此頃今困å�¤å¢¾å©šæ�¨æ‡‡æ˜�昆根梱混痕紺艮魂些ä½�å�‰å”†åµ¯å·¦å·®æŸ»æ²™ç‘³ç ‚è©�鎖裟å��座挫債催å†�最哉塞妻宰彩æ‰�採栽歳済ç�½é‡‡çŠ€ç •ç ¦ç¥­æ–Žç´°è�œè£�載際剤在æ��罪財冴å�‚阪堺榊肴咲崎埼碕鷺作削咋æ�¾æ˜¨æœ”柵窄策索錯桜鮭笹匙冊刷'], [0x8e40, '察拶撮擦札殺薩雑çš�鯖æ�ŒéŒ†é®«çš¿æ™’三傘å�‚山惨撒散桟燦ç�Šç”£ç®—纂蚕讃賛酸é¤�斬暫残仕仔伺使刺å�¸å�²å—£å››å£«å§‹å§‰å§¿å­�å±�市師志æ€�指支孜斯施旨æž�æ­¢'], [0x8e80, 'æ­»æ°�ç�…祉ç§�糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似ä¾�å…�字寺慈æŒ�時次滋治爾璽痔ç£�示而耳自蒔辞æ±�鹿å¼�識鴫竺軸å®�雫七å�±åŸ·å¤±å«‰å®¤æ‚‰æ¹¿æ¼†ç–¾è³ªå®Ÿè”€ç¯ å�²æŸ´èŠ�屡蕊縞舎写射æ�¨èµ¦æ–œç…®ç¤¾ç´—者è¬�車é�®è›‡é‚ªå€Ÿå‹ºå°ºæ�“ç�¼çˆµé…Œé‡ˆéŒ«è‹¥å¯‚弱惹主å�–守手朱殊狩ç� ç¨®è…«è¶£é…’首儒å�—呪寿授樹綬需囚å�Žå‘¨'], [0x8f40, '宗就州修æ„�拾洲秀秋終ç¹�習臭舟è’�衆襲è®�蹴輯週酋酬集醜什ä½�å……å��従戎柔æ±�渋ç�£ç¸¦é‡�銃å�”夙宿淑ç¥�縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳'], [0x8f80, '準潤盾純巡é�µé†‡é †å‡¦åˆ�所暑曙渚庶緒署書薯藷諸助å�™å¥³åº�å¾�æ�•鋤除傷償å‹�匠å�‡å�¬å“¨å•†å”±å˜—奨妾娼宵将å°�少尚庄床廠彰承抄招掌æ�·æ˜‡æ˜Œæ˜­æ™¶æ�¾æ¢¢æ¨Ÿæ¨µæ²¼æ¶ˆæ¸‰æ¹˜ç„¼ç„¦ç…§ç—‡çœ�ç¡�ç¤�祥称章笑粧紹肖è�–蒋蕉è¡�裳訟証詔詳象賞醤鉦é�¾é�˜éšœéž˜ä¸Šä¸ˆä¸žä¹—冗剰城場壌嬢常情擾æ�¡æ�–浄状畳穣蒸譲醸錠嘱埴飾'], [0x9040, 'æ‹­æ¤�殖燭織è�·è‰²è§¦é£Ÿè�•辱尻伸信侵唇娠å¯�審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進é‡�震人ä»�刃塵壬尋甚尽腎訊迅陣é�­ç¬¥è«�須酢図厨'], [0x9080, '逗å�¹åž‚帥推水炊ç�¡ç²‹ç¿ è¡°é�‚é…”éŒ�錘éš�瑞髄崇嵩数枢趨雛æ�®æ�‰æ¤™è�…頗雀裾澄摺寸世瀬ç•�是凄制勢姓å¾�性æˆ�政整星晴棲栖正清牲生盛精è�–声製西誠誓請é€�醒é�’é�™æ–‰ç¨Žè„†éš»å¸­æƒœæˆšæ–¥æ˜”æž�石ç©�ç±�績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌è�‰ä»™å…ˆå�ƒå� å®£å°‚å°–å·�戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線'], [0x9140, '繊羨腺舛船薦詮賎践é�¸é�·éŠ­éŠ‘é–ƒé®®å‰�善漸然全禅繕膳糎噌塑岨措曾曽楚狙ç–�疎礎祖租粗素組蘇訴阻é�¡é¼ åƒ§å‰µå�Œå�¢å€‰å–ªå£®å¥�爽宋層åŒ�惣想æ�œæŽƒæŒ¿æŽ»'], [0x9180, 'æ“�早曹巣æ§�槽漕燥争痩相窓糟ç·�ç¶œè�¡è�‰è�˜è‘¬è’¼è—»è£…èµ°é€�é�­éŽ—éœœé¨’åƒ�増憎臓蔵贈造促å�´å‰‡å�³æ�¯æ�‰æ�Ÿæ¸¬è¶³é€Ÿä¿—属賊æ—�ç¶šå�’袖其æ�ƒå­˜å­«å°Šæ��æ�‘é�œä»–多太汰詑唾堕妥惰打æŸ�舵楕陀駄騨体堆対è€�岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代å�°å¤§ç¬¬é†�題鷹æ»�瀧å�“啄宅托択拓沢濯ç�¢è¨—é�¸æ¿�諾茸凧蛸å�ª'], [0x9240, 'å�©ä½†é�”辰奪脱巽竪辿棚谷狸鱈樽誰丹å�˜å˜†å�¦æ‹…探旦歎淡湛炭短端箪綻耽胆蛋誕é�›å›£å£‡å¼¾æ–­æš–檀段男談値知地弛æ�¥æ™ºæ± ç—´ç¨šç½®è‡´èœ˜é�…馳築畜竹筑蓄'], [0x9280, 'é€�秩窒茶嫡ç�€ä¸­ä»²å®™å¿ æŠ½æ˜¼æŸ±æ³¨è™«è¡·è¨»é…Žé‹³é§�樗瀦猪苧著貯ä¸�兆凋喋寵帖帳åº�弔張彫徴懲挑暢æœ�潮牒町眺è�´è„¹è…¸è�¶èª¿è«œè¶…跳銚長頂鳥勅æ�—直朕沈ç��賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴é�”椿潰å�ªå£·å¬¬ç´¬çˆªå�Šé‡£é¶´äº­ä½Žå�œå�µå‰ƒè²žå‘ˆå ¤å®šå¸�底庭廷弟悌抵挺æ��梯汀碇禎程締艇訂諦蹄逓'], [0x9340, '邸鄭釘鼎泥摘擢敵滴的笛é�©é�‘溺哲徹撤è½�迭鉄典填天展店添çº�甜貼転顛点ä¼�殿澱田電兎å��堵塗妬屠徒斗æ�œæ¸¡ç™»è�Ÿè³­é€”都é��砥砺努度土奴怒倒党冬'], [0x9380, 'å‡�刀å”�塔塘套宕島嶋悼投æ�­æ�±æ¡ƒæ¢¼æ£Ÿç›—淘湯涛ç�¯ç‡ˆå½“痘祷等答筒糖統到董蕩藤討謄豆è¸�逃é€�é�™é™¶é ­é¨°é—˜åƒ�å‹•å�Œå ‚導憧撞洞瞳童胴è�„é�“銅峠鴇匿得徳涜特ç�£ç¦¿ç¯¤æ¯’独読栃橡凸çª�椴届鳶苫寅酉瀞噸屯惇敦沌豚é��頓呑曇éˆ�奈那内ä¹�凪薙謎ç�˜æ�ºé�‹æ¥¢é¦´ç¸„ç•·å�—楠軟難æ±�二尼å¼�迩匂賑肉虹廿日乳入'], [0x9440, '如尿韮任妊å¿�èª�濡禰祢寧葱猫熱年念æ�»æ’šç‡ƒç²˜ä¹ƒå»¼ä¹‹åŸœå𢿂©æ¿ƒç´�能脳膿農覗蚤巴把播覇æ�·æ³¢æ´¾ç�¶ç ´å©†ç½µèŠ­é¦¬ä¿³å»ƒæ‹�排敗æ�¯ç›ƒç‰ŒèƒŒè‚ºè¼©é…�å€�培媒梅'], [0x9480, '楳煤狽買売賠陪這è�¿ç§¤çŸ§è�©ä¼¯å‰¥å�šæ‹�æŸ�泊白箔粕舶薄迫æ›�漠爆縛莫é§�麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪ä¼�罰抜ç­�閥鳩噺塙蛤隼伴判å�Šå��å�›å¸†æ�¬æ–‘æ�¿æ°¾æ±Žç‰ˆçНç�­ç•”ç¹�般藩販範釆煩頒飯挽晩番盤ç£�蕃蛮匪å�‘å�¦å¦ƒåº‡å½¼æ‚²æ‰‰æ‰¹æŠ«æ–�比泌疲皮碑秘緋罷肥被誹費é�¿é�žé£›æ¨‹ç°¸å‚™å°¾å¾®æž‡æ¯˜ç�µçœ‰ç¾Ž'], [0x9540, '鼻柊稗匹疋髭彦è†�è�±è‚˜å¼¼å¿…畢筆逼桧姫媛ç´�百謬俵彪標氷漂瓢票表評豹廟æ��病秒苗錨鋲蒜蛭鰭å“�彬斌浜瀕貧賓頻æ•�ç“¶ä¸�付埠夫婦富冨布府怖扶敷'], [0x9580, '斧普浮父符è…�膚芙譜負賦赴阜附侮撫武舞葡蕪部å°�楓風葺蕗ä¼�副復幅æœ�ç¦�腹複覆淵弗払沸ä»�物鮒分å�»å™´å¢³æ†¤æ‰®ç„šå¥®ç²‰ç³žç´›é›°æ–‡è�žä¸™ä½µå…µå¡€å¹£å¹³å¼ŠæŸ„並蔽閉陛米é �僻å£�癖碧別瞥蔑箆å��変片篇編辺返é��便勉娩å¼�éž­ä¿�舗鋪圃æ�•歩甫補輔穂募墓慕戊暮æ¯�ç°¿è�©å€£ä¿¸åŒ…呆報奉å®�峰峯崩庖抱æ�§æ”¾æ–¹æœ‹'], [0x9640, '法泡烹砲縫胞芳è�Œè“¬èœ‚褒訪豊邦鋒飽鳳鵬ä¹�亡å‚�剖å�Šå¦¨å¸½å¿˜å¿™æˆ¿æš´æœ›æŸ�棒冒紡肪膨謀貌貿鉾防å� é ¬åŒ—僕å�œå¢¨æ’²æœ´ç‰§ç�¦ç©†é‡¦å‹ƒæ²¡æ®†å €å¹Œå¥”本翻凡盆'], [0x9680, '摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒æ¡�亦俣å�ˆæŠ¹æœ«æ²«è¿„侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙ç²�民眠務夢無牟矛霧鵡椋婿娘冥å��命明盟迷銘鳴姪ç‰�æ»…å…�棉綿緬é�¢éººæ‘¸æ¨¡èŒ‚妄孟毛猛盲網耗蒙儲木黙目æ�¢å‹¿é¤…尤戻籾貰å•�æ‚¶ç´‹é–€åŒ�也冶夜爺耶野弥矢厄役約薬訳èº�é�–柳薮鑓愉愈油癒'], [0x9740, '諭輸唯佑優勇å�‹å®¥å¹½æ‚ æ†‚æ�–有柚湧涌猶猷由ç¥�裕誘é�Šé‚‘郵雄èž�夕予余与誉輿é �傭幼妖容庸æ�šæ�ºæ“�曜楊様洋溶熔用窯羊耀葉蓉è¦�謡踊é�¥é™½é¤Šæ…¾æŠ‘欲'], [0x9780, '沃浴翌翼淀羅螺裸æ�¥èŽ±é ¼é›·æ´›çµ¡è�½é…ªä¹±å�µåµ�欄濫è—�蘭覧利å��å±¥æ�Žæ¢¨ç�†ç’ƒç—¢è£�裡里離陸律率立葎掠略劉æµ�溜ç�‰ç•™ç¡«ç²’隆竜é¾�侶慮旅虜了亮僚両凌寮料æ¢�涼猟療瞭稜糧良諒é�¼é‡�陵領力緑倫厘林淋ç‡�ç�³è‡¨è¼ªéš£é±—麟瑠å¡�涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉æ�‹æ†�漣煉簾練è�¯'], [0x9840, '蓮連錬呂魯櫓炉賂路露労å©�廊弄朗楼榔浪æ¼�牢狼篭è€�è�¾è�‹éƒŽå…­éº“禄肋録論倭和話歪賄脇惑枠鷲亙亘é°�è©«è—�蕨椀湾碗腕'], [0x989f, '弌ä¸�丕个丱丶丼丿乂乖乘亂亅豫亊舒å¼�于亞亟亠亢亰亳亶从ä»�仄仆仂仗仞仭仟价伉佚估佛ä½�佗佇佶侈ä¾�侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚ä¿�俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆å�ƒå�‡æœƒå�•å��å�ˆå�šå�–å�¬å�¸å‚€å‚šå‚…傴傲'], [0x9940, '僉僊傳僂僖僞僥僭僣僮價僵儉å„�儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉å†�冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭'], [0x9980, '凰凵凾刄刋刔刎刧刪刮刳刹å‰�剄剋剌剞剔剪剴剩剳剿剽åŠ�劔劒剱劈劑辨辧劬劭劼劵å‹�å‹�勗勞勣勦飭勠勳勵勸勹匆匈甸åŒ�åŒ�åŒ�匕匚匣匯匱匳匸å�€å�†å�…丗å�‰å��凖å�žå�©å�®å¤˜å�»å�·åŽ‚åŽ–åŽ åŽ¦åŽ¥åŽ®åŽ°åŽ¶å�ƒç°’é›™å�Ÿæ›¼ç‡®å�®å�¨å�­å�ºå��å�½å‘€å�¬å�­å�¼å�®å�¶å�©å��呎å’�呵咎呟呱呷呰咒呻咀呶咄å’�咆哇咢咸咥咬哄哈咨'], [0x9a40, '咫哂咤咾咼哘哥哦å”�唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳å•�喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎å™�營嘴嘶嘲嘸'], [0x9a80, '噫噤嘯噬噪嚆嚀嚊嚠嚔åš�嚥嚮嚶嚴囂嚼å›�囃囀囈囎囑囓囗囮囹圀囿圄圉圈國åœ�圓團圖嗇圜圦圷圸å�Žåœ»å�€å��å�©åŸ€åžˆå�¡å�¿åž‰åž“垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙å �塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊å¤�夛梦夥夬夭夲夸夾竒奕å¥�奎奚奘奢奠奧奬奩'], [0x9b40, '奸å¦�å¦�佞侫妣妲姆姨姜å¦�姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲å«�嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀'], [0x9b80, '它宦宸寃寇寉寔å¯�寤實寢寞寥寫寰寶寳尅將專å°�尓尠尢尨尸尹å±�屆屎屓å±�å±�孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢å¶�嶬嶮嶽å¶�嶷嶼巉å·�巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠å»�廂廈å»�å»�'], [0x9c40, '廖廣å»�廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉å½�彜弋弑弖弩弭弸å½�彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱å¿�悳忿怡æ� '], [0x9c80, '怙æ€�怩怎怱怛怕怫怦æ€�怺æ�šæ��æ�ªæ�·æ�Ÿæ�Šæ�†æ��æ�£æ�ƒæ�¤æ�‚æ�¬æ�«æ�™æ‚�æ‚�惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘æ…�愕愆惶惷愀惴惺愃愡惻惱æ„�愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟æ…�慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹æ‡�懦懣懶懺懴懿懽懼懾戀戈戉æˆ�戌戔戛'], [0x9d40, '戞戡截戮戰戲戳æ‰�扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻æ‹�拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵æ��挾æ��æ�œæ��掖掎掀掫æ�¶æŽ£æŽ�掉掟掵æ�«'], [0x9d80, 'æ�©æŽ¾æ�©æ�€æ�†æ�£æ�‰æ�’æ�¶æ�„æ�–æ�´æ�†æ�“æ�¦æ�¶æ”�æ�—æ�¨æ��摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕æ•�敘敞æ•�敲數斂斃變斛斟斫斷旃旆æ—�旄旌旒旛旙无旡旱æ�²æ˜Šæ˜ƒæ—»æ�³æ˜µæ˜¶æ˜´æ˜œæ™�晄晉æ™�晞æ™�晤晧晨晟晢晰暃暈暎暉暄暘æš�æ›�暹曉暾暼'], [0x9e40, '曄暸曖曚曠昿曦曩曰曵曷æœ�朖朞朦朧霸朮朿朶æ��朸朷æ�†æ�žæ� æ�™æ�£æ�¤æž‰æ�°æž©æ�¼æ�ªæžŒæž‹æž¦æž¡æž…枷柯枴柬枳柩枸柤柞æŸ�柢柮枹柎柆柧檜栞框栩桀æ¡�栲桎'], [0x9e80, '梳栫桙档桷桿梟æ¢�梭梔æ¢�梛梃檮梹桴梵梠梺æ¤�æ¢�桾æ¤�棊椈棘椢椦棡椌æ£�棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞æ¥�æ¦�楪榲榮æ§�榿æ§�槓榾槎寨槊æ§�榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒æ«�樣樓橄樌橲樶橸橇橢橙橦橈樸樢æª�æª�檠檄檢檣'], [0x9f40, '檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉æ­�歙歔歛歟歡歸歹歿殀殄殃æ®�殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯'], [0x9f80, '麾氈氓气氛氤氣汞汕汢汪沂æ²�沚æ²�沛汾汨汳沒æ²�泄泱泓沽泗泅æ³�沮沱沾沺泛泯泙泪洟è¡�洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶æ¹�渟湃渺湎渤滿æ¸�游溂溪溘滉溷滓溽溯滄溲滔滕æº�溥滂溟æ½�漑ç�Œæ»¬æ»¸æ»¾æ¼¿æ»²æ¼±æ»¯æ¼²æ»Œ'], [0xe040, '漾漓滷澆潺潸æ¾�澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑ç€�ç€�濾瀛瀚潴ç€�瀘瀟瀰瀾瀲ç�‘ç�£ç‚™ç‚’炯烱炬炸炳炮烟烋çƒ�'], [0xe080, '烙焉烽焜焙煥煕熈煦煢煌煖煬ç†�燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿çˆ�çˆ�爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂çŠ�犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷å€�猗猊猜猖çŒ�猴猯猩猥猾ç�Žç��默ç�—ç�ªç�¨ç�°ç�¸ç�µç�»ç�ºç�ˆç޳ç�ŽçŽ»ç�€ç�¥ç�®ç�žç’¢ç�…瑯ç�¥ç�¸ç�²ç�ºç‘•ç�¿ç‘Ÿç‘™ç‘�瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊ç“�ç“”ç�±'], [0xe140, '瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎ç”�甕甓甞甦甬甼畄ç•�畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚ç–�疥疣痂疳痃疵疽疸疼疱ç—�痊痒痙痣痞痾痿'], [0xe180, 'ç—¼ç˜�痰痺痲痳瘋ç˜�瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂ç›�盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸ç�‡ç�šç�¨ç�«ç�›ç�¥ç�¿ç�¾ç�¹çžŽçž‹çž‘瞠瞞瞰瞶瞹瞿瞼瞽瞻矇çŸ�矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬'], [0xe240, '磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊ç¦�禧齋禪禮禳禹禺秉秕秧秬秡秣稈ç¨�稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩é¾�穰穹穽窈窗窕窘窖窩竈窰'], [0xe280, '窶竅竄窿邃竇竊ç«�ç«�竕竓站竚ç«�竡竢竦竭竰笂ç¬�笊笆笳笘笙笞笵笨笶ç­�筺笄ç­�笋筌筅筵筥筴筧筰筱筬筮ç®�箘箟ç®�箜箚箋箒ç®�ç­�箙篋ç¯�篌ç¯�箴篆ç¯�篩簑簔篦篥籠簀簇簓篳篷簗ç°�篶簣簧簪簟簷簫簽籌籃籔ç±�ç±€ç±�籘籟籤籖籥籬籵粃ç²�粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆'], [0xe340, '紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮çµ�絣經綉絛ç¶�絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘ç·�緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷'], [0xe380, '縲縺繧ç¹�繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒çº�纓纔纖纎纛纜缸缺罅罌ç½�罎ç½�网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞ç¾�羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻è�Šè�†è�’è�˜è�šè�Ÿè�¢è�¨è�³è�²è�°è�¶è�¹è�½è�¿è‚„肆肅肛肓肚肭å†�肬胛胥胙èƒ�胄胚胖脉胯胱脛脩脣脯腋'], [0xe440, '隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉è‡�臑臙臘臈臚臟臠臧臺臻臾èˆ�舂舅與舊èˆ�èˆ�舖舩舫舸舳艀艙艘è‰�艚艟艤'], [0xe480, '艢艨艪艫舮艱艷艸艾èŠ�芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱è�€èŒ¹è��è�…茯茫茗茘莅莚莪莟莢莖茣莎莇莊è�¼è޵è�³è�µèŽ èŽ‰èŽ¨è�´è�“è�«è�Žè�½è�ƒè�˜è�‹è��è�·è�‡è� è�²è��è�¢è� è޽è�¸è”†è�»è‘­è�ªè�¼è•šè’„葷葫蒭葮蒂葩葆è�¬è‘¯è‘¹è�µè“Šè‘¢è’¹è’¿è’Ÿè“™è“�蒻蓚è“�è“�蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈'], [0xe540, 'è•�蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾è–�藉薺è—�è–¹è—�è—•è—�藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿è™�乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬'], [0xe580, '蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉èœ�蛹蜊蜴蜿蜷蜻蜥蜩蜚è� è�Ÿè�¸è�Œè�Žè�´è�—è�¨è�®è�™è�“è�£è�ªè …螢螟螂螯蟋螽蟀èŸ�雖螫蟄螳蟇蟆螻蟯蟲蟠è �è �蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫è¢�衾袞衵衽袵衲袂袗袒袮袙袢è¢�袤袰袿袱裃裄裔裘裙è£�裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫è¥�襄褻褶褸襌è¤�襠襞'], [0xe640, '襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜è§�觧觴觸訃訖è¨�訌訛è¨�訥訶è©�詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄è«�諂諚諫諳諧'], [0xe680, '諤諱謔諠諢諷諞諛謌謇謚諡謖è¬�謗謠謳鞫謦謫謾謨è­�è­Œè­�譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺è±�谿豈豌豎è±�豕豢豬豸豺貂貉貅貊è²�貎貔豼貘æˆ�貭貪貽貲貳貮貶賈è³�賤賣賚賽賺賻贄贅贊贇è´�è´�è´�齎贓è³�贔贖赧赭赱赳è¶�趙跂趾趺è·�跚跖跌跛跋跪跫跟跣跼踈踉跿è¸�踞è¸�踟蹂踵踰踴蹊'], [0xe740, '蹇蹉蹌è¹�蹈蹙蹤蹠踪蹣蹕蹶蹲蹼èº�躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜'], [0xe780, '轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡é€�逞逖逋逧逶逵逹迸é��é��é�‘é�’逎é�‰é€¾é�–é�˜é�žé�¨é�¯é�¶éš¨é�²é‚‚é�½é‚�邀邊邉é‚�邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀é‡�釉釋é‡�釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋é‰�銜銖銓銛鉚é‹�銹銷鋩éŒ�鋺é�„錮'], [0xe840, '錙錢錚錣錺錵錻é�œé� é�¼é�®é�–鎰鎬鎭鎔鎹é�–é�—é�¨é�¥é�˜é�ƒé��é��é�ˆé�¤é�šé�”é�“é�ƒé�‡é��é�¶é�«é�µé�¡é�ºé‘�鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾é’�鑿閂閇閊閔閖閘閙'], [0xe880, '閠閨閧閭閼閻閹閾闊濶闃é—�闌闕闔闖關闡闥闢阡阨阮阯陂陌é™�陋陷陜陞é™�陟陦陲陬éš�隘隕隗險隧隱隲隰隴隶隸隹雎雋雉é›�è¥�雜éœ�雕雹霄霆霈霓霎霑éœ�霖霙霤霪霰霹霽霾é�„é�†é�ˆé�‚é�‰é�œé� é�¤é�¦é�¨å‹’é�«é�±é�¹éž…é�¼éž�é�ºéž†éž‹éž�éž�鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭é½�韲竟韶韵é �頌頸頤頡頷頽顆é¡�顋顫顯顰'], [0xe940, '顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡é¤�餞餤餠餬餮餽餾饂饉饅é¥�饋饑饒饌饕馗馘馥馭馮馼駟駛é§�駘駑駭駮駱駲駻駸é¨�é¨�騅駢騙騫騷驅驂驀驃'], [0xe980, '騾驕é©�驛驗驟驢驥驤驩驫驪骭骰骼髀é«�髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃é­�é­�魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆é¯�鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒éµ�鴿鴾鵆鵈'], [0xea40, 'éµ�鵞鵤鵑éµ�鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄é·�鶻鶸鶺鷆é·�鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽éº�麈麋麌麒麕麑éº�麥麩麸麪麭é�¡é»Œé»Žé»�é»�黔黜點é»�黠黥黨黯'], [0xea80, '黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇é�™ç‘¤å‡œç†™'] ] module.exports = function toSJIS (utf8Char) { if (!utf8Char || utf8Char === '') return for (let i = 0; i < SJIS_UTF8.length; i++) { const kanji = SJIS_UTF8[i][1] const posIndex = kanji.indexOf(utf8Char) if (posIndex >= 0) { return SJIS_UTF8[i][0] + posIndex } } } soldair-node-qrcode-5d87b5f/lib/000077500000000000000000000000001465424452300165525ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/lib/browser.js000066400000000000000000000035361465424452300206020ustar00rootroot00000000000000 const canPromise = require('./can-promise') const QRCode = require('./core/qrcode') const CanvasRenderer = require('./renderer/canvas') const SvgRenderer = require('./renderer/svg-tag.js') function renderCanvas (renderFunc, canvas, text, opts, cb) { const args = [].slice.call(arguments, 1) const argsNum = args.length const isLastArgCb = typeof args[argsNum - 1] === 'function' if (!isLastArgCb && !canPromise()) { throw new Error('Callback required as last argument') } if (isLastArgCb) { if (argsNum < 2) { throw new Error('Too few arguments provided') } if (argsNum === 2) { cb = text text = canvas canvas = opts = undefined } else if (argsNum === 3) { if (canvas.getContext && typeof cb === 'undefined') { cb = opts opts = undefined } else { cb = opts opts = text text = canvas canvas = undefined } } } else { if (argsNum < 1) { throw new Error('Too few arguments provided') } if (argsNum === 1) { text = canvas canvas = opts = undefined } else if (argsNum === 2 && !canvas.getContext) { opts = text text = canvas canvas = undefined } return new Promise(function (resolve, reject) { try { const data = QRCode.create(text, opts) resolve(renderFunc(data, canvas, opts)) } catch (e) { reject(e) } }) } try { const data = QRCode.create(text, opts) cb(null, renderFunc(data, canvas, opts)) } catch (e) { cb(e) } } exports.create = QRCode.create exports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render) exports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL) // only svg for now. exports.toString = renderCanvas.bind(null, function (data, _, opts) { return SvgRenderer.render(data, opts) }) soldair-node-qrcode-5d87b5f/lib/can-promise.js000066400000000000000000000004231465424452300213240ustar00rootroot00000000000000// can-promise has a crash in some versions of react native that dont have // standard global objects // https://github.com/soldair/node-qrcode/issues/157 module.exports = function () { return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then } soldair-node-qrcode-5d87b5f/lib/core/000077500000000000000000000000001465424452300175025ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/lib/core/alignment-pattern.js000066400000000000000000000056641465424452300235040ustar00rootroot00000000000000/** * Alignment pattern are fixed reference pattern in defined positions * in a matrix symbology, which enables the decode software to re-synchronise * the coordinate mapping of the image modules in the event of moderate amounts * of distortion of the image. * * Alignment patterns are present only in QR Code symbols of version 2 or larger * and their number depends on the symbol version. */ const getSymbolSize = require('./utils').getSymbolSize /** * Calculate the row/column coordinates of the center module of each alignment pattern * for the specified QR Code version. * * The alignment patterns are positioned symmetrically on either side of the diagonal * running from the top left corner of the symbol to the bottom right corner. * * Since positions are simmetrical only half of the coordinates are returned. * Each item of the array will represent in turn the x and y coordinate. * @see {@link getPositions} * * @param {Number} version QR Code version * @return {Array} Array of coordinate */ exports.getRowColCoords = function getRowColCoords (version) { if (version === 1) return [] const posCount = Math.floor(version / 7) + 2 const size = getSymbolSize(version) const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2 const positions = [size - 7] // Last coord is always (size - 7) for (let i = 1; i < posCount - 1; i++) { positions[i] = positions[i - 1] - intervals } positions.push(6) // First coord is always 6 return positions.reverse() } /** * Returns an array containing the positions of each alignment pattern. * Each array's element represent the center point of the pattern as (x, y) coordinates * * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords} * and filtering out the items that overlaps with finder pattern * * @example * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38. * The alignment patterns, therefore, are to be centered on (row, column) * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38). * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns * and are not therefore used for alignment patterns. * * let pos = getPositions(7) * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]] * * @param {Number} version QR Code version * @return {Array} Array of coordinates */ exports.getPositions = function getPositions (version) { const coords = [] const pos = exports.getRowColCoords(version) const posLength = pos.length for (let i = 0; i < posLength; i++) { for (let j = 0; j < posLength; j++) { // Skip if position is occupied by finder patterns if ((i === 0 && j === 0) || // top-left (i === 0 && j === posLength - 1) || // bottom-left (i === posLength - 1 && j === 0)) { // top-right continue } coords.push([pos[i], pos[j]]) } } return coords } soldair-node-qrcode-5d87b5f/lib/core/alphanumeric-data.js000066400000000000000000000034361465424452300234250ustar00rootroot00000000000000const Mode = require('./mode') /** * Array of characters available in alphanumeric mode * * As per QR Code specification, to each character * is assigned a value from 0 to 44 which in this case coincides * with the array index * * @type {Array} */ const ALPHA_NUM_CHARS = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', '$', '%', '*', '+', '-', '.', '/', ':' ] function AlphanumericData (data) { this.mode = Mode.ALPHANUMERIC this.data = data } AlphanumericData.getBitsLength = function getBitsLength (length) { return 11 * Math.floor(length / 2) + 6 * (length % 2) } AlphanumericData.prototype.getLength = function getLength () { return this.data.length } AlphanumericData.prototype.getBitsLength = function getBitsLength () { return AlphanumericData.getBitsLength(this.data.length) } AlphanumericData.prototype.write = function write (bitBuffer) { let i // Input data characters are divided into groups of two characters // and encoded as 11-bit binary codes. for (i = 0; i + 2 <= this.data.length; i += 2) { // The character value of the first character is multiplied by 45 let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45 // The character value of the second digit is added to the product value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1]) // The sum is then stored as 11-bit binary number bitBuffer.put(value, 11) } // If the number of input data characters is not a multiple of two, // the character value of the final character is encoded as a 6-bit binary number. if (this.data.length % 2) { bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6) } } module.exports = AlphanumericData soldair-node-qrcode-5d87b5f/lib/core/bit-buffer.js000066400000000000000000000013171465424452300220670ustar00rootroot00000000000000function BitBuffer () { this.buffer = [] this.length = 0 } BitBuffer.prototype = { get: function (index) { const bufIndex = Math.floor(index / 8) return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1 }, put: function (num, length) { for (let i = 0; i < length; i++) { this.putBit(((num >>> (length - i - 1)) & 1) === 1) } }, getLengthInBits: function () { return this.length }, putBit: function (bit) { const bufIndex = Math.floor(this.length / 8) if (this.buffer.length <= bufIndex) { this.buffer.push(0) } if (bit) { this.buffer[bufIndex] |= (0x80 >>> (this.length % 8)) } this.length++ } } module.exports = BitBuffer soldair-node-qrcode-5d87b5f/lib/core/bit-matrix.js000066400000000000000000000027351465424452300221270ustar00rootroot00000000000000/** * Helper class to handle QR Code symbol modules * * @param {Number} size Symbol size */ function BitMatrix (size) { if (!size || size < 1) { throw new Error('BitMatrix size must be defined and greater than 0') } this.size = size this.data = new Uint8Array(size * size) this.reservedBit = new Uint8Array(size * size) } /** * Set bit value at specified location * If reserved flag is set, this bit will be ignored during masking process * * @param {Number} row * @param {Number} col * @param {Boolean} value * @param {Boolean} reserved */ BitMatrix.prototype.set = function (row, col, value, reserved) { const index = row * this.size + col this.data[index] = value if (reserved) this.reservedBit[index] = true } /** * Returns bit value at specified location * * @param {Number} row * @param {Number} col * @return {Boolean} */ BitMatrix.prototype.get = function (row, col) { return this.data[row * this.size + col] } /** * Applies xor operator at specified location * (used during masking process) * * @param {Number} row * @param {Number} col * @param {Boolean} value */ BitMatrix.prototype.xor = function (row, col, value) { this.data[row * this.size + col] ^= value } /** * Check if bit at specified location is reserved * * @param {Number} row * @param {Number} col * @return {Boolean} */ BitMatrix.prototype.isReserved = function (row, col) { return this.reservedBit[row * this.size + col] } module.exports = BitMatrix soldair-node-qrcode-5d87b5f/lib/core/byte-data.js000066400000000000000000000012431465424452300217120ustar00rootroot00000000000000const Mode = require('./mode') function ByteData (data) { this.mode = Mode.BYTE if (typeof (data) === 'string') { this.data = new TextEncoder().encode(data) } else { this.data = new Uint8Array(data) } } ByteData.getBitsLength = function getBitsLength (length) { return length * 8 } ByteData.prototype.getLength = function getLength () { return this.data.length } ByteData.prototype.getBitsLength = function getBitsLength () { return ByteData.getBitsLength(this.data.length) } ByteData.prototype.write = function (bitBuffer) { for (let i = 0, l = this.data.length; i < l; i++) { bitBuffer.put(this.data[i], 8) } } module.exports = ByteData soldair-node-qrcode-5d87b5f/lib/core/error-correction-code.js000077500000000000000000000065271465424452300242630ustar00rootroot00000000000000const ECLevel = require('./error-correction-level') const EC_BLOCKS_TABLE = [ // L M Q H 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 4, 1, 2, 4, 4, 2, 4, 4, 4, 2, 4, 6, 5, 2, 4, 6, 6, 2, 5, 8, 8, 4, 5, 8, 8, 4, 5, 8, 11, 4, 8, 10, 11, 4, 9, 12, 16, 4, 9, 16, 16, 6, 10, 12, 18, 6, 10, 17, 16, 6, 11, 16, 19, 6, 13, 18, 21, 7, 14, 21, 25, 8, 16, 20, 25, 8, 17, 23, 25, 9, 17, 23, 34, 9, 18, 25, 30, 10, 20, 27, 32, 12, 21, 29, 35, 12, 23, 34, 37, 12, 25, 34, 40, 13, 26, 35, 42, 14, 28, 38, 45, 15, 29, 40, 48, 16, 31, 43, 51, 17, 33, 45, 54, 18, 35, 48, 57, 19, 37, 51, 60, 19, 38, 53, 63, 20, 40, 56, 66, 21, 43, 59, 70, 22, 45, 62, 74, 24, 47, 65, 77, 25, 49, 68, 81 ] const EC_CODEWORDS_TABLE = [ // L M Q H 7, 10, 13, 17, 10, 16, 22, 28, 15, 26, 36, 44, 20, 36, 52, 64, 26, 48, 72, 88, 36, 64, 96, 112, 40, 72, 108, 130, 48, 88, 132, 156, 60, 110, 160, 192, 72, 130, 192, 224, 80, 150, 224, 264, 96, 176, 260, 308, 104, 198, 288, 352, 120, 216, 320, 384, 132, 240, 360, 432, 144, 280, 408, 480, 168, 308, 448, 532, 180, 338, 504, 588, 196, 364, 546, 650, 224, 416, 600, 700, 224, 442, 644, 750, 252, 476, 690, 816, 270, 504, 750, 900, 300, 560, 810, 960, 312, 588, 870, 1050, 336, 644, 952, 1110, 360, 700, 1020, 1200, 390, 728, 1050, 1260, 420, 784, 1140, 1350, 450, 812, 1200, 1440, 480, 868, 1290, 1530, 510, 924, 1350, 1620, 540, 980, 1440, 1710, 570, 1036, 1530, 1800, 570, 1064, 1590, 1890, 600, 1120, 1680, 1980, 630, 1204, 1770, 2100, 660, 1260, 1860, 2220, 720, 1316, 1950, 2310, 750, 1372, 2040, 2430 ] /** * Returns the number of error correction block that the QR Code should contain * for the specified version and error correction level. * * @param {Number} version QR Code version * @param {Number} errorCorrectionLevel Error correction level * @return {Number} Number of error correction blocks */ exports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) { switch (errorCorrectionLevel) { case ECLevel.L: return EC_BLOCKS_TABLE[(version - 1) * 4 + 0] case ECLevel.M: return EC_BLOCKS_TABLE[(version - 1) * 4 + 1] case ECLevel.Q: return EC_BLOCKS_TABLE[(version - 1) * 4 + 2] case ECLevel.H: return EC_BLOCKS_TABLE[(version - 1) * 4 + 3] default: return undefined } } /** * Returns the number of error correction codewords to use for the specified * version and error correction level. * * @param {Number} version QR Code version * @param {Number} errorCorrectionLevel Error correction level * @return {Number} Number of error correction codewords */ exports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) { switch (errorCorrectionLevel) { case ECLevel.L: return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0] case ECLevel.M: return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1] case ECLevel.Q: return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2] case ECLevel.H: return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3] default: return undefined } } soldair-node-qrcode-5d87b5f/lib/core/error-correction-level.js000066400000000000000000000015751465424452300244530ustar00rootroot00000000000000exports.L = { bit: 1 } exports.M = { bit: 0 } exports.Q = { bit: 3 } exports.H = { bit: 2 } function fromString (string) { if (typeof string !== 'string') { throw new Error('Param is not a string') } const lcStr = string.toLowerCase() switch (lcStr) { case 'l': case 'low': return exports.L case 'm': case 'medium': return exports.M case 'q': case 'quartile': return exports.Q case 'h': case 'high': return exports.H default: throw new Error('Unknown EC Level: ' + string) } } exports.isValid = function isValid (level) { return level && typeof level.bit !== 'undefined' && level.bit >= 0 && level.bit < 4 } exports.from = function from (value, defaultValue) { if (exports.isValid(value)) { return value } try { return fromString(value) } catch (e) { return defaultValue } } soldair-node-qrcode-5d87b5f/lib/core/finder-pattern.js000066400000000000000000000011271465424452300227630ustar00rootroot00000000000000const getSymbolSize = require('./utils').getSymbolSize const FINDER_PATTERN_SIZE = 7 /** * Returns an array containing the positions of each finder pattern. * Each array's element represent the top-left point of the pattern as (x, y) coordinates * * @param {Number} version QR Code version * @return {Array} Array of coordinates */ exports.getPositions = function getPositions (version) { const size = getSymbolSize(version) return [ // top-left [0, 0], // top-right [size - FINDER_PATTERN_SIZE, 0], // bottom-left [0, size - FINDER_PATTERN_SIZE] ] } soldair-node-qrcode-5d87b5f/lib/core/format-info.js000066400000000000000000000021461465424452300222640ustar00rootroot00000000000000const Utils = require('./utils') const G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0) const G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1) const G15_BCH = Utils.getBCHDigit(G15) /** * Returns format information with relative error correction bits * * The format information is a 15-bit sequence containing 5 data bits, * with 10 error correction bits calculated using the (15, 5) BCH code. * * @param {Number} errorCorrectionLevel Error correction level * @param {Number} mask Mask pattern * @return {Number} Encoded format information bits */ exports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) { const data = ((errorCorrectionLevel.bit << 3) | mask) let d = data << 10 while (Utils.getBCHDigit(d) - G15_BCH >= 0) { d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH)) } // xor final data with mask pattern in order to ensure that // no combination of Error Correction Level and data mask pattern // will result in an all-zero data string return ((data << 10) | d) ^ G15_MASK } soldair-node-qrcode-5d87b5f/lib/core/galois-field.js000066400000000000000000000035531465424452300224050ustar00rootroot00000000000000const EXP_TABLE = new Uint8Array(512) const LOG_TABLE = new Uint8Array(256) /** * Precompute the log and anti-log tables for faster computation later * * For each possible value in the galois field 2^8, we will pre-compute * the logarithm and anti-logarithm (exponential) of this value * * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields} */ ;(function initTables () { let x = 1 for (let i = 0; i < 255; i++) { EXP_TABLE[i] = x LOG_TABLE[x] = i x <<= 1 // multiply by 2 // The QR code specification says to use byte-wise modulo 100011101 arithmetic. // This means that when a number is 256 or larger, it should be XORed with 0x11D. if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256) x ^= 0x11D } } // Optimization: double the size of the anti-log table so that we don't need to mod 255 to // stay inside the bounds (because we will mainly use this table for the multiplication of // two GF numbers, no more). // @see {@link mul} for (let i = 255; i < 512; i++) { EXP_TABLE[i] = EXP_TABLE[i - 255] } }()) /** * Returns log value of n inside Galois Field * * @param {Number} n * @return {Number} */ exports.log = function log (n) { if (n < 1) throw new Error('log(' + n + ')') return LOG_TABLE[n] } /** * Returns anti-log value of n inside Galois Field * * @param {Number} n * @return {Number} */ exports.exp = function exp (n) { return EXP_TABLE[n] } /** * Multiplies two number inside Galois Field * * @param {Number} x * @param {Number} y * @return {Number} */ exports.mul = function mul (x, y) { if (x === 0 || y === 0) return 0 // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized // @see {@link initTables} return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]] } soldair-node-qrcode-5d87b5f/lib/core/kanji-data.js000066400000000000000000000030601465424452300220420ustar00rootroot00000000000000const Mode = require('./mode') const Utils = require('./utils') function KanjiData (data) { this.mode = Mode.KANJI this.data = data } KanjiData.getBitsLength = function getBitsLength (length) { return length * 13 } KanjiData.prototype.getLength = function getLength () { return this.data.length } KanjiData.prototype.getBitsLength = function getBitsLength () { return KanjiData.getBitsLength(this.data.length) } KanjiData.prototype.write = function (bitBuffer) { let i // In the Shift JIS system, Kanji characters are represented by a two byte combination. // These byte values are shifted from the JIS X 0208 values. // JIS X 0208 gives details of the shift coded representation. for (i = 0; i < this.data.length; i++) { let value = Utils.toSJIS(this.data[i]) // For characters with Shift JIS values from 0x8140 to 0x9FFC: if (value >= 0x8140 && value <= 0x9FFC) { // Subtract 0x8140 from Shift JIS value value -= 0x8140 // For characters with Shift JIS values from 0xE040 to 0xEBBF } else if (value >= 0xE040 && value <= 0xEBBF) { // Subtract 0xC140 from Shift JIS value value -= 0xC140 } else { throw new Error( 'Invalid SJIS character: ' + this.data[i] + '\n' + 'Make sure your charset is UTF-8') } // Multiply most significant byte of result by 0xC0 // and add least significant byte to product value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff) // Convert result to a 13-bit binary string bitBuffer.put(value, 13) } } module.exports = KanjiData soldair-node-qrcode-5d87b5f/lib/core/mask-pattern.js000066400000000000000000000137251465424452300224560ustar00rootroot00000000000000/** * Data mask pattern reference * @type {Object} */ exports.Patterns = { PATTERN000: 0, PATTERN001: 1, PATTERN010: 2, PATTERN011: 3, PATTERN100: 4, PATTERN101: 5, PATTERN110: 6, PATTERN111: 7 } /** * Weighted penalty scores for the undesirable features * @type {Object} */ const PenaltyScores = { N1: 3, N2: 3, N3: 40, N4: 10 } /** * Check if mask pattern value is valid * * @param {Number} mask Mask pattern * @return {Boolean} true if valid, false otherwise */ exports.isValid = function isValid (mask) { return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7 } /** * Returns mask pattern from a value. * If value is not valid, returns undefined * * @param {Number|String} value Mask pattern value * @return {Number} Valid mask pattern or undefined */ exports.from = function from (value) { return exports.isValid(value) ? parseInt(value, 10) : undefined } /** * Find adjacent modules in row/column with the same color * and assign a penalty value. * * Points: N1 + i * i is the amount by which the number of adjacent modules of the same color exceeds 5 */ exports.getPenaltyN1 = function getPenaltyN1 (data) { const size = data.size let points = 0 let sameCountCol = 0 let sameCountRow = 0 let lastCol = null let lastRow = null for (let row = 0; row < size; row++) { sameCountCol = sameCountRow = 0 lastCol = lastRow = null for (let col = 0; col < size; col++) { let module = data.get(row, col) if (module === lastCol) { sameCountCol++ } else { if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5) lastCol = module sameCountCol = 1 } module = data.get(col, row) if (module === lastRow) { sameCountRow++ } else { if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5) lastRow = module sameCountRow = 1 } } if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5) if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5) } return points } /** * Find 2x2 blocks with the same color and assign a penalty value * * Points: N2 * (m - 1) * (n - 1) */ exports.getPenaltyN2 = function getPenaltyN2 (data) { const size = data.size let points = 0 for (let row = 0; row < size - 1; row++) { for (let col = 0; col < size - 1; col++) { const last = data.get(row, col) + data.get(row, col + 1) + data.get(row + 1, col) + data.get(row + 1, col + 1) if (last === 4 || last === 0) points++ } } return points * PenaltyScores.N2 } /** * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column, * preceded or followed by light area 4 modules wide * * Points: N3 * number of pattern found */ exports.getPenaltyN3 = function getPenaltyN3 (data) { const size = data.size let points = 0 let bitsCol = 0 let bitsRow = 0 for (let row = 0; row < size; row++) { bitsCol = bitsRow = 0 for (let col = 0; col < size; col++) { bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col) if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++ bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row) if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++ } } return points * PenaltyScores.N3 } /** * Calculate proportion of dark modules in entire symbol * * Points: N4 * k * * k is the rating of the deviation of the proportion of dark modules * in the symbol from 50% in steps of 5% */ exports.getPenaltyN4 = function getPenaltyN4 (data) { let darkCount = 0 const modulesCount = data.data.length for (let i = 0; i < modulesCount; i++) darkCount += data.data[i] const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10) return k * PenaltyScores.N4 } /** * Return mask value at given position * * @param {Number} maskPattern Pattern reference value * @param {Number} i Row * @param {Number} j Column * @return {Boolean} Mask value */ function getMaskAt (maskPattern, i, j) { switch (maskPattern) { case exports.Patterns.PATTERN000: return (i + j) % 2 === 0 case exports.Patterns.PATTERN001: return i % 2 === 0 case exports.Patterns.PATTERN010: return j % 3 === 0 case exports.Patterns.PATTERN011: return (i + j) % 3 === 0 case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0 case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0 case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0 case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0 default: throw new Error('bad maskPattern:' + maskPattern) } } /** * Apply a mask pattern to a BitMatrix * * @param {Number} pattern Pattern reference number * @param {BitMatrix} data BitMatrix data */ exports.applyMask = function applyMask (pattern, data) { const size = data.size for (let col = 0; col < size; col++) { for (let row = 0; row < size; row++) { if (data.isReserved(row, col)) continue data.xor(row, col, getMaskAt(pattern, row, col)) } } } /** * Returns the best mask pattern for data * * @param {BitMatrix} data * @return {Number} Mask pattern reference number */ exports.getBestMask = function getBestMask (data, setupFormatFunc) { const numPatterns = Object.keys(exports.Patterns).length let bestPattern = 0 let lowerPenalty = Infinity for (let p = 0; p < numPatterns; p++) { setupFormatFunc(p) exports.applyMask(p, data) // Calculate penalty const penalty = exports.getPenaltyN1(data) + exports.getPenaltyN2(data) + exports.getPenaltyN3(data) + exports.getPenaltyN4(data) // Undo previously applied mask exports.applyMask(p, data) if (penalty < lowerPenalty) { lowerPenalty = penalty bestPattern = p } } return bestPattern } soldair-node-qrcode-5d87b5f/lib/core/mode.js000066400000000000000000000076171465424452300207770ustar00rootroot00000000000000const VersionCheck = require('./version-check') const Regex = require('./regex') /** * Numeric mode encodes data from the decimal digit set (0 - 9) * (byte values 30HEX to 39HEX). * Normally, 3 data characters are represented by 10 bits. * * @type {Object} */ exports.NUMERIC = { id: 'Numeric', bit: 1 << 0, ccBits: [10, 12, 14] } /** * Alphanumeric mode encodes data from a set of 45 characters, * i.e. 10 numeric digits (0 - 9), * 26 alphabetic characters (A - Z), * and 9 symbols (SP, $, %, *, +, -, ., /, :). * Normally, two input characters are represented by 11 bits. * * @type {Object} */ exports.ALPHANUMERIC = { id: 'Alphanumeric', bit: 1 << 1, ccBits: [9, 11, 13] } /** * In byte mode, data is encoded at 8 bits per character. * * @type {Object} */ exports.BYTE = { id: 'Byte', bit: 1 << 2, ccBits: [8, 16, 16] } /** * The Kanji mode efficiently encodes Kanji characters in accordance with * the Shift JIS system based on JIS X 0208. * The Shift JIS values are shifted from the JIS X 0208 values. * JIS X 0208 gives details of the shift coded representation. * Each two-byte character value is compacted to a 13-bit binary codeword. * * @type {Object} */ exports.KANJI = { id: 'Kanji', bit: 1 << 3, ccBits: [8, 10, 12] } /** * Mixed mode will contain a sequences of data in a combination of any of * the modes described above * * @type {Object} */ exports.MIXED = { bit: -1 } /** * Returns the number of bits needed to store the data length * according to QR Code specifications. * * @param {Mode} mode Data mode * @param {Number} version QR Code version * @return {Number} Number of bits */ exports.getCharCountIndicator = function getCharCountIndicator (mode, version) { if (!mode.ccBits) throw new Error('Invalid mode: ' + mode) if (!VersionCheck.isValid(version)) { throw new Error('Invalid version: ' + version) } if (version >= 1 && version < 10) return mode.ccBits[0] else if (version < 27) return mode.ccBits[1] return mode.ccBits[2] } /** * Returns the most efficient mode to store the specified data * * @param {String} dataStr Input data string * @return {Mode} Best mode */ exports.getBestModeForData = function getBestModeForData (dataStr) { if (Regex.testNumeric(dataStr)) return exports.NUMERIC else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC else if (Regex.testKanji(dataStr)) return exports.KANJI else return exports.BYTE } /** * Return mode name as string * * @param {Mode} mode Mode object * @returns {String} Mode name */ exports.toString = function toString (mode) { if (mode && mode.id) return mode.id throw new Error('Invalid mode') } /** * Check if input param is a valid mode object * * @param {Mode} mode Mode object * @returns {Boolean} True if valid mode, false otherwise */ exports.isValid = function isValid (mode) { return mode && mode.bit && mode.ccBits } /** * Get mode object from its name * * @param {String} string Mode name * @returns {Mode} Mode object */ function fromString (string) { if (typeof string !== 'string') { throw new Error('Param is not a string') } const lcStr = string.toLowerCase() switch (lcStr) { case 'numeric': return exports.NUMERIC case 'alphanumeric': return exports.ALPHANUMERIC case 'kanji': return exports.KANJI case 'byte': return exports.BYTE default: throw new Error('Unknown mode: ' + string) } } /** * Returns mode from a value. * If value is not a valid mode, returns defaultValue * * @param {Mode|String} value Encoding mode * @param {Mode} defaultValue Fallback value * @return {Mode} Encoding mode */ exports.from = function from (value, defaultValue) { if (exports.isValid(value)) { return value } try { return fromString(value) } catch (e) { return defaultValue } } soldair-node-qrcode-5d87b5f/lib/core/numeric-data.js000066400000000000000000000022731465424452300224150ustar00rootroot00000000000000const Mode = require('./mode') function NumericData (data) { this.mode = Mode.NUMERIC this.data = data.toString() } NumericData.getBitsLength = function getBitsLength (length) { return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0) } NumericData.prototype.getLength = function getLength () { return this.data.length } NumericData.prototype.getBitsLength = function getBitsLength () { return NumericData.getBitsLength(this.data.length) } NumericData.prototype.write = function write (bitBuffer) { let i, group, value // The input data string is divided into groups of three digits, // and each group is converted to its 10-bit binary equivalent. for (i = 0; i + 3 <= this.data.length; i += 3) { group = this.data.substr(i, 3) value = parseInt(group, 10) bitBuffer.put(value, 10) } // If the number of input digits is not an exact multiple of three, // the final one or two digits are converted to 4 or 7 bits respectively. const remainingNum = this.data.length - i if (remainingNum > 0) { group = this.data.substr(i) value = parseInt(group, 10) bitBuffer.put(value, remainingNum * 3 + 1) } } module.exports = NumericData soldair-node-qrcode-5d87b5f/lib/core/polynomial.js000066400000000000000000000030651465424452300222270ustar00rootroot00000000000000const GF = require('./galois-field') /** * Multiplies two polynomials inside Galois Field * * @param {Uint8Array} p1 Polynomial * @param {Uint8Array} p2 Polynomial * @return {Uint8Array} Product of p1 and p2 */ exports.mul = function mul (p1, p2) { const coeff = new Uint8Array(p1.length + p2.length - 1) for (let i = 0; i < p1.length; i++) { for (let j = 0; j < p2.length; j++) { coeff[i + j] ^= GF.mul(p1[i], p2[j]) } } return coeff } /** * Calculate the remainder of polynomials division * * @param {Uint8Array} divident Polynomial * @param {Uint8Array} divisor Polynomial * @return {Uint8Array} Remainder */ exports.mod = function mod (divident, divisor) { let result = new Uint8Array(divident) while ((result.length - divisor.length) >= 0) { const coeff = result[0] for (let i = 0; i < divisor.length; i++) { result[i] ^= GF.mul(divisor[i], coeff) } // remove all zeros from buffer head let offset = 0 while (offset < result.length && result[offset] === 0) offset++ result = result.slice(offset) } return result } /** * Generate an irreducible generator polynomial of specified degree * (used by Reed-Solomon encoder) * * @param {Number} degree Degree of the generator polynomial * @return {Uint8Array} Buffer containing polynomial coefficients */ exports.generateECPolynomial = function generateECPolynomial (degree) { let poly = new Uint8Array([1]) for (let i = 0; i < degree; i++) { poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)])) } return poly } soldair-node-qrcode-5d87b5f/lib/core/qrcode.js000066400000000000000000000354301465424452300213220ustar00rootroot00000000000000const Utils = require('./utils') const ECLevel = require('./error-correction-level') const BitBuffer = require('./bit-buffer') const BitMatrix = require('./bit-matrix') const AlignmentPattern = require('./alignment-pattern') const FinderPattern = require('./finder-pattern') const MaskPattern = require('./mask-pattern') const ECCode = require('./error-correction-code') const ReedSolomonEncoder = require('./reed-solomon-encoder') const Version = require('./version') const FormatInfo = require('./format-info') const Mode = require('./mode') const Segments = require('./segments') /** * QRCode for JavaScript * * modified by Ryan Day for nodejs support * Copyright (c) 2011 Ryan Day * * Licensed under the MIT license: * http://www.opensource.org/licenses/mit-license.php * //--------------------------------------------------------------------- // QRCode for JavaScript // // Copyright (c) 2009 Kazuhiko Arase // // URL: http://www.d-project.com/ // // Licensed under the MIT license: // http://www.opensource.org/licenses/mit-license.php // // The word "QR Code" is registered trademark of // DENSO WAVE INCORPORATED // http://www.denso-wave.com/qrcode/faqpatent-e.html // //--------------------------------------------------------------------- */ /** * Add finder patterns bits to matrix * * @param {BitMatrix} matrix Modules matrix * @param {Number} version QR Code version */ function setupFinderPattern (matrix, version) { const size = matrix.size const pos = FinderPattern.getPositions(version) for (let i = 0; i < pos.length; i++) { const row = pos[i][0] const col = pos[i][1] for (let r = -1; r <= 7; r++) { if (row + r <= -1 || size <= row + r) continue for (let c = -1; c <= 7; c++) { if (col + c <= -1 || size <= col + c) continue if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) || (c >= 0 && c <= 6 && (r === 0 || r === 6)) || (r >= 2 && r <= 4 && c >= 2 && c <= 4)) { matrix.set(row + r, col + c, true, true) } else { matrix.set(row + r, col + c, false, true) } } } } } /** * Add timing pattern bits to matrix * * Note: this function must be called before {@link setupAlignmentPattern} * * @param {BitMatrix} matrix Modules matrix */ function setupTimingPattern (matrix) { const size = matrix.size for (let r = 8; r < size - 8; r++) { const value = r % 2 === 0 matrix.set(r, 6, value, true) matrix.set(6, r, value, true) } } /** * Add alignment patterns bits to matrix * * Note: this function must be called after {@link setupTimingPattern} * * @param {BitMatrix} matrix Modules matrix * @param {Number} version QR Code version */ function setupAlignmentPattern (matrix, version) { const pos = AlignmentPattern.getPositions(version) for (let i = 0; i < pos.length; i++) { const row = pos[i][0] const col = pos[i][1] for (let r = -2; r <= 2; r++) { for (let c = -2; c <= 2; c++) { if (r === -2 || r === 2 || c === -2 || c === 2 || (r === 0 && c === 0)) { matrix.set(row + r, col + c, true, true) } else { matrix.set(row + r, col + c, false, true) } } } } } /** * Add version info bits to matrix * * @param {BitMatrix} matrix Modules matrix * @param {Number} version QR Code version */ function setupVersionInfo (matrix, version) { const size = matrix.size const bits = Version.getEncodedBits(version) let row, col, mod for (let i = 0; i < 18; i++) { row = Math.floor(i / 3) col = i % 3 + size - 8 - 3 mod = ((bits >> i) & 1) === 1 matrix.set(row, col, mod, true) matrix.set(col, row, mod, true) } } /** * Add format info bits to matrix * * @param {BitMatrix} matrix Modules matrix * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level * @param {Number} maskPattern Mask pattern reference value */ function setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) { const size = matrix.size const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern) let i, mod for (i = 0; i < 15; i++) { mod = ((bits >> i) & 1) === 1 // vertical if (i < 6) { matrix.set(i, 8, mod, true) } else if (i < 8) { matrix.set(i + 1, 8, mod, true) } else { matrix.set(size - 15 + i, 8, mod, true) } // horizontal if (i < 8) { matrix.set(8, size - i - 1, mod, true) } else if (i < 9) { matrix.set(8, 15 - i - 1 + 1, mod, true) } else { matrix.set(8, 15 - i - 1, mod, true) } } // fixed module matrix.set(size - 8, 8, 1, true) } /** * Add encoded data bits to matrix * * @param {BitMatrix} matrix Modules matrix * @param {Uint8Array} data Data codewords */ function setupData (matrix, data) { const size = matrix.size let inc = -1 let row = size - 1 let bitIndex = 7 let byteIndex = 0 for (let col = size - 1; col > 0; col -= 2) { if (col === 6) col-- while (true) { for (let c = 0; c < 2; c++) { if (!matrix.isReserved(row, col - c)) { let dark = false if (byteIndex < data.length) { dark = (((data[byteIndex] >>> bitIndex) & 1) === 1) } matrix.set(row, col - c, dark) bitIndex-- if (bitIndex === -1) { byteIndex++ bitIndex = 7 } } } row += inc if (row < 0 || size <= row) { row -= inc inc = -inc break } } } } /** * Create encoded codewords from data input * * @param {Number} version QR Code version * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level * @param {ByteData} data Data input * @return {Uint8Array} Buffer containing encoded codewords */ function createData (version, errorCorrectionLevel, segments) { // Prepare data buffer const buffer = new BitBuffer() segments.forEach(function (data) { // prefix data with mode indicator (4 bits) buffer.put(data.mode.bit, 4) // Prefix data with character count indicator. // The character count indicator is a string of bits that represents the // number of characters that are being encoded. // The character count indicator must be placed after the mode indicator // and must be a certain number of bits long, depending on the QR version // and data mode // @see {@link Mode.getCharCountIndicator}. buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version)) // add binary data sequence to buffer data.write(buffer) }) // Calculate required number of bits const totalCodewords = Utils.getSymbolTotalCodewords(version) const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel) const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8 // Add a terminator. // If the bit string is shorter than the total number of required bits, // a terminator of up to four 0s must be added to the right side of the string. // If the bit string is more than four bits shorter than the required number of bits, // add four 0s to the end. if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) { buffer.put(0, 4) } // If the bit string is fewer than four bits shorter, add only the number of 0s that // are needed to reach the required number of bits. // After adding the terminator, if the number of bits in the string is not a multiple of 8, // pad the string on the right with 0s to make the string's length a multiple of 8. while (buffer.getLengthInBits() % 8 !== 0) { buffer.putBit(0) } // Add pad bytes if the string is still shorter than the total number of required bits. // Extend the buffer to fill the data capacity of the symbol corresponding to // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC) // and 00010001 (0x11) alternately. const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8 for (let i = 0; i < remainingByte; i++) { buffer.put(i % 2 ? 0x11 : 0xEC, 8) } return createCodewords(buffer, version, errorCorrectionLevel) } /** * Encode input data with Reed-Solomon and return codewords with * relative error correction bits * * @param {BitBuffer} bitBuffer Data to encode * @param {Number} version QR Code version * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level * @return {Uint8Array} Buffer containing encoded codewords */ function createCodewords (bitBuffer, version, errorCorrectionLevel) { // Total codewords for this QR code version (Data + Error correction) const totalCodewords = Utils.getSymbolTotalCodewords(version) // Total number of error correction codewords const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel) // Total number of data codewords const dataTotalCodewords = totalCodewords - ecTotalCodewords // Total number of blocks const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel) // Calculate how many blocks each group should contain const blocksInGroup2 = totalCodewords % ecTotalBlocks const blocksInGroup1 = ecTotalBlocks - blocksInGroup2 const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks) const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks) const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1 // Number of EC codewords is the same for both groups const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1 // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount const rs = new ReedSolomonEncoder(ecCount) let offset = 0 const dcData = new Array(ecTotalBlocks) const ecData = new Array(ecTotalBlocks) let maxDataSize = 0 const buffer = new Uint8Array(bitBuffer.buffer) // Divide the buffer into the required number of blocks for (let b = 0; b < ecTotalBlocks; b++) { const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2 // extract a block of data from buffer dcData[b] = buffer.slice(offset, offset + dataSize) // Calculate EC codewords for this data block ecData[b] = rs.encode(dcData[b]) offset += dataSize maxDataSize = Math.max(maxDataSize, dataSize) } // Create final data // Interleave the data and error correction codewords from each block const data = new Uint8Array(totalCodewords) let index = 0 let i, r // Add data codewords for (i = 0; i < maxDataSize; i++) { for (r = 0; r < ecTotalBlocks; r++) { if (i < dcData[r].length) { data[index++] = dcData[r][i] } } } // Apped EC codewords for (i = 0; i < ecCount; i++) { for (r = 0; r < ecTotalBlocks; r++) { data[index++] = ecData[r][i] } } return data } /** * Build QR Code symbol * * @param {String} data Input string * @param {Number} version QR Code version * @param {ErrorCorretionLevel} errorCorrectionLevel Error level * @param {MaskPattern} maskPattern Mask pattern * @return {Object} Object containing symbol data */ function createSymbol (data, version, errorCorrectionLevel, maskPattern) { let segments if (Array.isArray(data)) { segments = Segments.fromArray(data) } else if (typeof data === 'string') { let estimatedVersion = version if (!estimatedVersion) { const rawSegments = Segments.rawSplit(data) // Estimate best version that can contain raw splitted segments estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel) } // Build optimized segments // If estimated version is undefined, try with the highest version segments = Segments.fromString(data, estimatedVersion || 40) } else { throw new Error('Invalid data') } // Get the min version that can contain data const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel) // If no version is found, data cannot be stored if (!bestVersion) { throw new Error('The amount of data is too big to be stored in a QR Code') } // If not specified, use min version as default if (!version) { version = bestVersion // Check if the specified version can contain the data } else if (version < bestVersion) { throw new Error('\n' + 'The chosen QR Code version cannot contain this amount of data.\n' + 'Minimum version required to store current data is: ' + bestVersion + '.\n' ) } const dataBits = createData(version, errorCorrectionLevel, segments) // Allocate matrix buffer const moduleCount = Utils.getSymbolSize(version) const modules = new BitMatrix(moduleCount) // Add function modules setupFinderPattern(modules, version) setupTimingPattern(modules) setupAlignmentPattern(modules, version) // Add temporary dummy bits for format info just to set them as reserved. // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask} // since the masking operation must be performed only on the encoding region. // These blocks will be replaced with correct values later in code. setupFormatInfo(modules, errorCorrectionLevel, 0) if (version >= 7) { setupVersionInfo(modules, version) } // Add data codewords setupData(modules, dataBits) if (isNaN(maskPattern)) { // Find best mask pattern maskPattern = MaskPattern.getBestMask(modules, setupFormatInfo.bind(null, modules, errorCorrectionLevel)) } // Apply mask pattern MaskPattern.applyMask(maskPattern, modules) // Replace format info bits with correct values setupFormatInfo(modules, errorCorrectionLevel, maskPattern) return { modules: modules, version: version, errorCorrectionLevel: errorCorrectionLevel, maskPattern: maskPattern, segments: segments } } /** * QR Code * * @param {String | Array} data Input data * @param {Object} options Optional configurations * @param {Number} options.version QR Code version * @param {String} options.errorCorrectionLevel Error correction level * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis */ exports.create = function create (data, options) { if (typeof data === 'undefined' || data === '') { throw new Error('No input text') } let errorCorrectionLevel = ECLevel.M let version let mask if (typeof options !== 'undefined') { // Use higher error correction level as default errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M) version = Version.from(options.version) mask = MaskPattern.from(options.maskPattern) if (options.toSJISFunc) { Utils.setToSJISFunction(options.toSJISFunc) } } return createSymbol(data, version, errorCorrectionLevel, mask) } soldair-node-qrcode-5d87b5f/lib/core/reed-solomon-encoder.js000066400000000000000000000031311465424452300240560ustar00rootroot00000000000000const Polynomial = require('./polynomial') function ReedSolomonEncoder (degree) { this.genPoly = undefined this.degree = degree if (this.degree) this.initialize(this.degree) } /** * Initialize the encoder. * The input param should correspond to the number of error correction codewords. * * @param {Number} degree */ ReedSolomonEncoder.prototype.initialize = function initialize (degree) { // create an irreducible generator polynomial this.degree = degree this.genPoly = Polynomial.generateECPolynomial(this.degree) } /** * Encodes a chunk of data * * @param {Uint8Array} data Buffer containing input data * @return {Uint8Array} Buffer containing encoded data */ ReedSolomonEncoder.prototype.encode = function encode (data) { if (!this.genPoly) { throw new Error('Encoder not initialized') } // Calculate EC for this data block // extends data size to data+genPoly size const paddedData = new Uint8Array(data.length + this.degree) paddedData.set(data) // The error correction codewords are the remainder after dividing the data codewords // by a generator polynomial const remainder = Polynomial.mod(paddedData, this.genPoly) // return EC data blocks (last n byte, where n is the degree of genPoly) // If coefficients number in remainder are less than genPoly degree, // pad with 0s to the left to reach the needed number of coefficients const start = this.degree - remainder.length if (start > 0) { const buff = new Uint8Array(this.degree) buff.set(remainder, start) return buff } return remainder } module.exports = ReedSolomonEncoder soldair-node-qrcode-5d87b5f/lib/core/regex.js000066400000000000000000000020741465424452300211550ustar00rootroot00000000000000const numeric = '[0-9]+' const alphanumeric = '[A-Z $%*+\\-./:]+' let kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' + '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' + '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' + '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+' kanji = kanji.replace(/u/g, '\\u') const byte = '(?:(?![A-Z0-9 $%*+\\-./:]|' + kanji + ')(?:.|[\r\n]))+' exports.KANJI = new RegExp(kanji, 'g') exports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\-./:]+', 'g') exports.BYTE = new RegExp(byte, 'g') exports.NUMERIC = new RegExp(numeric, 'g') exports.ALPHANUMERIC = new RegExp(alphanumeric, 'g') const TEST_KANJI = new RegExp('^' + kanji + '$') const TEST_NUMERIC = new RegExp('^' + numeric + '$') const TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\-./:]+$') exports.testKanji = function testKanji (str) { return TEST_KANJI.test(str) } exports.testNumeric = function testNumeric (str) { return TEST_NUMERIC.test(str) } exports.testAlphanumeric = function testAlphanumeric (str) { return TEST_ALPHANUMERIC.test(str) } soldair-node-qrcode-5d87b5f/lib/core/segments.js000066400000000000000000000221631465424452300216710ustar00rootroot00000000000000const Mode = require('./mode') const NumericData = require('./numeric-data') const AlphanumericData = require('./alphanumeric-data') const ByteData = require('./byte-data') const KanjiData = require('./kanji-data') const Regex = require('./regex') const Utils = require('./utils') const dijkstra = require('dijkstrajs') /** * Returns UTF8 byte length * * @param {String} str Input string * @return {Number} Number of byte */ function getStringByteLength (str) { return unescape(encodeURIComponent(str)).length } /** * Get a list of segments of the specified mode * from a string * * @param {Mode} mode Segment mode * @param {String} str String to process * @return {Array} Array of object with segments data */ function getSegments (regex, mode, str) { const segments = [] let result while ((result = regex.exec(str)) !== null) { segments.push({ data: result[0], index: result.index, mode: mode, length: result[0].length }) } return segments } /** * Extracts a series of segments with the appropriate * modes from a string * * @param {String} dataStr Input string * @return {Array} Array of object with segments data */ function getSegmentsFromString (dataStr) { const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr) const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr) let byteSegs let kanjiSegs if (Utils.isKanjiModeEnabled()) { byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr) kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr) } else { byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr) kanjiSegs = [] } const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs) return segs .sort(function (s1, s2) { return s1.index - s2.index }) .map(function (obj) { return { data: obj.data, mode: obj.mode, length: obj.length } }) } /** * Returns how many bits are needed to encode a string of * specified length with the specified mode * * @param {Number} length String length * @param {Mode} mode Segment mode * @return {Number} Bit length */ function getSegmentBitsLength (length, mode) { switch (mode) { case Mode.NUMERIC: return NumericData.getBitsLength(length) case Mode.ALPHANUMERIC: return AlphanumericData.getBitsLength(length) case Mode.KANJI: return KanjiData.getBitsLength(length) case Mode.BYTE: return ByteData.getBitsLength(length) } } /** * Merges adjacent segments which have the same mode * * @param {Array} segs Array of object with segments data * @return {Array} Array of object with segments data */ function mergeSegments (segs) { return segs.reduce(function (acc, curr) { const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null if (prevSeg && prevSeg.mode === curr.mode) { acc[acc.length - 1].data += curr.data return acc } acc.push(curr) return acc }, []) } /** * Generates a list of all possible nodes combination which * will be used to build a segments graph. * * Nodes are divided by groups. Each group will contain a list of all the modes * in which is possible to encode the given text. * * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte. * The group for '12345' will contain then 3 objects, one for each * possible encoding mode. * * Each node represents a possible segment. * * @param {Array} segs Array of object with segments data * @return {Array} Array of object with segments data */ function buildNodes (segs) { const nodes = [] for (let i = 0; i < segs.length; i++) { const seg = segs[i] switch (seg.mode) { case Mode.NUMERIC: nodes.push([seg, { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length }, { data: seg.data, mode: Mode.BYTE, length: seg.length } ]) break case Mode.ALPHANUMERIC: nodes.push([seg, { data: seg.data, mode: Mode.BYTE, length: seg.length } ]) break case Mode.KANJI: nodes.push([seg, { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) } ]) break case Mode.BYTE: nodes.push([ { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) } ]) } } return nodes } /** * Builds a graph from a list of nodes. * All segments in each node group will be connected with all the segments of * the next group and so on. * * At each connection will be assigned a weight depending on the * segment's byte length. * * @param {Array} nodes Array of object with segments data * @param {Number} version QR Code version * @return {Object} Graph of all possible segments */ function buildGraph (nodes, version) { const table = {} const graph = { start: {} } let prevNodeIds = ['start'] for (let i = 0; i < nodes.length; i++) { const nodeGroup = nodes[i] const currentNodeIds = [] for (let j = 0; j < nodeGroup.length; j++) { const node = nodeGroup[j] const key = '' + i + j currentNodeIds.push(key) table[key] = { node: node, lastCount: 0 } graph[key] = {} for (let n = 0; n < prevNodeIds.length; n++) { const prevNodeId = prevNodeIds[n] if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) { graph[prevNodeId][key] = getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) - getSegmentBitsLength(table[prevNodeId].lastCount, node.mode) table[prevNodeId].lastCount += node.length } else { if (table[prevNodeId]) table[prevNodeId].lastCount = node.length graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) + 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost } } } prevNodeIds = currentNodeIds } for (let n = 0; n < prevNodeIds.length; n++) { graph[prevNodeIds[n]].end = 0 } return { map: graph, table: table } } /** * Builds a segment from a specified data and mode. * If a mode is not specified, the more suitable will be used. * * @param {String} data Input data * @param {Mode | String} modesHint Data mode * @return {Segment} Segment */ function buildSingleSegment (data, modesHint) { let mode const bestMode = Mode.getBestModeForData(data) mode = Mode.from(modesHint, bestMode) // Make sure data can be encoded if (mode !== Mode.BYTE && mode.bit < bestMode.bit) { throw new Error('"' + data + '"' + ' cannot be encoded with mode ' + Mode.toString(mode) + '.\n Suggested mode is: ' + Mode.toString(bestMode)) } // Use Mode.BYTE if Kanji support is disabled if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) { mode = Mode.BYTE } switch (mode) { case Mode.NUMERIC: return new NumericData(data) case Mode.ALPHANUMERIC: return new AlphanumericData(data) case Mode.KANJI: return new KanjiData(data) case Mode.BYTE: return new ByteData(data) } } /** * Builds a list of segments from an array. * Array can contain Strings or Objects with segment's info. * * For each item which is a string, will be generated a segment with the given * string and the more appropriate encoding mode. * * For each item which is an object, will be generated a segment with the given * data and mode. * Objects must contain at least the property "data". * If property "mode" is not present, the more suitable mode will be used. * * @param {Array} array Array of objects with segments data * @return {Array} Array of Segments */ exports.fromArray = function fromArray (array) { return array.reduce(function (acc, seg) { if (typeof seg === 'string') { acc.push(buildSingleSegment(seg, null)) } else if (seg.data) { acc.push(buildSingleSegment(seg.data, seg.mode)) } return acc }, []) } /** * Builds an optimized sequence of segments from a string, * which will produce the shortest possible bitstream. * * @param {String} data Input string * @param {Number} version QR Code version * @return {Array} Array of segments */ exports.fromString = function fromString (data, version) { const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled()) const nodes = buildNodes(segs) const graph = buildGraph(nodes, version) const path = dijkstra.find_path(graph.map, 'start', 'end') const optimizedSegs = [] for (let i = 1; i < path.length - 1; i++) { optimizedSegs.push(graph.table[path[i]].node) } return exports.fromArray(mergeSegments(optimizedSegs)) } /** * Splits a string in various segments with the modes which * best represent their content. * The produced segments are far from being optimized. * The output of this function is only used to estimate a QR Code version * which may contain the data. * * @param {string} data Input string * @return {Array} Array of segments */ exports.rawSplit = function rawSplit (data) { return exports.fromArray( getSegmentsFromString(data, Utils.isKanjiModeEnabled()) ) } soldair-node-qrcode-5d87b5f/lib/core/utils.js000066400000000000000000000031251465424452300212010ustar00rootroot00000000000000let toSJISFunction const CODEWORDS_COUNT = [ 0, // Not used 26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085, 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706 ] /** * Returns the QR Code size for the specified version * * @param {Number} version QR Code version * @return {Number} size of QR code */ exports.getSymbolSize = function getSymbolSize (version) { if (!version) throw new Error('"version" cannot be null or undefined') if (version < 1 || version > 40) throw new Error('"version" should be in range from 1 to 40') return version * 4 + 17 } /** * Returns the total number of codewords used to store data and EC information. * * @param {Number} version QR Code version * @return {Number} Data length in bits */ exports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) { return CODEWORDS_COUNT[version] } /** * Encode data with Bose-Chaudhuri-Hocquenghem * * @param {Number} data Value to encode * @return {Number} Encoded value */ exports.getBCHDigit = function (data) { let digit = 0 while (data !== 0) { digit++ data >>>= 1 } return digit } exports.setToSJISFunction = function setToSJISFunction (f) { if (typeof f !== 'function') { throw new Error('"toSJISFunc" is not a valid function.') } toSJISFunction = f } exports.isKanjiModeEnabled = function () { return typeof toSJISFunction !== 'undefined' } exports.toSJIS = function toSJIS (kanji) { return toSJISFunction(kanji) } soldair-node-qrcode-5d87b5f/lib/core/version-check.js000066400000000000000000000004141465424452300225770ustar00rootroot00000000000000/** * Check if QR Code version is valid * * @param {Number} version QR Code version * @return {Boolean} true if valid version, false otherwise */ exports.isValid = function isValid (version) { return !isNaN(version) && version >= 1 && version <= 40 } soldair-node-qrcode-5d87b5f/lib/core/version.js000077500000000000000000000115001465424452300215250ustar00rootroot00000000000000const Utils = require('./utils') const ECCode = require('./error-correction-code') const ECLevel = require('./error-correction-level') const Mode = require('./mode') const VersionCheck = require('./version-check') // Generator polynomial used to encode version information const G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0) const G18_BCH = Utils.getBCHDigit(G18) function getBestVersionForDataLength (mode, length, errorCorrectionLevel) { for (let currentVersion = 1; currentVersion <= 40; currentVersion++) { if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) { return currentVersion } } return undefined } function getReservedBitsCount (mode, version) { // Character count indicator + mode indicator bits return Mode.getCharCountIndicator(mode, version) + 4 } function getTotalBitsFromDataArray (segments, version) { let totalBits = 0 segments.forEach(function (data) { const reservedBits = getReservedBitsCount(data.mode, version) totalBits += reservedBits + data.getBitsLength() }) return totalBits } function getBestVersionForMixedData (segments, errorCorrectionLevel) { for (let currentVersion = 1; currentVersion <= 40; currentVersion++) { const length = getTotalBitsFromDataArray(segments, currentVersion) if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) { return currentVersion } } return undefined } /** * Returns version number from a value. * If value is not a valid version, returns defaultValue * * @param {Number|String} value QR Code version * @param {Number} defaultValue Fallback value * @return {Number} QR Code version number */ exports.from = function from (value, defaultValue) { if (VersionCheck.isValid(value)) { return parseInt(value, 10) } return defaultValue } /** * Returns how much data can be stored with the specified QR code version * and error correction level * * @param {Number} version QR Code version (1-40) * @param {Number} errorCorrectionLevel Error correction level * @param {Mode} mode Data mode * @return {Number} Quantity of storable data */ exports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) { if (!VersionCheck.isValid(version)) { throw new Error('Invalid QR Code version') } // Use Byte mode as default if (typeof mode === 'undefined') mode = Mode.BYTE // Total codewords for this QR code version (Data + Error correction) const totalCodewords = Utils.getSymbolTotalCodewords(version) // Total number of error correction codewords const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel) // Total number of data codewords const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8 if (mode === Mode.MIXED) return dataTotalCodewordsBits const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version) // Return max number of storable codewords switch (mode) { case Mode.NUMERIC: return Math.floor((usableBits / 10) * 3) case Mode.ALPHANUMERIC: return Math.floor((usableBits / 11) * 2) case Mode.KANJI: return Math.floor(usableBits / 13) case Mode.BYTE: default: return Math.floor(usableBits / 8) } } /** * Returns the minimum version needed to contain the amount of data * * @param {Segment} data Segment of data * @param {Number} [errorCorrectionLevel=H] Error correction level * @param {Mode} mode Data mode * @return {Number} QR Code version */ exports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) { let seg const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M) if (Array.isArray(data)) { if (data.length > 1) { return getBestVersionForMixedData(data, ecl) } if (data.length === 0) { return 1 } seg = data[0] } else { seg = data } return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl) } /** * Returns version information with relative error correction bits * * The version information is included in QR Code symbols of version 7 or larger. * It consists of an 18-bit sequence containing 6 data bits, * with 12 error correction bits calculated using the (18, 6) Golay code. * * @param {Number} version QR Code version * @return {Number} Encoded version info bits */ exports.getEncodedBits = function getEncodedBits (version) { if (!VersionCheck.isValid(version) || version < 7) { throw new Error('Invalid QR Code version') } let d = version << 12 while (Utils.getBCHDigit(d) - G18_BCH >= 0) { d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH)) } return (version << 12) | d } soldair-node-qrcode-5d87b5f/lib/index.js000066400000000000000000000004571465424452300202250ustar00rootroot00000000000000/* *copyright Ryan Day 2012 * * Licensed under the MIT license: * http://www.opensource.org/licenses/mit-license.php * * this is the main server side application file for node-qrcode. * these exports use serverside canvas api methods for file IO and buffers * */ module.exports = require('./server') soldair-node-qrcode-5d87b5f/lib/renderer/000077500000000000000000000000001465424452300203605ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/lib/renderer/canvas.js000066400000000000000000000027351465424452300222000ustar00rootroot00000000000000const Utils = require('./utils') function clearCanvas (ctx, canvas, size) { ctx.clearRect(0, 0, canvas.width, canvas.height) if (!canvas.style) canvas.style = {} canvas.height = size canvas.width = size canvas.style.height = size + 'px' canvas.style.width = size + 'px' } function getCanvasElement () { try { return document.createElement('canvas') } catch (e) { throw new Error('You need to specify a canvas element') } } exports.render = function render (qrData, canvas, options) { let opts = options let canvasEl = canvas if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) { opts = canvas canvas = undefined } if (!canvas) { canvasEl = getCanvasElement() } opts = Utils.getOptions(opts) const size = Utils.getImageWidth(qrData.modules.size, opts) const ctx = canvasEl.getContext('2d') const image = ctx.createImageData(size, size) Utils.qrToImageData(image.data, qrData, opts) clearCanvas(ctx, canvasEl, size) ctx.putImageData(image, 0, 0) return canvasEl } exports.renderToDataURL = function renderToDataURL (qrData, canvas, options) { let opts = options if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) { opts = canvas canvas = undefined } if (!opts) opts = {} const canvasEl = exports.render(qrData, canvas, opts) const type = opts.type || 'image/png' const rendererOpts = opts.rendererOpts || {} return canvasEl.toDataURL(type, rendererOpts.quality) } soldair-node-qrcode-5d87b5f/lib/renderer/png.js000066400000000000000000000033601465424452300215040ustar00rootroot00000000000000const fs = require('fs') const PNG = require('pngjs').PNG const Utils = require('./utils') exports.render = function render (qrData, options) { const opts = Utils.getOptions(options) const pngOpts = opts.rendererOpts const size = Utils.getImageWidth(qrData.modules.size, opts) pngOpts.width = size pngOpts.height = size const pngImage = new PNG(pngOpts) Utils.qrToImageData(pngImage.data, qrData, opts) return pngImage } exports.renderToDataURL = function renderToDataURL (qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } exports.renderToBuffer(qrData, options, function (err, output) { if (err) cb(err) let url = 'data:image/png;base64,' url += output.toString('base64') cb(null, url) }) } exports.renderToBuffer = function renderToBuffer (qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } const png = exports.render(qrData, options) const buffer = [] png.on('error', cb) png.on('data', function (data) { buffer.push(data) }) png.on('end', function () { cb(null, Buffer.concat(buffer)) }) png.pack() } exports.renderToFile = function renderToFile (path, qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } let called = false const done = (...args) => { if (called) return called = true cb.apply(null, args) } const stream = fs.createWriteStream(path) stream.on('error', done) stream.on('close', done) exports.renderToFileStream(stream, qrData, options) } exports.renderToFileStream = function renderToFileStream (stream, qrData, options) { const png = exports.render(qrData, options) png.pack().pipe(stream) } soldair-node-qrcode-5d87b5f/lib/renderer/svg-tag.js000066400000000000000000000036631465424452300222760ustar00rootroot00000000000000const Utils = require('./utils') function getColorAttrib (color, attrib) { const alpha = color.a / 255 const str = attrib + '="' + color.hex + '"' return alpha < 1 ? str + ' ' + attrib + '-opacity="' + alpha.toFixed(2).slice(1) + '"' : str } function svgCmd (cmd, x, y) { let str = cmd + x if (typeof y !== 'undefined') str += ' ' + y return str } function qrToPath (data, size, margin) { let path = '' let moveBy = 0 let newRow = false let lineLength = 0 for (let i = 0; i < data.length; i++) { const col = Math.floor(i % size) const row = Math.floor(i / size) if (!col && !newRow) newRow = true if (data[i]) { lineLength++ if (!(i > 0 && col > 0 && data[i - 1])) { path += newRow ? svgCmd('M', col + margin, 0.5 + row + margin) : svgCmd('m', moveBy, 0) moveBy = 0 newRow = false } if (!(col + 1 < size && data[i + 1])) { path += svgCmd('h', lineLength) lineLength = 0 } } else { moveBy++ } } return path } exports.render = function render (qrData, options, cb) { const opts = Utils.getOptions(options) const size = qrData.modules.size const data = qrData.modules.data const qrcodesize = size + opts.margin * 2 const bg = !opts.color.light.a ? '' : '' const path = '' const viewBox = 'viewBox="' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '"' const width = !opts.width ? '' : 'width="' + opts.width + '" height="' + opts.width + '" ' const svgTag = '' + bg + path + '\n' if (typeof cb === 'function') { cb(null, svgTag) } return svgTag } soldair-node-qrcode-5d87b5f/lib/renderer/svg.js000066400000000000000000000010241465424452300215120ustar00rootroot00000000000000const svgTagRenderer = require('./svg-tag') exports.render = svgTagRenderer.render exports.renderToFile = function renderToFile (path, qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } const fs = require('fs') const svgTag = exports.render(qrData, options) const xmlStr = '' + '' + svgTag fs.writeFile(path, xmlStr, cb) } soldair-node-qrcode-5d87b5f/lib/renderer/terminal.js000066400000000000000000000004171465424452300225330ustar00rootroot00000000000000const big = require('./terminal/terminal') const small = require('./terminal/terminal-small') exports.render = function (qrData, options, cb) { if (options && options.small) { return small.render(qrData, options, cb) } return big.render(qrData, options, cb) } soldair-node-qrcode-5d87b5f/lib/renderer/terminal/000077500000000000000000000000001465424452300221735ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/lib/renderer/terminal/terminal-small.js000066400000000000000000000045361465424452300254620ustar00rootroot00000000000000const backgroundWhite = '\x1b[47m' const backgroundBlack = '\x1b[40m' const foregroundWhite = '\x1b[37m' const foregroundBlack = '\x1b[30m' const reset = '\x1b[0m' const lineSetupNormal = backgroundWhite + foregroundBlack // setup colors const lineSetupInverse = backgroundBlack + foregroundWhite // setup colors const createPalette = function (lineSetup, foregroundWhite, foregroundBlack) { return { // 1 ... white, 2 ... black, 0 ... transparent (default) '00': reset + ' ' + lineSetup, '01': reset + foregroundWhite + 'â–„' + lineSetup, '02': reset + foregroundBlack + 'â–„' + lineSetup, 10: reset + foregroundWhite + 'â–€' + lineSetup, 11: ' ', 12: 'â–„', 20: reset + foregroundBlack + 'â–€' + lineSetup, 21: 'â–€', 22: 'â–ˆ' } } /** * Returns code for QR pixel * @param {boolean[][]} modules * @param {number} size * @param {number} x * @param {number} y * @return {'0' | '1' | '2'} */ const mkCodePixel = function (modules, size, x, y) { const sizePlus = size + 1 if ((x >= sizePlus) || (y >= sizePlus) || (y < -1) || (x < -1)) return '0' if ((x >= size) || (y >= size) || (y < 0) || (x < 0)) return '1' const idx = (y * size) + x return modules[idx] ? '2' : '1' } /** * Returns code for four QR pixels. Suitable as key in palette. * @param {boolean[][]} modules * @param {number} size * @param {number} x * @param {number} y * @return {keyof palette} */ const mkCode = function (modules, size, x, y) { return ( mkCodePixel(modules, size, x, y) + mkCodePixel(modules, size, x, y + 1) ) } exports.render = function (qrData, options, cb) { const size = qrData.modules.size const data = qrData.modules.data const inverse = !!(options && options.inverse) const lineSetup = options && options.inverse ? lineSetupInverse : lineSetupNormal const white = inverse ? foregroundBlack : foregroundWhite const black = inverse ? foregroundWhite : foregroundBlack const palette = createPalette(lineSetup, white, black) const newLine = reset + '\n' + lineSetup let output = lineSetup // setup colors for (let y = -1; y < size + 1; y += 2) { for (let x = -1; x < size; x++) { output += palette[mkCode(data, size, x, y)] } output += palette[mkCode(data, size, size, y)] + newLine } output += reset if (typeof cb === 'function') { cb(null, output) } return output } soldair-node-qrcode-5d87b5f/lib/renderer/terminal/terminal.js000066400000000000000000000023041465424452300243430ustar00rootroot00000000000000// let Utils = require('./utils') exports.render = function (qrData, options, cb) { const size = qrData.modules.size const data = qrData.modules.data // let opts = Utils.getOptions(options) // use same scheme as https://github.com/gtanner/qrcode-terminal because it actually works! =) const black = '\x1b[40m \x1b[0m' const white = '\x1b[47m \x1b[0m' let output = '' const hMargin = Array(size + 3).join(white) const vMargin = Array(2).join(white) output += hMargin + '\n' for (let i = 0; i < size; ++i) { output += white for (let j = 0; j < size; j++) { // let topModule = data[i * size + j] // let bottomModule = data[(i + 1) * size + j] output += data[i * size + j] ? black : white// getBlockChar(topModule, bottomModule) } // output += white+'\n' output += vMargin + '\n' } output += hMargin + '\n' if (typeof cb === 'function') { cb(null, output) } return output } /* exports.renderToFile = function renderToFile (path, qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } let fs = require('fs') let utf8 = exports.render(qrData, options) fs.writeFile(path, utf8, cb) } */ soldair-node-qrcode-5d87b5f/lib/renderer/utf8.js000066400000000000000000000030531465424452300216050ustar00rootroot00000000000000const Utils = require('./utils') const BLOCK_CHAR = { WW: ' ', WB: 'â–„', BB: 'â–ˆ', BW: 'â–€' } const INVERTED_BLOCK_CHAR = { BB: ' ', BW: 'â–„', WW: 'â–ˆ', WB: 'â–€' } function getBlockChar (top, bottom, blocks) { if (top && bottom) return blocks.BB if (top && !bottom) return blocks.BW if (!top && bottom) return blocks.WB return blocks.WW } exports.render = function (qrData, options, cb) { const opts = Utils.getOptions(options) let blocks = BLOCK_CHAR if (opts.color.dark.hex === '#ffffff' || opts.color.light.hex === '#000000') { blocks = INVERTED_BLOCK_CHAR } const size = qrData.modules.size const data = qrData.modules.data let output = '' let hMargin = Array(size + (opts.margin * 2) + 1).join(blocks.WW) hMargin = Array((opts.margin / 2) + 1).join(hMargin + '\n') const vMargin = Array(opts.margin + 1).join(blocks.WW) output += hMargin for (let i = 0; i < size; i += 2) { output += vMargin for (let j = 0; j < size; j++) { const topModule = data[i * size + j] const bottomModule = data[(i + 1) * size + j] output += getBlockChar(topModule, bottomModule, blocks) } output += vMargin + '\n' } output += hMargin.slice(0, -1) if (typeof cb === 'function') { cb(null, output) } return output } exports.renderToFile = function renderToFile (path, qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } const fs = require('fs') const utf8 = exports.render(qrData, options) fs.writeFile(path, utf8, cb) } soldair-node-qrcode-5d87b5f/lib/renderer/utils.js000066400000000000000000000055161465424452300220650ustar00rootroot00000000000000function hex2rgba (hex) { if (typeof hex === 'number') { hex = hex.toString() } if (typeof hex !== 'string') { throw new Error('Color should be defined as hex string') } let hexCode = hex.slice().replace('#', '').split('') if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) { throw new Error('Invalid hex color: ' + hex) } // Convert from short to long form (fff -> ffffff) if (hexCode.length === 3 || hexCode.length === 4) { hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) { return [c, c] })) } // Add default alpha value if (hexCode.length === 6) hexCode.push('F', 'F') const hexValue = parseInt(hexCode.join(''), 16) return { r: (hexValue >> 24) & 255, g: (hexValue >> 16) & 255, b: (hexValue >> 8) & 255, a: hexValue & 255, hex: '#' + hexCode.slice(0, 6).join('') } } exports.getOptions = function getOptions (options) { if (!options) options = {} if (!options.color) options.color = {} const margin = typeof options.margin === 'undefined' || options.margin === null || options.margin < 0 ? 4 : options.margin const width = options.width && options.width >= 21 ? options.width : undefined const scale = options.scale || 4 return { width: width, scale: width ? 4 : scale, margin: margin, color: { dark: hex2rgba(options.color.dark || '#000000ff'), light: hex2rgba(options.color.light || '#ffffffff') }, type: options.type, rendererOpts: options.rendererOpts || {} } } exports.getScale = function getScale (qrSize, opts) { return opts.width && opts.width >= qrSize + opts.margin * 2 ? opts.width / (qrSize + opts.margin * 2) : opts.scale } exports.getImageWidth = function getImageWidth (qrSize, opts) { const scale = exports.getScale(qrSize, opts) return Math.floor((qrSize + opts.margin * 2) * scale) } exports.qrToImageData = function qrToImageData (imgData, qr, opts) { const size = qr.modules.size const data = qr.modules.data const scale = exports.getScale(size, opts) const symbolSize = Math.floor((size + opts.margin * 2) * scale) const scaledMargin = opts.margin * scale const palette = [opts.color.light, opts.color.dark] for (let i = 0; i < symbolSize; i++) { for (let j = 0; j < symbolSize; j++) { let posDst = (i * symbolSize + j) * 4 let pxColor = opts.color.light if (i >= scaledMargin && j >= scaledMargin && i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) { const iSrc = Math.floor((i - scaledMargin) / scale) const jSrc = Math.floor((j - scaledMargin) / scale) pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0] } imgData[posDst++] = pxColor.r imgData[posDst++] = pxColor.g imgData[posDst++] = pxColor.b imgData[posDst] = pxColor.a } } } soldair-node-qrcode-5d87b5f/lib/server.js000066400000000000000000000067631465424452300204320ustar00rootroot00000000000000const canPromise = require('./can-promise') const QRCode = require('./core/qrcode') const PngRenderer = require('./renderer/png') const Utf8Renderer = require('./renderer/utf8') const TerminalRenderer = require('./renderer/terminal') const SvgRenderer = require('./renderer/svg') function checkParams (text, opts, cb) { if (typeof text === 'undefined') { throw new Error('String required as first argument') } if (typeof cb === 'undefined') { cb = opts opts = {} } if (typeof cb !== 'function') { if (!canPromise()) { throw new Error('Callback required as last argument') } else { opts = cb || {} cb = null } } return { opts: opts, cb: cb } } function getTypeFromFilename (path) { return path.slice((path.lastIndexOf('.') - 1 >>> 0) + 2).toLowerCase() } function getRendererFromType (type) { switch (type) { case 'svg': return SvgRenderer case 'txt': case 'utf8': return Utf8Renderer case 'png': case 'image/png': default: return PngRenderer } } function getStringRendererFromType (type) { switch (type) { case 'svg': return SvgRenderer case 'terminal': return TerminalRenderer case 'utf8': default: return Utf8Renderer } } function render (renderFunc, text, params) { if (!params.cb) { return new Promise(function (resolve, reject) { try { const data = QRCode.create(text, params.opts) return renderFunc(data, params.opts, function (err, data) { return err ? reject(err) : resolve(data) }) } catch (e) { reject(e) } }) } try { const data = QRCode.create(text, params.opts) return renderFunc(data, params.opts, params.cb) } catch (e) { params.cb(e) } } exports.create = QRCode.create exports.toCanvas = require('./browser').toCanvas exports.toString = function toString (text, opts, cb) { const params = checkParams(text, opts, cb) const type = params.opts ? params.opts.type : undefined const renderer = getStringRendererFromType(type) return render(renderer.render, text, params) } exports.toDataURL = function toDataURL (text, opts, cb) { const params = checkParams(text, opts, cb) const renderer = getRendererFromType(params.opts.type) return render(renderer.renderToDataURL, text, params) } exports.toBuffer = function toBuffer (text, opts, cb) { const params = checkParams(text, opts, cb) const renderer = getRendererFromType(params.opts.type) return render(renderer.renderToBuffer, text, params) } exports.toFile = function toFile (path, text, opts, cb) { if (typeof path !== 'string' || !(typeof text === 'string' || typeof text === 'object')) { throw new Error('Invalid argument') } if ((arguments.length < 3) && !canPromise()) { throw new Error('Too few arguments provided') } const params = checkParams(text, opts, cb) const type = params.opts.type || getTypeFromFilename(path) const renderer = getRendererFromType(type) const renderToFile = renderer.renderToFile.bind(null, path) return render(renderToFile, text, params) } exports.toFileStream = function toFileStream (stream, text, opts) { if (arguments.length < 2) { throw new Error('Too few arguments provided') } const params = checkParams(text, opts, stream.emit.bind(stream, 'error')) const renderer = getRendererFromType('png') // Only png support for now const renderToFileStream = renderer.renderToFileStream.bind(null, stream) render(renderToFileStream, text, params) } soldair-node-qrcode-5d87b5f/license000066400000000000000000000020641465424452300173530ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2012 Ryan Day Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. soldair-node-qrcode-5d87b5f/package-lock.json000066400000000000000000011202071465424452300212230ustar00rootroot00000000000000{ "name": "qrcode", "version": "1.5.4", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "requires": { "@babel/highlight": "^7.16.0" } }, "@babel/compat-data": { "version": "7.16.4", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", "dev": true }, "@babel/core": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", "dev": true, "requires": { "@babel/code-frame": "^7.16.0", "@babel/generator": "^7.16.0", "@babel/helper-compilation-targets": "^7.16.0", "@babel/helper-module-transforms": "^7.16.0", "@babel/helpers": "^7.16.0", "@babel/parser": "^7.16.0", "@babel/template": "^7.16.0", "@babel/traverse": "^7.16.0", "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", "semver": "^6.3.0", "source-map": "^0.5.0" } }, "@babel/generator": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", "dev": true, "requires": { "@babel/types": "^7.16.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.16.0", "@babel/types": "^7.16.0" } }, "@babel/helper-compilation-targets": { "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", "dev": true, "requires": { "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.17.5", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-function-name": "^7.16.0", "@babel/helper-member-expression-to-functions": "^7.16.0", "@babel/helper-optimise-call-expression": "^7.16.0", "@babel/helper-replace-supers": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0" } }, "@babel/helper-create-regexp-features-plugin": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "regexpu-core": "^4.7.1" } }, "@babel/helper-define-polyfill-provider": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", "@babel/helper-plugin-utils": "^7.13.0", "@babel/traverse": "^7.13.0", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" } }, "@babel/helper-explode-assignable-expression": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-function-name": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.0", "@babel/template": "^7.16.0", "@babel/types": "^7.16.0" } }, "@babel/helper-get-function-arity": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-hoist-variables": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-member-expression-to-functions": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-module-imports": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-module-transforms": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.16.0", "@babel/helper-replace-supers": "^7.16.0", "@babel/helper-simple-access": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", "@babel/template": "^7.16.0", "@babel/traverse": "^7.16.0", "@babel/types": "^7.16.0" } }, "@babel/helper-optimise-call-expression": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-plugin-utils": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { "version": "7.16.4", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-wrap-function": "^7.16.0", "@babel/types": "^7.16.0" } }, "@babel/helper-replace-supers": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.16.0", "@babel/helper-optimise-call-expression": "^7.16.0", "@babel/traverse": "^7.16.0", "@babel/types": "^7.16.0" } }, "@babel/helper-simple-access": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", "dev": true, "requires": { "@babel/types": "^7.16.0" } }, "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/helper-validator-option": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", "dev": true }, "@babel/helper-wrap-function": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", "dev": true, "requires": { "@babel/helper-function-name": "^7.16.0", "@babel/template": "^7.16.0", "@babel/traverse": "^7.16.0", "@babel/types": "^7.16.0" } }, "@babel/helpers": { "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", "dev": true, "requires": { "@babel/template": "^7.16.0", "@babel/traverse": "^7.16.3", "@babel/types": "^7.16.0" } }, "@babel/highlight": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { "version": "7.16.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.2", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-proposal-optional-chaining": "^7.16.0" } }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.16.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-remap-async-to-generator": "^7.16.4", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-proposal-class-static-block": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", "dev": true, "requires": { "@babel/compat-data": "^7.16.0", "@babel/helper-compilation-targets": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.16.0" } }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-create-class-features-plugin": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-async-to-generator": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-remap-async-to-generator": "^7.16.0" } }, "@babel/plugin-transform-block-scoped-functions": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-block-scoping": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-classes": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-function-name": "^7.16.0", "@babel/helper-optimise-call-expression": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-replace-supers": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-destructuring": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-duplicate-keys": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-for-of": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-function-name": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-literals": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-modules-amd": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-simple-access": "^7.16.0", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.16.0", "@babel/helper-module-transforms": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-identifier": "^7.15.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0" } }, "@babel/plugin-transform-new-target": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-object-super": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-replace-supers": "^7.16.0" } }, "@babel/plugin-transform-parameters": { "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-regenerator": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-shorthand-properties": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-spread": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-template-literals": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typeof-symbol": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-escapes": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-regex": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/preset-env": { "version": "7.16.4", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", "dev": true, "requires": { "@babel/compat-data": "^7.16.4", "@babel/helper-compilation-targets": "^7.16.3", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", "@babel/plugin-proposal-async-generator-functions": "^7.16.4", "@babel/plugin-proposal-class-properties": "^7.16.0", "@babel/plugin-proposal-class-static-block": "^7.16.0", "@babel/plugin-proposal-dynamic-import": "^7.16.0", "@babel/plugin-proposal-export-namespace-from": "^7.16.0", "@babel/plugin-proposal-json-strings": "^7.16.0", "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", "@babel/plugin-proposal-numeric-separator": "^7.16.0", "@babel/plugin-proposal-object-rest-spread": "^7.16.0", "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", "@babel/plugin-proposal-optional-chaining": "^7.16.0", "@babel/plugin-proposal-private-methods": "^7.16.0", "@babel/plugin-proposal-private-property-in-object": "^7.16.0", "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.16.0", "@babel/plugin-transform-async-to-generator": "^7.16.0", "@babel/plugin-transform-block-scoped-functions": "^7.16.0", "@babel/plugin-transform-block-scoping": "^7.16.0", "@babel/plugin-transform-classes": "^7.16.0", "@babel/plugin-transform-computed-properties": "^7.16.0", "@babel/plugin-transform-destructuring": "^7.16.0", "@babel/plugin-transform-dotall-regex": "^7.16.0", "@babel/plugin-transform-duplicate-keys": "^7.16.0", "@babel/plugin-transform-exponentiation-operator": "^7.16.0", "@babel/plugin-transform-for-of": "^7.16.0", "@babel/plugin-transform-function-name": "^7.16.0", "@babel/plugin-transform-literals": "^7.16.0", "@babel/plugin-transform-member-expression-literals": "^7.16.0", "@babel/plugin-transform-modules-amd": "^7.16.0", "@babel/plugin-transform-modules-commonjs": "^7.16.0", "@babel/plugin-transform-modules-systemjs": "^7.16.0", "@babel/plugin-transform-modules-umd": "^7.16.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", "@babel/plugin-transform-new-target": "^7.16.0", "@babel/plugin-transform-object-super": "^7.16.0", "@babel/plugin-transform-parameters": "^7.16.3", "@babel/plugin-transform-property-literals": "^7.16.0", "@babel/plugin-transform-regenerator": "^7.16.0", "@babel/plugin-transform-reserved-words": "^7.16.0", "@babel/plugin-transform-shorthand-properties": "^7.16.0", "@babel/plugin-transform-spread": "^7.16.0", "@babel/plugin-transform-sticky-regex": "^7.16.0", "@babel/plugin-transform-template-literals": "^7.16.0", "@babel/plugin-transform-typeof-symbol": "^7.16.0", "@babel/plugin-transform-unicode-escapes": "^7.16.0", "@babel/plugin-transform-unicode-regex": "^7.16.0", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.16.0", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.4.0", "babel-plugin-polyfill-regenerator": "^0.3.0", "core-js-compat": "^3.19.1", "semver": "^6.3.0" } }, "@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } }, "@babel/runtime": { "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", "dev": true, "requires": { "@babel/code-frame": "^7.16.0", "@babel/parser": "^7.16.0", "@babel/types": "^7.16.0" } }, "@babel/traverse": { "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", "dev": true, "requires": { "@babel/code-frame": "^7.16.0", "@babel/generator": "^7.16.0", "@babel/helper-function-name": "^7.16.0", "@babel/helper-hoist-variables": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", "@babel/parser": "^7.16.3", "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.15.7", "to-fast-properties": "^2.0.0" } }, "@eslint/eslintrc": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", "lodash": "^4.17.20", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" } } } }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "dependencies": { "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@mapbox/node-pre-gyp": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.7.tgz", "integrity": "sha512-PplSvl4pJ5N3BkVjAdDzpPhVUPdC73JgttkR+LnBx2OORC1GCQsBjUeEuipf9uOaAM1SbxcdZFfR3KDTKm2S0A==", "dev": true, "requires": { "detect-libc": "^1.0.3", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", "node-fetch": "^2.6.5", "nopt": "^5.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" }, "dependencies": { "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" } } } }, "@rollup/plugin-commonjs": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz", "integrity": "sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==", "dev": true, "requires": { "@rollup/pluginutils": "^3.0.8", "commondir": "^1.0.1", "estree-walker": "^1.0.1", "glob": "^7.1.2", "is-reference": "^1.1.2", "magic-string": "^0.25.2", "resolve": "^1.11.0" } }, "@rollup/plugin-node-resolve": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", "dev": true, "requires": { "@rollup/pluginutils": "^3.0.8", "@types/resolve": "0.0.8", "builtin-modules": "^3.1.0", "is-module": "^1.0.0", "resolve": "^1.14.2" } }, "@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "requires": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" } }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } }, "@sinonjs/samsam": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, "@sinonjs/text-encoding": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "@types/node": { "version": "16.11.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", "dev": true }, "@types/resolve": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "dev": true, "requires": { "@types/node": "*" } }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" } }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { "mime-types": "~2.1.24", "negotiator": "0.6.2" } }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", "dev": true, "requires": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", "xtend": "^4.0.2" } }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { "debug": "4" } }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "requires": { "default-require-extensions": "^3.0.0" } }, "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "dependencies": { "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } } } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, "array-includes": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" } }, "array.prototype.flat": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0" } }, "array.prototype.flatmap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", "es-abstract": "^1.19.0" } }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "safer-buffer": "^2.1.0" }, "dependencies": { "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, "assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { "inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { "inherits": "2.0.1" } } } }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async-hook-domain": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz", "integrity": "sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==", "dev": true }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-polyfill-corejs2": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", "dev": true, "requires": { "@babel/compat-data": "^7.13.11", "@babel/helper-define-polyfill-provider": "^0.3.0", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.0", "core-js-compat": "^3.18.0" } }, "babel-plugin-polyfill-regenerator": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.0" } }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "bind-obj-methods": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", "dev": true }, "bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.7.2", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", "qs": "6.7.0", "raw-body": "2.4.0", "type-is": "~1.6.17" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" } }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, "browser-pack": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", "dev": true, "requires": { "JSONStream": "^1.0.3", "combine-source-map": "~0.8.0", "defined": "^1.0.0", "safe-buffer": "^5.1.1", "through2": "^2.0.0", "umd": "^3.0.0" } }, "browser-resolve": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", "dev": true, "requires": { "resolve": "^1.17.0" } }, "browserify": { "version": "16.5.2", "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz", "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==", "dev": true, "requires": { "JSONStream": "^1.0.3", "assert": "^1.4.0", "browser-pack": "^6.0.1", "browser-resolve": "^2.0.0", "browserify-zlib": "~0.2.0", "buffer": "~5.2.1", "cached-path-relative": "^1.0.0", "concat-stream": "^1.6.0", "console-browserify": "^1.1.0", "constants-browserify": "~1.0.0", "crypto-browserify": "^3.0.0", "defined": "^1.0.0", "deps-sort": "^2.0.0", "domain-browser": "^1.2.0", "duplexer2": "~0.1.2", "events": "^2.0.0", "glob": "^7.1.0", "has": "^1.0.0", "htmlescape": "^1.1.0", "https-browserify": "^1.0.0", "inherits": "~2.0.1", "insert-module-globals": "^7.0.0", "labeled-stream-splicer": "^2.0.0", "mkdirp-classic": "^0.5.2", "module-deps": "^6.2.3", "os-browserify": "~0.3.0", "parents": "^1.0.1", "path-browserify": "~0.0.0", "process": "~0.11.0", "punycode": "^1.3.2", "querystring-es3": "~0.2.0", "read-only-stream": "^2.0.0", "readable-stream": "^2.0.2", "resolve": "^1.1.4", "shasum": "^1.0.0", "shell-quote": "^1.6.1", "stream-browserify": "^2.0.0", "stream-http": "^3.0.0", "string_decoder": "^1.1.1", "subarg": "^1.0.0", "syntax-error": "^1.1.1", "through2": "^2.0.0", "timers-browserify": "^1.0.1", "tty-browserify": "0.0.1", "url": "~0.11.0", "util": "~0.10.1", "vm-browserify": "^1.0.0", "xtend": "^4.0.0" } }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", "evp_bytestokey": "^1.0.0" } }, "browserify-des": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "browserify-rsa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, "browserify-sign": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "elliptic": "^6.5.3", "inherits": "^2.0.4", "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" }, "dependencies": { "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { "pako": "~1.0.5" } }, "browserslist": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", "dev": true, "requires": { "caniuse-lite": "^1.0.30001280", "electron-to-chromium": "^1.3.896", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" } }, "buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", "dev": true, "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" } }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, "builtin-modules": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, "cached-path-relative": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", "dev": true }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "requires": { "hasha": "^5.0.0", "make-dir": "^3.0.0", "package-hash": "^4.0.0", "write-file-atomic": "^3.0.0" } }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-lite": { "version": "1.0.30001282", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz", "integrity": "sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg==", "dev": true }, "canvas": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", "dev": true, "requires": { "@mapbox/node-pre-gyp": "^1.0.0", "nan": "^2.14.0", "simple-get": "^3.0.3" } }, "canvasutil": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/canvasutil/-/canvasutil-0.0.4.tgz", "integrity": "sha1-kDPerLkxstjsfShMFPaFM396vx4=", "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true } } }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" } }, "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, "combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", "dev": true, "requires": { "convert-source-map": "~1.1.0", "inline-source-map": "~0.6.0", "lodash.memoize": "~3.0.3", "source-map": "~0.5.3" }, "dependencies": { "convert-source-map": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true } } }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dev": true, "requires": { "safe-buffer": "5.1.2" } }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", "dev": true }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, "core-js-compat": { "version": "3.19.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", "dev": true, "requires": { "browserslist": "^4.17.6", "semver": "7.0.0" }, "dependencies": { "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "dev": true } } }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", "create-ecdh": "^4.0.0", "create-hash": "^1.1.0", "create-hmac": "^1.1.0", "diffie-hellman": "^5.0.0", "inherits": "^2.0.1", "pbkdf2": "^3.0.3", "public-encrypt": "^4.0.0", "randombytes": "^2.0.0", "randomfill": "^1.0.3" } }, "dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", "dev": true }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", "dev": true, "requires": { "mimic-response": "^2.0.0" } }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", "dev": true, "requires": { "strip-bom": "^4.0.0" }, "dependencies": { "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true } } }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, "deps-sort": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", "dev": true, "requires": { "JSONStream": "^1.0.3", "shasum-object": "^1.0.0", "subarg": "^1.0.0", "through2": "^2.0.0" } }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true }, "detective": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", "dev": true, "requires": { "acorn-node": "^1.6.1", "defined": "^1.0.0", "minimist": "^1.1.1" } }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" }, "dependencies": { "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, "dijkstrajs": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" }, "dependencies": { "domhandler": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "dev": true, "requires": { "domelementtype": "^2.2.0" } } } }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, "domelementtype": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true }, "domhandler": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", "dev": true, "requires": { "domelementtype": "^2.0.1" } }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" }, "dependencies": { "domhandler": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "dev": true, "requires": { "domelementtype": "^2.2.0" } } } }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { "readable-stream": "^2.0.2" } }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, "electron-to-chromium": { "version": "1.3.907", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.907.tgz", "integrity": "sha512-xoUPSkjimw51d9ryeH38XUwmR3HmCA+eky4hk0YEgsWeBWGyhb35OCvT3lWAdmvIkcGYCRNOB8LvtO00dJQpOA==", "dev": true }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { "ansi-colors": "^4.1.1" } }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.1", "is-string": "^1.0.7", "is-weakref": "^1.0.1", "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", "unbox-primitive": "^1.0.1" } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "eslint": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@eslint/eslintrc": "^0.3.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^6.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash": "^4.17.20", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", "regexpp": "^3.1.0", "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" } }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "eslint-config-standard": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", "dev": true }, "eslint-config-standard-jsx": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-10.0.0.tgz", "integrity": "sha512-hLeA2f5e06W1xyr/93/QJulN/rLbUVUmqTlexv9PRKHFwEC9ffJcH2LvJhMoEqYQBEYafedgGZXH2W8NUpt5lA==", "dev": true }, "eslint-import-resolver-node": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { "debug": "^3.2.7", "resolve": "^1.20.0" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "eslint-module-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", "dev": true, "requires": { "debug": "^3.2.7", "find-up": "^2.1.0", "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, "requires": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" } }, "eslint-plugin-import": { "version": "2.24.2", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, "requires": { "array-includes": "^3.1.3", "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", "eslint-module-utils": "^2.6.2", "find-up": "^2.0.0", "has": "^1.0.3", "is-core-module": "^2.6.0", "minimatch": "^3.0.4", "object.values": "^1.1.4", "pkg-up": "^2.0.0", "read-pkg-up": "^3.0.0", "resolve": "^1.20.0", "tsconfig-paths": "^3.11.0" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "dev": true, "requires": { "eslint-plugin-es": "^3.0.0", "eslint-utils": "^2.0.0", "ignore": "^5.1.1", "minimatch": "^3.0.4", "resolve": "^1.10.1", "semver": "^6.1.0" }, "dependencies": { "ignore": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true } } }, "eslint-plugin-promise": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.1.tgz", "integrity": "sha512-XgdcdyNzHfmlQyweOPTxmc7pIsS6dE4MvwhXWMQ2Dxs1XAL2GJDilUsjWen6TWik0aSI+zD/PqocZBblcm9rdA==", "dev": true }, "eslint-plugin-react": { "version": "7.25.3", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", "dev": true, "requires": { "array-includes": "^3.1.3", "array.prototype.flatmap": "^1.2.4", "doctrine": "^2.1.0", "estraverse": "^5.2.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.0.4", "object.entries": "^1.1.4", "object.fromentries": "^2.0.4", "object.hasown": "^1.0.0", "object.values": "^1.1.4", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", "string.prototype.matchall": "^4.0.5" }, "dependencies": { "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "resolve": { "version": "2.0.0-next.3", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } } } }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" }, "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" }, "dependencies": { "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, "events": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", "dev": true }, "events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", "dev": true }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", "body-parser": "1.19.0", "content-disposition": "0.5.3", "content-type": "~1.0.4", "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.5", "qs": "6.7.0", "range-parser": "~1.2.1", "safe-buffer": "5.1.2", "send": "0.17.1", "serve-static": "1.14.1", "setprototypeof": "1.1.1", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { "flat-cache": "^3.0.4" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" }, "dependencies": { "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" } } } }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "findit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", "integrity": "sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==", "dev": true }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" } }, "flatted": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" } }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, "fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true }, "fs-exists-cached": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", "dev": true }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { "minipass": "^3.0.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "function-loop": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", "dev": true }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "gauge": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", "dev": true, "requires": { "ansi-regex": "^5.0.1", "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.1", "signal-exit": "^3.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.2" } }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-assigned-identifiers": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" } }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, "get-stdin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" }, "dependencies": { "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "requires": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" } }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, "htmlparser2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^3.0.0", "domutils": "^2.0.0", "entities": "^2.0.0" } }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" }, "dependencies": { "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true } } }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { "agent-base": "6", "debug": "4" } }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "inline-source-map": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", "dev": true, "requires": { "source-map": "~0.5.3" } }, "insert-module-globals": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", "dev": true, "requires": { "JSONStream": "^1.0.3", "acorn-node": "^1.5.2", "combine-source-map": "^0.8.0", "concat-stream": "^1.6.1", "is-buffer": "^1.1.0", "path-is-absolute": "^1.0.1", "process": "~0.11.0", "through2": "^2.0.0", "undeclared-identifiers": "^1.1.2", "xtend": "^4.0.0" } }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "requires": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { "has-bigints": "^1.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { "binary-extensions": "^2.0.0" } }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-callable": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, "is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-number-object": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "requires": { "@types/estree": "*" } }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-shared-array-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", "dev": true }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-weakref": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", "dev": true, "requires": { "call-bind": "^1.0.0" } }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-hook": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { "append-transform": "^2.0.0" } }, "istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" } }, "istanbul-lib-processinfo": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "requires": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", "istanbul-lib-coverage": "^3.2.0", "p-map": "^3.0.0", "rimraf": "^3.0.0", "uuid": "^8.3.2" } }, "istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "jackspeak": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.1.tgz", "integrity": "sha512-npN8f+M4+IQ8xD3CcWi3U62VQwKlT3Tj4GxbdT/fYTmeogD9eBF9OFdpoFG/VPNoshRjPUijdkp/p2XrzUHaVg==", "dev": true, "requires": { "cliui": "^7.0.4" }, "dependencies": { "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } } } }, "jest-worker": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "dev": true, "requires": { "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", "dev": true, "requires": { "jsonify": "~0.0.0" } }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" } }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, "jsx-ast-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", "dev": true, "requires": { "array-includes": "^3.1.3", "object.assign": "^4.1.2" } }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, "labeled-stream-splicer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", "dev": true, "requires": { "inherits": "^2.0.1", "stream-splicer": "^2.0.0" } }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "libtap": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.4.0.tgz", "integrity": "sha512-STLFynswQ2A6W14JkabgGetBNk6INL1REgJ9UeNKw5llXroC2cGLgKTqavv0sl8OLVztLLipVKMcQ7yeUcqpmg==", "dev": true, "requires": { "async-hook-domain": "^2.0.4", "bind-obj-methods": "^3.0.0", "diff": "^4.0.2", "function-loop": "^2.0.1", "minipass": "^3.1.5", "own-or": "^1.0.0", "own-or-env": "^1.0.2", "signal-exit": "^3.0.4", "stack-utils": "^2.0.4", "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "tcompare": "^5.0.6", "trivial-deferred": "^1.0.1" } }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" } }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, "lodash.memoize": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", "dev": true }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" } }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "dependencies": { "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, "mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true }, "mime-types": { "version": "2.1.34", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, "requires": { "mime-db": "1.51.0" } }, "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", "dev": true }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, "module-deps": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", "dev": true, "requires": { "JSONStream": "^1.0.3", "browser-resolve": "^2.0.0", "cached-path-relative": "^1.0.2", "concat-stream": "~1.6.0", "defined": "^1.0.0", "detective": "^5.2.0", "duplexer2": "^0.1.2", "inherits": "^2.0.1", "parents": "^1.0.0", "readable-stream": "^2.0.2", "resolve": "^1.4.0", "stream-combiner2": "^1.1.1", "subarg": "^1.0.0", "through2": "^2.0.0", "xtend": "^4.0.0" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "dev": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "nise": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", "dev": true, "requires": { "@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" }, "dependencies": { "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { "isarray": "0.0.1" } } } }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, "requires": { "whatwg-url": "^5.0.0" } }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { "process-on-spawn": "^1.0.0" } }, "node-releases": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, "requires": { "abbrev": "1" } }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" }, "dependencies": { "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "npmlog": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", "integrity": "sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==", "dev": true, "requires": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.0", "set-blocking": "^2.0.0" } }, "nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "requires": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "caching-transform": "^4.0.0", "convert-source-map": "^1.7.0", "decamelize": "^1.2.0", "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", "foreground-child": "^2.0.0", "get-package-type": "^0.1.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-processinfo": "^2.0.2", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", "make-dir": "^3.0.0", "node-preload": "^0.2.1", "p-map": "^3.0.0", "process-on-spawn": "^1.0.0", "resolve-from": "^5.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "spawn-wrap": "^2.0.0", "test-exclude": "^6.0.0", "yargs": "^15.0.2" }, "dependencies": { "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } }, "object.entries": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1" } }, "object.fromentries": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1" } }, "object.hasown": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.19.1" } }, "object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1" } }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { "ee-first": "1.1.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.3" } }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, "own-or": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", "dev": true }, "own-or-env": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", "dev": true, "requires": { "own-or": "^1.0.0" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" } }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" } }, "parents": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", "dev": true, "requires": { "path-platform": "~0.11.15" } }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" } }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-platform": { "version": "0.11.15", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", "dev": true }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" } }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", "ripemd160": "^2.0.1", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pkg-conf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", "dev": true, "requires": { "find-up": "^3.0.0", "load-json-file": "^5.2.0" }, "dependencies": { "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "load-json-file": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", "dev": true, "requires": { "graceful-fs": "^4.1.15", "parse-json": "^4.0.0", "pify": "^4.0.1", "strip-bom": "^3.0.0", "type-fest": "^0.3.0" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "type-fest": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "dev": true } } }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { "find-up": "^2.1.0" }, "dependencies": { "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "pkg-up": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, "requires": { "find-up": "^2.1.0" }, "dependencies": { "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "pngjs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "requires": { "fromentries": "^1.2.0" } }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "dev": true, "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" } }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" }, "dependencies": { "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { "bytes": "3.1.0", "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, "read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", "dev": true, "requires": { "readable-stream": "^2.0.2" } }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" } }, "read-pkg-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" }, "dependencies": { "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" }, "dependencies": { "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" } } } }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" } }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", "dev": true, "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "regenerator-transform": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, "regexp.prototype.flags": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "regexpu-core": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "dev": true, "requires": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^9.0.0", "regjsgen": "^0.5.2", "regjsparser": "^0.7.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "regjsparser": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "dev": true, "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } } }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "requires": { "es6-error": "^4.0.1" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "rollup": { "version": "2.60.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", "dev": true, "requires": { "fsevents": "~2.3.2" } }, "rollup-plugin-babel": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "rollup-pluginutils": "^2.8.1" } }, "rollup-plugin-terser": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", "jest-worker": "^24.9.0", "rollup-pluginutils": "^2.8.2", "serialize-javascript": "^4.0.0", "terser": "^4.6.2" } }, "rollup-pluginutils": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, "requires": { "estree-walker": "^0.6.1" }, "dependencies": { "estree-walker": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true } } }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", "destroy": "~1.0.4", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "~1.7.2", "mime": "1.6.0", "ms": "2.1.1", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" }, "dependencies": { "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.17.1" } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "shasum": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { "json-stable-stringify": "~0.0.0", "sha.js": "~2.4.4" } }, "shasum-object": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", "dev": true, "requires": { "fast-safe-stringify": "^2.0.7" } }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shell-quote": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" } }, "signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true }, "simple-get": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", "dev": true, "requires": { "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sinon": { "version": "9.2.4", "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.1", "@sinonjs/fake-timers": "^6.0.1", "@sinonjs/samsam": "^5.3.1", "diff": "^4.0.2", "nise": "^4.0.4", "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", "make-dir": "^3.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "which": "^2.0.1" } }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "standard": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.4.tgz", "integrity": "sha512-2AGI874RNClW4xUdM+bg1LRXVlYLzTNEkHmTG5mhyn45OhbgwA+6znowkOGYy+WMb5HRyELvtNy39kcdMQMcYQ==", "dev": true, "requires": { "eslint": "~7.18.0", "eslint-config-standard": "16.0.3", "eslint-config-standard-jsx": "10.0.0", "eslint-plugin-import": "~2.24.2", "eslint-plugin-node": "~11.1.0", "eslint-plugin-promise": "~5.1.0", "eslint-plugin-react": "~7.25.1", "standard-engine": "^14.0.1" } }, "standard-engine": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-14.0.1.tgz", "integrity": "sha512-7FEzDwmHDOGva7r9ifOzD3BGdTbA7ujJ50afLVdW/tK14zQEptJjbFuUfn50irqdHDcTbNh0DTIoMPynMCXb0Q==", "dev": true, "requires": { "get-stdin": "^8.0.0", "minimist": "^1.2.5", "pkg-conf": "^3.1.0", "xdg-basedir": "^4.0.0" } }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, "stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, "requires": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" } }, "stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" }, "dependencies": { "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } } } }, "stream-splicer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.2" } }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "string.prototype.matchall": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.3.1", "side-channel": "^1.0.4" } }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { "safe-buffer": "~5.2.0" }, "dependencies": { "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", "dev": true, "requires": { "minimist": "^1.1.0" } }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", "dev": true, "requires": { "acorn-node": "^1.2.0" } }, "table": { "version": "6.7.3", "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==", "dev": true, "requires": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" }, "dependencies": { "ajv": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true } } }, "tap": { "version": "16.3.0", "resolved": "https://registry.npmjs.org/tap/-/tap-16.3.0.tgz", "integrity": "sha512-J9GffPUAbX6FnWbQ/jj7ktzd9nnDFP1fH44OzidqOmxUfZ1hPLMOvpS99LnDiP0H2mO8GY3kGN5XoY0xIKbNFA==", "dev": true, "requires": { "@isaacs/import-jsx": "^4.0.1", "@types/react": "^17", "chokidar": "^3.3.0", "findit": "^2.0.0", "foreground-child": "^2.0.0", "fs-exists-cached": "^1.0.0", "glob": "^7.1.6", "ink": "^3.2.0", "isexe": "^2.0.0", "istanbul-lib-processinfo": "^2.0.2", "jackspeak": "^1.4.1", "libtap": "^1.4.0", "minipass": "^3.1.1", "mkdirp": "^1.0.4", "nyc": "^15.1.0", "opener": "^1.5.1", "react": "^17.0.2", "rimraf": "^3.0.0", "signal-exit": "^3.0.6", "source-map-support": "^0.5.16", "tap-mocha-reporter": "^5.0.3", "tap-parser": "^11.0.1", "tap-yaml": "^1.0.0", "tcompare": "^5.0.7", "treport": "^3.0.3", "which": "^2.0.2" }, "dependencies": { "@ampproject/remapping": { "version": "2.1.2", "bundled": true, "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" } }, "@babel/code-frame": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/highlight": "^7.16.7" } }, "@babel/compat-data": { "version": "7.17.7", "bundled": true, "dev": true }, "@babel/core": { "version": "7.17.8", "bundled": true, "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.7", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", "@babel/helpers": "^7.17.8", "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", "semver": "^6.3.0" } }, "@babel/generator": { "version": "7.17.7", "bundled": true, "dev": true, "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { "version": "7.17.7", "bundled": true, "dev": true, "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" } }, "@babel/helper-environment-visitor": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/types": "^7.16.7" } }, "@babel/helper-function-name": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", "@babel/types": "^7.16.7" } }, "@babel/helper-get-function-arity": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/types": "^7.16.7" } }, "@babel/helper-hoist-variables": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/types": "^7.16.7" } }, "@babel/helper-module-imports": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { "version": "7.17.7", "bundled": true, "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" } }, "@babel/helper-plugin-utils": { "version": "7.16.7", "bundled": true, "dev": true }, "@babel/helper-simple-access": { "version": "7.17.7", "bundled": true, "dev": true, "requires": { "@babel/types": "^7.17.0" } }, "@babel/helper-split-export-declaration": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { "version": "7.16.7", "bundled": true, "dev": true }, "@babel/helper-validator-option": { "version": "7.16.7", "bundled": true, "dev": true }, "@babel/helpers": { "version": "7.17.8", "bundled": true, "dev": true, "requires": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" } }, "@babel/highlight": { "version": "7.16.10", "bundled": true, "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { "version": "7.17.8", "bundled": true, "dev": true }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.17.3", "bundled": true, "dev": true, "requires": { "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-syntax-jsx": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "bundled": true, "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-destructuring": { "version": "7.17.7", "bundled": true, "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-parameters": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-jsx": { "version": "7.17.3", "bundled": true, "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-jsx": "^7.16.7", "@babel/types": "^7.17.0" } }, "@babel/template": { "version": "7.16.7", "bundled": true, "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", "@babel/types": "^7.16.7" } }, "@babel/traverse": { "version": "7.17.3", "bundled": true, "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.3", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/parser": "^7.17.3", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { "version": "7.17.0", "bundled": true, "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, "@isaacs/import-jsx": { "version": "4.0.1", "bundled": true, "dev": true, "requires": { "@babel/core": "^7.5.5", "@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/plugin-transform-destructuring": "^7.5.0", "@babel/plugin-transform-react-jsx": "^7.3.0", "caller-path": "^3.0.1", "find-cache-dir": "^3.2.0", "make-dir": "^3.0.2", "resolve-from": "^3.0.0", "rimraf": "^3.0.0" } }, "@jridgewell/resolve-uri": { "version": "3.0.5", "bundled": true, "dev": true }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "bundled": true, "dev": true }, "@jridgewell/trace-mapping": { "version": "0.3.4", "bundled": true, "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@types/prop-types": { "version": "15.7.4", "bundled": true, "dev": true }, "@types/react": { "version": "17.0.41", "bundled": true, "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "@types/scheduler": { "version": "0.16.2", "bundled": true, "dev": true }, "@types/yoga-layout": { "version": "1.9.2", "bundled": true, "dev": true }, "ansi-escapes": { "version": "4.3.2", "bundled": true, "dev": true, "requires": { "type-fest": "^0.21.3" }, "dependencies": { "type-fest": { "version": "0.21.3", "bundled": true, "dev": true } } }, "ansi-regex": { "version": "5.0.1", "bundled": true, "dev": true }, "ansi-styles": { "version": "3.2.1", "bundled": true, "dev": true, "requires": { "color-convert": "^1.9.0" } }, "ansicolors": { "version": "0.3.2", "bundled": true, "dev": true }, "astral-regex": { "version": "2.0.0", "bundled": true, "dev": true }, "auto-bind": { "version": "4.0.0", "bundled": true, "dev": true }, "balanced-match": { "version": "1.0.2", "bundled": true, "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "browserslist": { "version": "4.20.2", "bundled": true, "dev": true, "requires": { "caniuse-lite": "^1.0.30001317", "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" } }, "caller-callsite": { "version": "4.1.0", "bundled": true, "dev": true, "requires": { "callsites": "^3.1.0" } }, "caller-path": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { "caller-callsite": "^4.1.0" } }, "callsites": { "version": "3.1.0", "bundled": true, "dev": true }, "caniuse-lite": { "version": "1.0.30001319", "bundled": true, "dev": true }, "cardinal": { "version": "2.1.1", "bundled": true, "dev": true, "requires": { "ansicolors": "~0.3.2", "redeyed": "~2.1.0" } }, "chalk": { "version": "2.4.2", "bundled": true, "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "ci-info": { "version": "2.0.0", "bundled": true, "dev": true }, "cli-boxes": { "version": "2.2.1", "bundled": true, "dev": true }, "cli-cursor": { "version": "3.1.0", "bundled": true, "dev": true, "requires": { "restore-cursor": "^3.1.0" } }, "cli-truncate": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "code-excerpt": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "convert-to-spaces": "^1.0.1" } }, "color-convert": { "version": "1.9.3", "bundled": true, "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "bundled": true, "dev": true }, "commondir": { "version": "1.0.1", "bundled": true, "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, "dev": true }, "convert-source-map": { "version": "1.8.0", "bundled": true, "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, "convert-to-spaces": { "version": "1.0.2", "bundled": true, "dev": true }, "csstype": { "version": "3.0.11", "bundled": true, "dev": true }, "debug": { "version": "4.3.4", "bundled": true, "dev": true, "requires": { "ms": "2.1.2" } }, "electron-to-chromium": { "version": "1.4.89", "bundled": true, "dev": true }, "emoji-regex": { "version": "8.0.0", "bundled": true, "dev": true }, "escalade": { "version": "3.1.1", "bundled": true, "dev": true }, "escape-string-regexp": { "version": "1.0.5", "bundled": true, "dev": true }, "esprima": { "version": "4.0.1", "bundled": true, "dev": true }, "events-to-array": { "version": "1.1.2", "bundled": true, "dev": true }, "find-cache-dir": { "version": "3.3.2", "bundled": true, "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, "find-up": { "version": "4.1.0", "bundled": true, "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, "dev": true }, "gensync": { "version": "1.0.0-beta.2", "bundled": true, "dev": true }, "glob": { "version": "7.2.0", "bundled": true, "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "globals": { "version": "11.12.0", "bundled": true, "dev": true }, "has-flag": { "version": "3.0.0", "bundled": true, "dev": true }, "indent-string": { "version": "4.0.0", "bundled": true, "dev": true }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "bundled": true, "dev": true }, "ink": { "version": "3.2.0", "bundled": true, "dev": true, "requires": { "ansi-escapes": "^4.2.1", "auto-bind": "4.0.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.0", "cli-cursor": "^3.1.0", "cli-truncate": "^2.1.0", "code-excerpt": "^3.0.0", "indent-string": "^4.0.0", "is-ci": "^2.0.0", "lodash": "^4.17.20", "patch-console": "^1.0.0", "react-devtools-core": "^4.19.1", "react-reconciler": "^0.26.2", "scheduler": "^0.20.2", "signal-exit": "^3.0.2", "slice-ansi": "^3.0.0", "stack-utils": "^2.0.2", "string-width": "^4.2.2", "type-fest": "^0.12.0", "widest-line": "^3.1.0", "wrap-ansi": "^6.2.0", "ws": "^7.5.5", "yoga-layout-prebuilt": "^1.9.6" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "bundled": true, "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "bundled": true, "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "bundled": true, "dev": true }, "has-flag": { "version": "4.0.0", "bundled": true, "dev": true }, "supports-color": { "version": "7.2.0", "bundled": true, "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "is-ci": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "ci-info": "^2.0.0" } }, "is-fullwidth-code-point": { "version": "3.0.0", "bundled": true, "dev": true }, "js-tokens": { "version": "4.0.0", "bundled": true, "dev": true }, "jsesc": { "version": "2.5.2", "bundled": true, "dev": true }, "json5": { "version": "2.2.1", "bundled": true, "dev": true }, "locate-path": { "version": "5.0.0", "bundled": true, "dev": true, "requires": { "p-locate": "^4.1.0" } }, "lodash": { "version": "4.17.21", "bundled": true, "dev": true }, "loose-envify": { "version": "1.4.0", "bundled": true, "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "make-dir": { "version": "3.1.0", "bundled": true, "dev": true, "requires": { "semver": "^6.0.0" } }, "mimic-fn": { "version": "2.1.0", "bundled": true, "dev": true }, "minimatch": { "version": "3.1.2", "bundled": true, "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minipass": { "version": "3.1.6", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } }, "ms": { "version": "2.1.2", "bundled": true, "dev": true }, "node-releases": { "version": "2.0.2", "bundled": true, "dev": true }, "object-assign": { "version": "4.1.1", "bundled": true, "dev": true }, "once": { "version": "1.4.0", "bundled": true, "dev": true, "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", "bundled": true, "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, "p-limit": { "version": "2.3.0", "bundled": true, "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", "bundled": true, "dev": true, "requires": { "p-limit": "^2.2.0" } }, "p-try": { "version": "2.2.0", "bundled": true, "dev": true }, "patch-console": { "version": "1.0.0", "bundled": true, "dev": true }, "path-exists": { "version": "4.0.0", "bundled": true, "dev": true }, "path-is-absolute": { "version": "1.0.1", "bundled": true, "dev": true }, "picocolors": { "version": "1.0.0", "bundled": true, "dev": true }, "pkg-dir": { "version": "4.2.0", "bundled": true, "dev": true, "requires": { "find-up": "^4.0.0" } }, "punycode": { "version": "2.1.1", "bundled": true, "dev": true }, "react": { "version": "17.0.2", "bundled": true, "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "react-devtools-core": { "version": "4.24.1", "bundled": true, "dev": true, "requires": { "shell-quote": "^1.6.1", "ws": "^7" } }, "react-reconciler": { "version": "0.26.2", "bundled": true, "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "scheduler": "^0.20.2" } }, "redeyed": { "version": "2.1.1", "bundled": true, "dev": true, "requires": { "esprima": "~4.0.0" } }, "resolve-from": { "version": "3.0.0", "bundled": true, "dev": true }, "restore-cursor": { "version": "3.1.0", "bundled": true, "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "rimraf": { "version": "3.0.2", "bundled": true, "dev": true, "requires": { "glob": "^7.1.3" } }, "safe-buffer": { "version": "5.1.2", "bundled": true, "dev": true }, "scheduler": { "version": "0.20.2", "bundled": true, "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "semver": { "version": "6.3.0", "bundled": true, "dev": true }, "shell-quote": { "version": "1.7.3", "bundled": true, "dev": true }, "signal-exit": { "version": "3.0.7", "bundled": true, "dev": true }, "slice-ansi": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "bundled": true, "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "bundled": true, "dev": true } } }, "source-map": { "version": "0.5.7", "bundled": true, "dev": true }, "stack-utils": { "version": "2.0.5", "bundled": true, "dev": true, "requires": { "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "bundled": true, "dev": true } } }, "string-width": { "version": "4.2.3", "bundled": true, "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "strip-ansi": { "version": "6.0.1", "bundled": true, "dev": true, "requires": { "ansi-regex": "^5.0.1" } }, "supports-color": { "version": "5.5.0", "bundled": true, "dev": true, "requires": { "has-flag": "^3.0.0" } }, "tap-parser": { "version": "11.0.1", "bundled": true, "dev": true, "requires": { "events-to-array": "^1.0.1", "minipass": "^3.1.6", "tap-yaml": "^1.0.0" } }, "tap-yaml": { "version": "1.0.0", "bundled": true, "dev": true, "requires": { "yaml": "^1.5.0" } }, "to-fast-properties": { "version": "2.0.0", "bundled": true, "dev": true }, "treport": { "version": "3.0.3", "bundled": true, "dev": true, "requires": { "@isaacs/import-jsx": "^4.0.1", "cardinal": "^2.1.1", "chalk": "^3.0.0", "ink": "^3.2.0", "ms": "^2.1.2", "tap-parser": "^11.0.0", "unicode-length": "^2.0.2" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "bundled": true, "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "bundled": true, "dev": true }, "has-flag": { "version": "4.0.0", "bundled": true, "dev": true }, "supports-color": { "version": "7.2.0", "bundled": true, "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "type-fest": { "version": "0.12.0", "bundled": true, "dev": true }, "unicode-length": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "punycode": "^2.0.0", "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { "ansi-regex": "^2.0.0" } } } }, "widest-line": { "version": "3.1.0", "bundled": true, "dev": true, "requires": { "string-width": "^4.0.0" } }, "wrap-ansi": { "version": "6.2.0", "bundled": true, "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "bundled": true, "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "bundled": true, "dev": true } } }, "wrappy": { "version": "1.0.2", "bundled": true, "dev": true }, "ws": { "version": "7.5.7", "bundled": true, "dev": true }, "yallist": { "version": "4.0.0", "bundled": true, "dev": true }, "yaml": { "version": "1.10.2", "bundled": true, "dev": true }, "yoga-layout-prebuilt": { "version": "1.10.0", "bundled": true, "dev": true, "requires": { "@types/yoga-layout": "1.9.2" } } } }, "tap-mocha-reporter": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz", "integrity": "sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g==", "dev": true, "requires": { "color-support": "^1.1.0", "debug": "^4.1.1", "diff": "^4.0.1", "escape-string-regexp": "^2.0.0", "glob": "^7.0.5", "tap-parser": "^11.0.0", "tap-yaml": "^1.0.0", "unicode-length": "^2.0.2" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "tap-parser": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.1.tgz", "integrity": "sha512-5ow0oyFOnXVSALYdidMX94u0GEjIlgc/BPFYLx0yRh9hb8+cFGNJqJzDJlUqbLOwx8+NBrIbxCWkIQi7555c0w==", "dev": true, "requires": { "events-to-array": "^1.0.1", "minipass": "^3.1.6", "tap-yaml": "^1.0.0" }, "dependencies": { "minipass": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "tap-yaml": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz", "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==", "dev": true, "requires": { "yaml": "^1.5.0" } }, "tar": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^3.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "tcompare": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", "dev": true, "requires": { "diff": "^4.0.2" } }, "terser": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", "dev": true, "requires": { "process": "~0.11.0" } }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" } }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", "integrity": "sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw==", "dev": true }, "tsconfig-paths": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", "minimist": "^1.2.0", "strip-bom": "^3.0.0" }, "dependencies": { "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { "minimist": "^1.2.0" } } } }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" } }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { "is-typedarray": "^1.0.0" } }, "umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", "dev": true }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", "has-symbols": "^1.0.2", "which-boxed-primitive": "^1.0.2" } }, "undeclared-identifiers": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", "dev": true, "requires": { "acorn-node": "^1.3.0", "dash-ast": "^1.0.0", "get-assigned-identifiers": "^1.2.0", "simple-concat": "^1.0.0", "xtend": "^4.0.1" } }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-length": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.0.2.tgz", "integrity": "sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg==", "dev": true, "requires": { "punycode": "^2.0.0", "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" } } } }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true }, "unicode-property-aliases-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" }, "dependencies": { "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" }, "dependencies": { "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true } } }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dev": true, "requires": { "inherits": "2.0.3" }, "dependencies": { "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true } } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } } soldair-node-qrcode-5d87b5f/package.json000066400000000000000000000033461465424452300203000ustar00rootroot00000000000000{ "name": "qrcode", "description": "QRCode / 2d Barcode api with both server side and client side support using canvas", "version": "1.5.4", "author": "Ryan Day ", "contributors": [ "Vincenzo Greco ", "Linus Unnebäck " ], "keywords": [ "qr", "code", "canvas", "qrcode" ], "main": "./lib/index.js", "browser": { "./lib/index.js": "./lib/browser.js", "fs": false }, "files": [ "bin", "build", "lib", "helper" ], "homepage": "http://github.com/soldair/node-qrcode", "license": "MIT", "scripts": { "lint": "standard", "pretest": "npm run lint", "test": "node --throw-deprecation test.js", "build": "rollup -c", "prepublish": "npm run build", "browser": "node examples/clientsideserver.js" }, "bin": { "qrcode": "./bin/qrcode" }, "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "devDependencies": { "@babel/core": "^7.9.0", "@babel/preset-env": "^7.9.5", "@rollup/plugin-commonjs": "^11.1.0", "@rollup/plugin-node-resolve": "^7.1.3", "browserify": "^16.5.1", "canvas": "^2.8.0", "canvasutil": "0.0.4", "colors": "^1.4.0", "express": "^4.17.1", "htmlparser2": "^4.1.0", "rollup": "^2.6.1", "rollup-plugin-babel": "^4.4.0", "rollup-plugin-terser": "^5.3.0", "sinon": "^9.0.2", "standard": "^16.0.4", "tap": "^16.2.0" }, "repository": { "type": "git", "url": "git://github.com/soldair/node-qrcode.git" }, "engines": { "node": ">=10.13.0" }, "standard": { "ignore": [ "build/", "examples/vendors/", "lib/core/regex.js" ] } } soldair-node-qrcode-5d87b5f/rollup.config.js000066400000000000000000000012751465424452300211300ustar00rootroot00000000000000import babel from 'rollup-plugin-babel' import { terser } from 'rollup-plugin-terser' import commonjs from '@rollup/plugin-commonjs' import resolve from '@rollup/plugin-node-resolve' const babelConfig = { babelrc: false, presets: [['@babel/preset-env', { targets: 'defaults, IE >= 10, Safari >= 5.1' }]] } export default [{ input: 'lib/browser.js', output: { file: 'build/qrcode.js', format: 'iife', name: 'QRCode', exports: 'named' }, plugins: [commonjs(), resolve(), babel(babelConfig), terser()] }, { input: 'helper/to-sjis-browser.js', output: { file: 'build/qrcode.tosjis.js', format: 'iife', exports: 'none' }, plugins: [commonjs(), resolve(), babel(babelConfig), terser()] }] soldair-node-qrcode-5d87b5f/test.js000066400000000000000000000006101465424452300173160ustar00rootroot00000000000000const spawn = require('child_process').spawn const path = require('path') const opt = { cwd: __dirname, env: (function () { process.env.NODE_PATH = './' + path.delimiter + './lib' return process.env }()), stdio: [process.stdin, process.stdout, process.stderr] } spawn('node', [ 'node_modules/.bin/tap', '--cov', '--100', process.argv[2] || 'test/**/*.test.js' ], opt) soldair-node-qrcode-5d87b5f/test/000077500000000000000000000000001465424452300167635ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/test/e2e/000077500000000000000000000000001465424452300174365ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/test/e2e/svg.expected.out000066400000000000000000000033311465424452300225660ustar00rootroot00000000000000 soldair-node-qrcode-5d87b5f/test/e2e/svgtag.expected.out000066400000000000000000000031211465424452300232570ustar00rootroot00000000000000 soldair-node-qrcode-5d87b5f/test/e2e/terminal.expected.out000066400000000000000000000175571465424452300236210ustar00rootroot00000000000000                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    soldair-node-qrcode-5d87b5f/test/e2e/toCanvas.test.js000066400000000000000000000056531465424452300225410ustar00rootroot00000000000000const test = require('tap').test const { Canvas, createCanvas } = require('canvas') const QRCode = require('lib') const Helpers = require('test/helpers') test('toCanvas - no promise available', function (t) { Helpers.removeNativePromise() // Mock document object global.document = { createElement: function (el) { if (el === 'canvas') { return createCanvas(200, 200) } } } const canvasEl = createCanvas(200, 200) t.throw(function () { QRCode.toCanvas() }, 'Should throw if no arguments are provided') t.throw(function () { QRCode.toCanvas('some text') }, 'Should throw if a callback is not provided') t.throw(function () { QRCode.toCanvas(canvasEl, 'some text') }, 'Should throw if a callback is not provided') t.throw(function () { QRCode.toCanvas(canvasEl, 'some text', {}) }, 'Should throw if callback is not a function') t.end() global.document = undefined Helpers.restoreNativePromise() }) test('toCanvas', function (t) { // Mock document object global.document = { createElement: function (el) { if (el === 'canvas') { return createCanvas(200, 200) } } } t.plan(7) t.throw(function () { QRCode.toCanvas() }, 'Should throw if no arguments are provided') QRCode.toCanvas('some text', function (err, canvasEl) { t.ok(!err, 'There should be no error') t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object') }) QRCode.toCanvas('some text', { errorCorrectionLevel: 'H' }, function (err, canvasEl) { t.ok(!err, 'There should be no error') t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object') }) QRCode.toCanvas('some text').then(function (canvasEl) { t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object (promise)') }) QRCode.toCanvas('some text', { errorCorrectionLevel: 'H' }).then(function (canvasEl) { t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object (promise)') }) global.document = undefined }) test('toCanvas with specified canvas element', function (t) { const canvasEl = createCanvas(200, 200) t.plan(6) QRCode.toCanvas(canvasEl, 'some text', function (err, canvasEl) { t.ok(!err, 'There should be no error') t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object') }) QRCode.toCanvas(canvasEl, 'some text', { errorCorrectionLevel: 'H' }, function (err, canvasEl) { t.ok(!err, 'There should be no error') t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object') }) QRCode.toCanvas(canvasEl, 'some text').then(function (canvasEl) { t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object (promise)') }) QRCode.toCanvas(canvasEl, 'some text', { errorCorrectionLevel: 'H' }).then(function (canvasEl) { t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object (promise)') }) }) soldair-node-qrcode-5d87b5f/test/e2e/toDataURL.test.js000066400000000000000000000154611465424452300225600ustar00rootroot00000000000000const test = require('tap').test const QRCode = require('lib') const QRCodeBrowser = require('lib/browser') const { createCanvas } = require('canvas') const Helpers = require('test/helpers') test('toDataURL - no promise available', function (t) { Helpers.removeNativePromise() t.throw(function () { QRCode.toDataURL() }, 'Should throw if no arguments are provided') t.throw(function () { QRCode.toDataURL(function () {}) }, 'Should throw if text is not provided') t.throw(function () { QRCode.toDataURL('some text') }, 'Should throw if a callback is not provided') t.throw(function () { QRCode.toDataURL('some text', {}) }, 'Should throw if a callback is not a function') t.throw(function () { QRCodeBrowser.toDataURL() }, 'Should throw if no arguments are provided (browser)') t.throw(function () { QRCodeBrowser.toDataURL(function () {}) }, 'Should throw if text is not provided (browser)') t.throw(function () { QRCodeBrowser.toDataURL('some text') }, 'Should throw if a callback is not provided (browser)') t.throw(function () { QRCodeBrowser.toDataURL('some text', {}) }, 'Should throw if a callback is not a function (browser)') t.end() Helpers.restoreNativePromise() }) test('toDataURL - image/png', function (t) { const expectedDataURL = [ 'data:image/png;base64,', 'iVBORw0KGgoAAAANSUhEUgAAAHQAAAB0CAYAAABUmhYnAAAAAklEQVR4AewaftIAAAKzSU', 'RBVO3BQW7kQAwEwSxC//9y7h55akCQxvYQjIj/scYo1ijFGqVYoxRrlGKNUqxRijVKsUYp', '1ijFGqVYoxRrlGKNUqxRijXKxUNJ+EkqdyShU+mS0Kl0SfhJKk8Ua5RijVKsUS5epvKmJD', 'yh8iaVNyXhTcUapVijFGuUiw9Lwh0qdyShU+mS0Kl0Kk8k4Q6VTyrWKMUapVijXHw5lROV', 'kyR0Kt+sWKMUa5RijXIxTBI6lS4JkxVrlGKNUqxRLj5M5Tcl4UTlCZW/pFijFGuUYo1y8b', 'Ik/KQkdCpdEjqVLgmdykkS/rJijVKsUYo1ysVDKt9M5UTlmxRrlGKNUqxRLh5Kwh0qXRJ+', 'UxLuULkjCZ3KJxVrlGKNUqxRLh5S6ZLQqXRJ6FS6JHQqXRKeSEKn0iWhUzlJwolKl4QTlS', 'eKNUqxRinWKBe/LAmdSpeETuUkCZ1Kl4QTlS4Jd6h0SehUuiS8qVijFGuUYo1y8WFJ6FS6', 'JJyofFISOpVOpUtCp3KicqLypmKNUqxRijXKxYep3JGEE5UuCZ3KHSp3qHRJ6FR+U7FGKd', 'YoxRol/scXS8ITKidJeEKlS8KJyhPFGqVYoxRrlIuHkvCTVE5U7kjCicpJEk6S8JOKNUqx', 'RinWKBcvU3lTEu5IwolKp/KEyh1J6FTeVKxRijVKsUa5+LAk3KHyJpWTJHQqdyShU/lNxR', 'qlWKMUa5SLL6fSJaFLwhNJeCIJP6lYoxRrlGKNcvHlknCicpKEE5UuCSdJOFHpktCpPFGs', 'UYo1SrFGufgwlZ+k0iWhU+lUnlDpktCpdEnoVN5UrFGKNUqxRrl4WRL+EpU7ktCpdCpdEj', 'qVO5LQqTxRrFGKNUqxRon/scYo1ijFGqVYoxRrlGKNUqxRijVKsUYp1ijFGqVYoxRrlGKN', 'UqxRijXKP0OHEepgrecVAAAAAElFTkSuQmCC'].join('') t.plan(8) t.throw(function () { QRCode.toDataURL() }, 'Should throw if no arguments are provided') QRCode.toDataURL('i am a pony!', { errorCorrectionLevel: 'L', type: 'image/png' }, function (err, url) { t.ok(!err, 'there should be no error ' + err) t.equals(url, expectedDataURL, 'url should match expected value for error correction L') }) QRCode.toDataURL('i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'image/png' }, function (err, url) { t.ok(err, 'there should be an error ') t.notOk(url, 'url should be null') }) t.equals(typeof QRCode.toDataURL('i am a pony!').then, 'function', 'Should return a promise') QRCode.toDataURL('i am a pony!', { errorCorrectionLevel: 'L', type: 'image/png' }).then(function (url) { t.equals(url, expectedDataURL, 'url should match expected value for error correction L (promise)') }) QRCode.toDataURL('i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'image/png' }).catch(function (err) { t.ok(err, 'there should be an error (promise)') }) }) test('Canvas toDataURL - image/png', function (t) { const expectedDataURL = [ 'data:image/png;base64,', 'iVBORw0KGgoAAAANSUhEUgAAAIQAAACECAYAAABRRIOnAAAABmJLR0QA/wD/AP+gvaeTAA', 'AC20lEQVR4nO3dQY7jMAwEwM1i///lzGUurYtWEEknQNV1EidjNGhFpuTX+/1+/4Fff5/+', 'AnwWgSAIBEEgCAJBEAiCQBAEgiAQBIEgCARBIAgCQRAIgkAQ/t0e4PV6VXyP/7a2b6yff9', 'vecXq83eufPj+nVAiCQBAEgnA9hlhVt2jursGn1/hbt2OW6fNzSoUgCARBIAjlY4jV6TWu', 'ex7hdt7g6TFA9zIaFYIgEASBILSPIbrdjhlWt/civn2prApBEAiCQBC+fgzR3R8xfa/kaS', 'oEQSAIAkFoH0N82u/y03sVuzFJ9xhlmgpBEAiCQBDKxxDTv8u7+x9uP3/3+k+jQhAEgiAQ', 'hOsxxNO/o0/7G07/fuvp83NKhSAIBEEgCK/u52VUzwNUr6Ponkc4Pb3V+1OcUiEIAkEQCE', 'L5HlPT17zuPZ1ux0Dde2BVUyEIAkEQCEL5vYzTa271NfF2nUb1vMj097mlQhAEgiAQhPG1', 'nbf3IqbnBXZjnuq9sKfncVYqBEEgCAJBGL+XsTqdp6g+/qr7Gr2q/n/0Q1BKIAgCQSjvqa', 'z+3b07/qq6h3G6Z3P3/h1jCEoJBEEgCO3zEJ/ej3Cq+hlb3etSTqkQBIEgCATh4+YhqucF', 'nu5fmD7+LRWCIBAEgSA83g+xmu45nH4m1+3nd1MhCAJBEAhC+x5T3br7I05193d0P5tchS', 'AIBEEgCOXzEN1un3lV/Qyt6nUe3f0OOyoEQSAIAkEo3x+ielrj9Bq96h5z7Dx9b+eUCkEQ', 'CIJAENr3mJpemzjdU7l7/7dRIQgCQRAIwvg+ldWm13Wc6t4Hs5oKQRAIgkAQvn4MUb1WdP', 'q5nKevt08lowSCIBCE9jHE9F7R0/MGu7/f9lDqh+BRAkEQCML12s6n12Wcqp5n6N5X8/Tz', 'zENQSiAIAkH4+v0hqKVCEASCIBAEgSAIBEEgCAJBEAiCQBAEgiAQBIEgCARBIAgCQfgBlZ', '7HAm5AupgAAAAASUVORK5CYII='].join('') t.plan(11) t.throw(function () { QRCodeBrowser.toDataURL() }, 'Should throw if no arguments are provided') t.throw(function () { QRCodeBrowser.toDataURL(function () {}) }, 'Should throw if text is not provided') const canvas = createCanvas(200, 200) QRCodeBrowser.toDataURL(canvas, 'i am a pony!', { errorCorrectionLevel: 'H', type: 'image/png' }, function (err, url) { t.ok(!err, 'there should be no error ' + err) t.equals(url, expectedDataURL, 'url generated should match expected value') }) QRCodeBrowser.toDataURL(canvas, 'i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'image/png' }, function (err, url) { t.ok(err, 'there should be an error ') t.notOk(url, 'url should be null') }) QRCodeBrowser.toDataURL(canvas, 'i am a pony!', { errorCorrectionLevel: 'H', type: 'image/png' }).then(function (url) { t.equals(url, expectedDataURL, 'url generated should match expected value (promise)') }) QRCodeBrowser.toDataURL(canvas, 'i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'image/png' }).catch(function (err) { t.ok(err, 'there should be an error (promise)') }) // Mock document object global.document = { createElement: function (el) { if (el === 'canvas') { return createCanvas(200, 200) } } } QRCodeBrowser.toDataURL('i am a pony!', { errorCorrectionLevel: 'H', type: 'image/png' }, function (err, url) { t.ok(!err, 'there should be no error ' + err) t.equals(url, expectedDataURL, 'url generated should match expected value') }) QRCodeBrowser.toDataURL('i am a pony!', { errorCorrectionLevel: 'H', type: 'image/png' }).then(function (url) { t.equals(url, expectedDataURL, 'url generated should match expected value (promise)') }) }) soldair-node-qrcode-5d87b5f/test/e2e/toFile.test.js000066400000000000000000000216471465424452300222060ustar00rootroot00000000000000const test = require('tap').test const fs = require('fs') const path = require('path') const os = require('os') const sinon = require('sinon') const QRCode = require('lib') const Helpers = require('test/helpers') const StreamMock = require('test/mocks/writable-stream') test('toFile - no promise available', function (t) { Helpers.removeNativePromise() const fileName = path.join(os.tmpdir(), 'qrimage.png') t.throw(function () { QRCode.toFile(fileName, 'some text') }, 'Should throw if a callback is not provided') t.throw(function () { QRCode.toFile(fileName, 'some text', {}) }, 'Should throw if a callback is not a function') t.end() Helpers.restoreNativePromise() }) test('toFile', function (t) { const fileName = path.join(os.tmpdir(), 'qrimage.png') t.throw(function () { QRCode.toFile('some text', function () {}) }, 'Should throw if path is not provided') t.throw(function () { QRCode.toFile(fileName) }, 'Should throw if text is not provided') t.equal(typeof QRCode.toFile(fileName, 'some text').then, 'function', 'Should return a promise') t.end() }) test('toFile png', function (t) { const fileName = path.join(os.tmpdir(), 'qrimage.png') const expectedBase64Output = [ 'iVBORw0KGgoAAAANSUhEUgAAAHQAAAB0CAYAAABUmhYnAAAAAklEQVR4AewaftIAAAKzSU', 'RBVO3BQW7kQAwEwSxC//9y7h55akCQxvYQjIj/scYo1ijFGqVYoxRrlGKNUqxRijVKsUYp', '1ijFGqVYoxRrlGKNUqxRijXKxUNJ+EkqdyShU+mS0Kl0SfhJKk8Ua5RijVKsUS5epvKmJD', 'yh8iaVNyXhTcUapVijFGuUiw9Lwh0qdyShU+mS0Kl0Kk8k4Q6VTyrWKMUapVijXHw5lROV', 'kyR0Kt+sWKMUa5RijXIxTBI6lS4JkxVrlGKNUqxRLj5M5Tcl4UTlCZW/pFijFGuUYo1y8b', 'Ik/KQkdCpdEjqVLgmdykkS/rJijVKsUYo1ysVDKt9M5UTlmxRrlGKNUqxRLh5Kwh0qXRJ+', 'UxLuULkjCZ3KJxVrlGKNUqxRLh5S6ZLQqXRJ6FS6JHQqXRKeSEKn0iWhUzlJwolKl4QTlS', 'eKNUqxRinWKBe/LAmdSpeETuUkCZ1Kl4QTlS4Jd6h0SehUuiS8qVijFGuUYo1y8WFJ6FS6', 'JJyofFISOpVOpUtCp3KicqLypmKNUqxRijXKxYep3JGEE5UuCZ3KHSp3qHRJ6FR+U7FGKd', 'YoxRol/scXS8ITKidJeEKlS8KJyhPFGqVYoxRrlIuHkvCTVE5U7kjCicpJEk6S8JOKNUqx', 'RinWKBcvU3lTEu5IwolKp/KEyh1J6FTeVKxRijVKsUa5+LAk3KHyJpWTJHQqdyShU/lNxR', 'qlWKMUa5SLL6fSJaFLwhNJeCIJP6lYoxRrlGKNcvHlknCicpKEE5UuCSdJOFHpktCpPFGs', 'UYo1SrFGufgwlZ+k0iWhU+lUnlDpktCpdEnoVN5UrFGKNUqxRrl4WRL+EpU7ktCpdCpdEj', 'qVO5LQqTxRrFGKNUqxRon/scYo1ijFGqVYoxRrlGKNUqxRijVKsUYp1ijFGqVYoxRrlGKN', 'UqxRijXKP0OHEepgrecVAAAAAElFTkSuQmCC'].join('') t.plan(8) QRCode.toFile(fileName, 'i am a pony!', { errorCorrectionLevel: 'L' }, function (err) { t.ok(!err, 'There should be no error') fs.stat(fileName, function (err) { t.ok(!err, 'Should save file with correct file name') }) fs.readFile(fileName, function (err, buffer) { if (err) throw err t.equal(buffer.toString('base64'), expectedBase64Output, 'Should write correct content') }) }) QRCode.toFile(fileName, 'i am a pony!', { errorCorrectionLevel: 'L', type: 'png' }, function (err) { t.ok(!err, 'There should be no errors if file type is specified') }) QRCode.toFile(fileName, 'i am a pony!', { errorCorrectionLevel: 'L' }).then(function () { fs.stat(fileName, function (err) { t.ok(!err, 'Should save file with correct file name (promise)') }) fs.readFile(fileName, function (err, buffer) { if (err) throw err t.equal(buffer.toString('base64'), expectedBase64Output, 'Should write correct content (promise)') }) }) const fsStub = sinon.stub(fs, 'createWriteStream') fsStub.returns(new StreamMock().forceErrorOnWrite()) QRCode.toFile(fileName, 'i am a pony!', { errorCorrectionLevel: 'L' }, function (err) { t.ok(err, 'There should be an error') }) QRCode.toFile(fileName, 'i am a pony!', { errorCorrectionLevel: 'L' }).catch(function (err) { t.ok(err, 'Should catch an error (promise)') }) fsStub.restore() }) test('toFile svg', function (t) { const fileName = path.join(os.tmpdir(), 'qrimage.svg') const expectedOutput = fs.readFileSync( path.join(__dirname, '/svg.expected.out'), 'UTF-8') t.plan(6) QRCode.toFile(fileName, 'http://www.google.com', { errorCorrectionLevel: 'H' }, function (err) { t.ok(!err, 'There should be no error') fs.stat(fileName, function (err) { t.ok(!err, 'Should save file with correct file name') }) fs.readFile(fileName, 'utf8', function (err, content) { if (err) throw err t.equal(content, expectedOutput, 'Should write correct content') }) }) QRCode.toFile(fileName, 'http://www.google.com', { errorCorrectionLevel: 'H', type: 'svg' }, function (err) { t.ok(!err, 'There should be no errors if file type is specified') }) QRCode.toFile(fileName, 'http://www.google.com', { errorCorrectionLevel: 'H' }).then(function () { fs.stat(fileName, function (err) { t.ok(!err, 'Should save file with correct file name (promise)') }) fs.readFile(fileName, 'utf8', function (err, content) { if (err) throw err t.equal(content, expectedOutput, 'Should write correct content (promise)') }) }) }) test('toFile utf8', function (t) { const fileName = path.join(os.tmpdir(), 'qrimage.txt') const expectedOutput = [ ' ', ' ', ' █▀▀▀▀▀█ â–ˆ â–„â–ˆ â–€ â–ˆ █▀▀▀▀▀█ ', ' â–ˆ ███ â–ˆ ▀█▄▀▄█ ▀▄ â–ˆ ███ â–ˆ ', ' â–ˆ ▀▀▀ â–ˆ ▀▄ â–„ â–„â–€ â–ˆ â–ˆ ▀▀▀ â–ˆ ', ' ▀▀▀▀▀▀▀ â–€ â–€ █▄▀ â–ˆ ▀▀▀▀▀▀▀ ', ' ▀▄ ▀▀▀▀█▀▀█▄ ▄█▄▀█ ▄█▄██▀ ', ' █▄ ▄▀▀▀▄▄█ █▀▀▄█▀ ▀█ █▄▄█ ', ' █▄ ▄█▄▀█▄▄ â–€ ▄██▀▀ â–„ â–„â–€ ', ' █▀▄▄▄▄▀▀█▀▀█▀▀▀█ â–€ ▄█▀█▀█ ', ' â–€ ▀▀▀▀▀▀███▄▄▄▀ █▀▀▀█ ▀█ ', ' █▀▀▀▀▀█ █▀█▀▄ â–„â–„â–ˆ â–€ █▀ â–„â–ˆ ', ' â–ˆ ███ â–ˆ â–ˆ â–ˆ ▀▀██▀███▀█ ██ ', ' â–ˆ ▀▀▀ â–ˆ █▀ â–€ â–ˆ ▀▀▄██ ███ ', ' ▀▀▀▀▀▀▀ ▀▀▀ ▀▀ â–€ â–€ â–€ ', ' ', ' '].join('\n') t.plan(6) QRCode.toFile(fileName, 'http://www.google.com', function (err) { t.ok(!err, 'There should be no error') fs.stat(fileName, function (err) { t.ok(!err, 'Should save file with correct file name') }) fs.readFile(fileName, 'utf8', function (err, content) { if (err) throw err t.equal(content, expectedOutput, 'Should write correct content') }) }) QRCode.toFile(fileName, 'http://www.google.com', { errorCorrectionLevel: 'M', type: 'utf8' }, function (err) { t.ok(!err, 'There should be no errors if file type is specified') }) QRCode.toFile(fileName, 'http://www.google.com') .then(function () { fs.stat(fileName, function (err) { t.ok(!err, 'Should save file with correct file name (promise)') }) fs.readFile(fileName, 'utf8', function (err, content) { if (err) throw err t.equal(content, expectedOutput, 'Should write correct content (promise)') }) }) }) test('toFile manual segments', function (t) { const fileName = path.join(os.tmpdir(), 'qrimage.txt') const segs = [ { data: 'ABCDEFG', mode: 'alphanumeric' }, { data: '0123456', mode: 'numeric' } ] const expectedOutput = [ ' ', ' ', ' █▀▀▀▀▀█ ██▀██ █▀▀▀▀▀█ ', ' â–ˆ ███ â–ˆ █▀█▄ â–ˆ ███ â–ˆ ', ' â–ˆ ▀▀▀ â–ˆ â–ˆ â–„ â–€ â–ˆ ▀▀▀ â–ˆ ', ' ▀▀▀▀▀▀▀ █▄█▄▀ ▀▀▀▀▀▀▀ ', ' ▀██ ▄▀▀▄█▀▀▀▀██▀▀▄ █▀ ', ' ▀█▀▀█▀█▄ â–„ ▄█▀▀▀█▀ ', ' â–€ ▀▀▀ â–€ â–„â–€ â–„ ▄▀▄ ▀▄ ', ' █▀▀▀▀▀█ â–„ █▀█ ▀▀▀▄█▄ ', ' â–ˆ ███ â–ˆ █▀▀▀ ██▀▀ ▀▀ ', ' â–ˆ ▀▀▀ â–ˆ ██ ▄▀▀▀▀▄▀▀█ ', ' ▀▀▀▀▀▀▀ â–€ ▀▀▀▀ ▀▀▀ ', ' ', ' '].join('\n') t.plan(3) QRCode.toFile(fileName, segs, { errorCorrectionLevel: 'L' }, function (err) { t.ok(!err, 'There should be no errors if text is not string') fs.stat(fileName, function (err) { t.ok(!err, 'Should save file with correct file name') }) fs.readFile(fileName, 'utf8', function (err, content) { if (err) throw err t.equal(content, expectedOutput, 'Should write correct content') }) }) }) soldair-node-qrcode-5d87b5f/test/e2e/toFileStream.test.js000066400000000000000000000026031465424452300233510ustar00rootroot00000000000000const test = require('tap').test const sinon = require('sinon') const QRCode = require('lib') const StreamMock = require('../mocks/writable-stream') test('toFileStream png', function (t) { t.throw(function () { QRCode.toFileStream('some text') }, 'Should throw if stream is not provided') t.throw(function () { QRCode.toFileStream(new StreamMock()) }, 'Should throw if text is not provided') const fstream = new StreamMock() const spy = sinon.spy(fstream, 'emit') QRCode.toFileStream(fstream, 'i am a pony!') QRCode.toFileStream(fstream, 'i am a pony!', { type: 'image/png' }) t.ok(spy.neverCalledWith('error'), 'There should be no error') spy.restore() t.end() }) test('toFileStream png with write error', function (t) { const fstreamErr = new StreamMock().forceErrorOnWrite() QRCode.toFileStream(fstreamErr, 'i am a pony!') t.plan(2) fstreamErr.on('error', function (e) { t.ok(e, 'Should return an error') }) }) test('toFileStream png with qrcode error', function (t) { const fstreamErr = new StreamMock() const bigString = Array(200).join('i am a pony!') t.plan(2) fstreamErr.on('error', function (e) { t.ok(e, 'Should return an error') }) QRCode.toFileStream(fstreamErr, bigString) QRCode.toFileStream(fstreamErr, 'i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H' }) }) soldair-node-qrcode-5d87b5f/test/e2e/toString.test.js000066400000000000000000000205671465424452300225750ustar00rootroot00000000000000const test = require('tap').test const fs = require('fs') const path = require('path') const QRCode = require('lib') const browser = require('lib/browser') const Helpers = require('test/helpers') test('toString - no promise available', function (t) { Helpers.removeNativePromise() t.throw(function () { QRCode.toString() }, 'Should throw if text is not provided') t.throw(function () { QRCode.toString('some text') }, 'Should throw if a callback is not provided') t.throw(function () { QRCode.toString('some text', {}) }, 'Should throw if a callback is not a function') t.throw(function () { QRCode.toString() }, 'Should throw if text is not provided (browser)') t.throw(function () { browser.toString('some text') }, 'Should throw if a callback is not provided (browser)') t.throw(function () { browser.toString('some text', {}) }, 'Should throw if a callback is not a function (browser)') t.end() Helpers.restoreNativePromise() }) test('toString', function (t) { t.plan(5) t.throw(function () { QRCode.toString() }, 'Should throw if text is not provided') QRCode.toString('some text', function (err, str) { t.ok(!err, 'There should be no error') t.equals(typeof str, 'string', 'Should return a string') }) t.equals(typeof QRCode.toString('some text').then, 'function', 'Should return a promise') QRCode.toString('some text', { errorCorrectionLevel: 'L' }) .then(function (str) { t.equals(typeof str, 'string', 'Should return a string') }) }) test('toString (browser)', function (t) { t.plan(5) t.throw(function () { browser.toString() }, 'Should throw if text is not provided') browser.toString('some text', function (err, str) { t.ok(!err, 'There should be no error (browser)') t.equals(typeof str, 'string', 'Should return a string (browser)') }) t.equals(typeof browser.toString('some text').then, 'function', 'Should return a promise') browser.toString('some text', { errorCorrectionLevel: 'L' }) .then(function (str) { t.equals(typeof str, 'string', 'Should return a string') }) }) test('toString svg', function (t) { const file = path.join(__dirname, '/svgtag.expected.out') t.plan(6) QRCode.toString('http://www.google.com', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'svg' }, function (err, code) { t.ok(err, 'there should be an error ') t.notOk(code, 'string should be null') }) fs.readFile(file, 'utf8', function (err, expectedSvg) { if (err) throw err QRCode.toString('http://www.google.com', { errorCorrectionLevel: 'H', type: 'svg' }, function (err, code) { t.ok(!err, 'There should be no error') t.equal(code, expectedSvg, 'should output a valid svg') }) }) QRCode.toString('http://www.google.com', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'svg' }).catch(function (err) { t.ok(err, 'there should be an error (promise)') }) fs.readFile(file, 'utf8', function (err, expectedSvg) { if (err) throw err QRCode.toString('http://www.google.com', { errorCorrectionLevel: 'H', type: 'svg' }).then(function (code) { t.equal(code, expectedSvg, 'should output a valid svg (promise)') }) }) }) test('toString browser svg', function (t) { const file = path.join(__dirname, '/svgtag.expected.out') t.plan(3) fs.readFile(file, 'utf8', function (err, expectedSvg) { if (err) throw err browser.toString('http://www.google.com', { errorCorrectionLevel: 'H', type: 'svg' }, function (err, code) { t.ok(!err, 'There should be no error') t.equal(code, expectedSvg, 'should output a valid svg') }) browser.toString('http://www.google.com', { errorCorrectionLevel: 'H', type: 'svg' }).then(function (code) { t.equal(code, expectedSvg, 'should output a valid svg (promise)') }) }) }) test('toString utf8', function (t) { const expectedUtf8 = [ ' ', ' ', ' █▀▀▀▀▀█ â–ˆ â–„â–ˆ â–€ â–ˆ █▀▀▀▀▀█ ', ' â–ˆ ███ â–ˆ ▀█▄▀▄█ ▀▄ â–ˆ ███ â–ˆ ', ' â–ˆ ▀▀▀ â–ˆ ▀▄ â–„ â–„â–€ â–ˆ â–ˆ ▀▀▀ â–ˆ ', ' ▀▀▀▀▀▀▀ â–€ â–€ █▄▀ â–ˆ ▀▀▀▀▀▀▀ ', ' ▀▄ ▀▀▀▀█▀▀█▄ ▄█▄▀█ ▄█▄██▀ ', ' █▄ ▄▀▀▀▄▄█ █▀▀▄█▀ ▀█ █▄▄█ ', ' █▄ ▄█▄▀█▄▄ â–€ ▄██▀▀ â–„ â–„â–€ ', ' █▀▄▄▄▄▀▀█▀▀█▀▀▀█ â–€ ▄█▀█▀█ ', ' â–€ ▀▀▀▀▀▀███▄▄▄▀ █▀▀▀█ ▀█ ', ' █▀▀▀▀▀█ █▀█▀▄ â–„â–„â–ˆ â–€ █▀ â–„â–ˆ ', ' â–ˆ ███ â–ˆ â–ˆ â–ˆ ▀▀██▀███▀█ ██ ', ' â–ˆ ▀▀▀ â–ˆ █▀ â–€ â–ˆ ▀▀▄██ ███ ', ' ▀▀▀▀▀▀▀ ▀▀▀ ▀▀ â–€ â–€ â–€ ', ' ', ' '].join('\n') t.plan(9) QRCode.toString('http://www.google.com', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'utf8' }, function (err, code) { t.ok(err, 'there should be an error ') t.notOk(code, 'string should be null') }) QRCode.toString('http://www.google.com', { errorCorrectionLevel: 'M', type: 'utf8' }, function (err, code) { t.ok(!err, 'There should be no error') t.equal(code, expectedUtf8, 'should output a valid symbol') }) QRCode.toString('http://www.google.com', function (err, code) { t.ok(!err, 'There should be no error') t.equal(code, expectedUtf8, 'Should output a valid symbol with default options') }) QRCode.toString('http://www.google.com', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'utf8' }).catch(function (err) { t.ok(err, 'there should be an error (promise)') }) QRCode.toString('http://www.google.com', { errorCorrectionLevel: 'M', type: 'utf8' }).then(function (code) { t.equal(code, expectedUtf8, 'should output a valid symbol (promise)') }) QRCode.toString('http://www.google.com').then(function (code) { t.equal(code, expectedUtf8, 'Should output a valid symbol with default options (promise)') }) }) test('toString terminal', function (t) { const expectedTerminal = fs.readFileSync(path.join(__dirname, '/terminal.expected.out')) + '' t.plan(3) QRCode.toString('http://www.google.com', { errorCorrectionLevel: 'M', type: 'terminal' }, function (err, code) { t.ok(!err, 'There should be no error') t.equal(code + '\n', expectedTerminal, 'should output a valid symbol') }) QRCode.toString('http://www.google.com', { errorCorrectionLevel: 'M', type: 'terminal' }).then(function (code) { t.equal(code + '\n', expectedTerminal, 'should output a valid symbol (promise)') }) }) test('toString byte-input', function (t) { const expectedOutput = [ ' ', ' ', ' █▀▀▀▀▀█ █▄█▀ █▀▀▀▀▀█ ', ' â–ˆ ███ â–ˆ ▀█ █▀ â–ˆ ███ â–ˆ ', ' â–ˆ ▀▀▀ â–ˆ â–€ â–ˆ â–ˆ ▀▀▀ â–ˆ ', ' ▀▀▀▀▀▀▀ █▄▀▄█ ▀▀▀▀▀▀▀ ', ' ▀██▄██▀▀▀█▀▀ ▀█ ▄▀▄ ', ' ▀█▀▄█▄▀▄ ██ â–€ â–„ ▀▄ â–€ ', ' â–€ â–€ ▀▀▀▀█▄ ▄▀▄▀▄▀▄▀▄▀ ', ' █▀▀▀▀▀█ â–ˆ █▄█▀█▄█ â–€ ', ' â–ˆ ███ â–ˆ ▀█▀▀ ▀██ ▀█▀ ', ' â–ˆ ▀▀▀ â–ˆ ██▀ â–€ â–„ ▀▄▀▄▀ ', ' ▀▀▀▀▀▀▀ ▀▀▀ â–€ ▀▀▀ ▀▀▀ ', ' ', ' ' ].join('\n') const byteInput = new Uint8ClampedArray([1, 2, 3, 4, 5]) t.plan(2) QRCode.toString([{ data: byteInput, mode: 'byte' }], { errorCorrectionLevel: 'L' }, (err, code) => { t.ok(!err, 'there should be no error') t.equal(code, expectedOutput, 'should output the correct code') }) }) soldair-node-qrcode-5d87b5f/test/helpers.js000066400000000000000000000003721465424452300207650ustar00rootroot00000000000000const nativePromise = global.Promise exports.removeNativePromise = function () { if (global.Promise) { delete global.Promise } } exports.restoreNativePromise = function () { if (!global.Promise) { global.Promise = nativePromise } } soldair-node-qrcode-5d87b5f/test/mocks/000077500000000000000000000000001465424452300200775ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/test/mocks/writable-stream.js000066400000000000000000000012041465424452300235340ustar00rootroot00000000000000const stream = require('stream') const util = require('util') function WritableStream () { stream.Writable.call(this) this.forceError = false this.once('finish', function () { this.close() }) } util.inherits(WritableStream, stream.Writable) WritableStream.prototype._write = function (data, encoding, cb) { if (this.forceError) this.emit('error', new Error('Fake error')) cb(this.forceError || null) } WritableStream.prototype.close = function (cb) { this.emit('close') if (cb) cb() } WritableStream.prototype.forceErrorOnWrite = function () { this.forceError = true return this } module.exports = WritableStream soldair-node-qrcode-5d87b5f/test/unit/000077500000000000000000000000001465424452300177425ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/test/unit/core/000077500000000000000000000000001465424452300206725ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/test/unit/core/alignment-pattern.test.js000077500000000000000000000037201465424452300256440ustar00rootroot00000000000000const test = require('tap').test const pattern = require('core/alignment-pattern') /** * Row/column coordinates of the center module of each alignment pattern. * Each sub-array refers to a qr code version. * * @type {Array} */ const EXPECTED_POSITION_TABLE = [ [], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170] ] test('Alignment pattern - Row/Col coords', function (t) { t.plan(40) for (let i = 1; i <= 40; i++) { const pos = pattern.getRowColCoords(i) t.deepEqual(pos, EXPECTED_POSITION_TABLE[i - 1], 'Should return correct coords') } }) test('Alignment pattern - Positions', function (t) { for (let i = 1; i <= 40; i++) { const pos = pattern.getPositions(i) const expectedPos = EXPECTED_POSITION_TABLE[i - 1] const expectedLength = (Math.pow(expectedPos.length, 2) || 3) - 3 t.equal(pos.length, expectedLength, 'Should return correct number of positions') // For each coord value check if it's present in the expected coords table pos.forEach(function (position) { position.forEach(function (coord) { t.notEqual(expectedPos.indexOf(coord), -1, 'Should return valid coord value') }) }) } t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/alphanumeric-data.test.js000066400000000000000000000020151465424452300255630ustar00rootroot00000000000000const test = require('tap').test const BitBuffer = require('core/bit-buffer') const AlphanumericData = require('core/alphanumeric-data') const Mode = require('core/mode') const testData = [ { data: 'A', length: 1, bitLength: 6, dataBit: [40] }, { data: 'AB', length: 2, bitLength: 11, dataBit: [57, 160] }, { data: 'ABC12', length: 5, bitLength: 28, dataBit: [57, 168, 116, 32] } ] test('Alphanumeric Data', function (t) { testData.forEach(function (data) { const alphanumericData = new AlphanumericData(data.data) t.equal(alphanumericData.mode, Mode.ALPHANUMERIC, 'Mode should be ALPHANUMERIC') t.equal(alphanumericData.getLength(), data.length, 'Should return correct length') t.equal(alphanumericData.getBitsLength(), data.bitLength, 'Should return correct bit length') const bitBuffer = new BitBuffer() alphanumericData.write(bitBuffer) t.deepEqual(bitBuffer.buffer, data.dataBit, 'Should write correct data to buffer') }) t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/bit-buffer.test.js000066400000000000000000000010731465424452300242340ustar00rootroot00000000000000const test = require('tap').test const BitBuffer = require('core/bit-buffer') test('Bit Buffer', function (t) { const testData = 0x41 // 'A' const expectedDataBits = [false, true, false, false, false, false, false, true] const bitBuffer = new BitBuffer() t.equal(bitBuffer.getLengthInBits(), 0, 'Initial length should be 0') bitBuffer.put(testData, 8) t.equal(bitBuffer.getLengthInBits(), 8, 'Length should be 8') for (let i = 0; i < 8; i++) { t.deepEqual(bitBuffer.get(i), expectedDataBits[i], 'Should return correct bit value') } t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/bit-matrix.test.js000066400000000000000000000013261465424452300242700ustar00rootroot00000000000000const test = require('tap').test const BitMatrix = require('core/bit-matrix') test('Bit Matrix', function (t) { t.throw(function () { BitMatrix(0) }, 'Should throw if size is 0') t.throw(function () { BitMatrix(-1) }, 'Should throw if size less than 0') const bm = new BitMatrix(2) t.equal(bm.size, 2, 'Should have correct size') t.equal(bm.data.length, 4, 'Should correctly set buffer size') bm.set(0, 1, true, true) t.ok(bm.get(0, 1), 'Should correctly set bit to true') t.ok(bm.isReserved(0, 1), 'Should correctly set bit as reserved') bm.xor(0, 1, 1) t.ok(!bm.get(0, 1), 'Should correctly xor bit') bm.set(0, 1, false) t.notOk(bm.get(0, 1), 'Should correctly set bit to false') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/byte-data.test.js000066400000000000000000000025571465424452300240710ustar00rootroot00000000000000const test = require('tap').test const BitBuffer = require('core/bit-buffer') const ByteData = require('core/byte-data') const Mode = require('core/mode') test('Byte Data: String Input', function (t) { const text = '1234' const textBitLength = 32 const textByte = [49, 50, 51, 52] // 1, 2, 3, 4 const utf8Text = '\u00bd + \u00bc = \u00be' // 9 char, 12 byte const byteData = new ByteData(text) t.equal(byteData.mode, Mode.BYTE, 'Mode should be BYTE') t.equal(byteData.getLength(), text.length, 'Should return correct length') t.equal(byteData.getBitsLength(), textBitLength, 'Should return correct bit length') const bitBuffer = new BitBuffer() byteData.write(bitBuffer) t.deepEqual(bitBuffer.buffer, textByte, 'Should write correct data to buffer') const byteDataUtf8 = new ByteData(utf8Text) t.equal(byteDataUtf8.getLength(), 12, 'Should return correct length for utf8 chars') t.end() }) test('Byte Data: Byte Input', function (t) { const bytes = new Uint8ClampedArray([1, 231, 32, 22]) const byteData = new ByteData(bytes) t.equal(byteData.getLength(), bytes.length, 'Should return correct length') t.equal(byteData.getBitsLength(), bytes.length * 8, 'Should return correct bit length') const bitBuffer = new BitBuffer() byteData.write(bitBuffer) t.deepEqual(bitBuffer.buffer, bytes, 'Should write correct data to buffer') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/error-correction-code.test.js000066400000000000000000000026141465424452300264170ustar00rootroot00000000000000const test = require('tap').test const Utils = require('core/utils') const Version = require('core/version') const ECLevel = require('core/error-correction-level') const ECCode = require('core/error-correction-code') const Mode = require('core/mode') test('Error correction codewords', function (t) { const levels = [ECLevel.L, ECLevel.M, ECLevel.Q, ECLevel.H] for (let v = 1; v <= 40; v++) { const totalCodewords = Utils.getSymbolTotalCodewords(v) const reservedByte = Math.ceil((Mode.getCharCountIndicator(Mode.BYTE, v) + 4) / 8) for (let l = 0; l < levels.length; l++) { const dataCodewords = Version.getCapacity(v, levels[l], Mode.BYTE) + reservedByte const expectedCodewords = totalCodewords - dataCodewords t.equal(ECCode.getTotalCodewordsCount(v, levels[l]), expectedCodewords, 'Should return correct codewords number') } } t.equal(ECCode.getTotalCodewordsCount(1), undefined, 'Should return undefined if EC level is not specified') t.end() }) test('Error correction blocks', function (t) { const levels = [ECLevel.L, ECLevel.M, ECLevel.Q, ECLevel.H] for (let v = 1; v <= 40; v++) { for (let l = 0; l < levels.length; l++) { t.ok(ECCode.getBlocksCount(v, levels[l]), 'Should return a positive number') } } t.equal(ECCode.getBlocksCount(1), undefined, 'Should return undefined if EC level is not specified') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/error-correction-level.test.js000066400000000000000000000025501465424452300266130ustar00rootroot00000000000000const test = require('tap').test const ECLevel = require('core/error-correction-level') const EC_LEVELS = [ECLevel.L, ECLevel.M, ECLevel.Q, ECLevel.H] test('Error level from input value', function (t) { const values = [['l', 'low'], ['m', 'medium'], ['q', 'quartile'], ['h', 'high']] for (let l = 0; l < values.length; l++) { for (let i = 0; i < values[l].length; i++) { t.equal(ECLevel.from(values[l][i]), EC_LEVELS[l]) t.equal(ECLevel.from(values[l][i].toUpperCase()), EC_LEVELS[l]) } } t.equal(ECLevel.from(ECLevel.L), ECLevel.L, 'Should return passed level if value is valid') t.equal(ECLevel.from(undefined, ECLevel.M), ECLevel.M, 'Should return default level if value is undefined') t.equal(ECLevel.from('', ECLevel.Q), ECLevel.Q, 'Should return default level if value is invalid') t.end() }) test('Error level validity', function (t) { for (let l = 0; l < EC_LEVELS.length; l++) { t.ok(ECLevel.isValid(EC_LEVELS[l]), 'Should return true if error level is valid') } t.notOk(ECLevel.isValid(undefined), 'Should return false if level is undefined') t.notOk(ECLevel.isValid({}), 'Should return false if bit property is undefined') t.notOk(ECLevel.isValid({ bit: -1 }), 'Should return false if bit property value is < 0') t.notOk(ECLevel.isValid({ bit: 4 }), 'Should return false if bit property value is > 3') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/finder-pattern.test.js000077500000000000000000000004061465424452300251330ustar00rootroot00000000000000const test = require('tap').test const pattern = require('core/finder-pattern') test('Finder pattern', function (t) { for (let i = 1; i <= 40; i++) { t.equal(pattern.getPositions(i).length, 3, 'Should always return 3 pattern positions') } t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/format-info.test.js000066400000000000000000000016041465424452300244300ustar00rootroot00000000000000const test = require('tap').test const FormatInfo = require('core/format-info') const ECLevel = require('core/error-correction-level') const MaskPattern = require('core/mask-pattern') const EXPECTED_FORMAT_BITS = [ [0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976], [0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0], [0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed], [0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b] ] test('Format encoded info', function (t) { const levels = [ECLevel.L, ECLevel.M, ECLevel.Q, ECLevel.H] const patterns = Object.keys(MaskPattern.Patterns).length for (let l = 0; l < levels.length; l++) { for (let p = 0; p < patterns; p++) { const bch = FormatInfo.getEncodedBits(levels[l], p) t.equal(bch, EXPECTED_FORMAT_BITS[l][p], 'Should return correct bits') } } t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/galois-field.test.js000066400000000000000000000013521465424452300245460ustar00rootroot00000000000000const test = require('tap').test const GF = require('core/galois-field') test('Galois Field', function (t) { t.throw(function () { GF.log(0) }, 'Should throw for log(n) with n < 1') for (let i = 1; i < 255; i++) { t.equal(GF.log(GF.exp(i)), i, 'log and exp should be one the inverse of the other') t.equal(GF.exp(GF.log(i)), i, 'exp and log should be one the inverse of the other') } t.equal(GF.mul(0, 1), 0, 'Should return 0 if first param is 0') t.equal(GF.mul(1, 0), 0, 'Should return 0 if second param is 0') t.equal(GF.mul(0, 0), 0, 'Should return 0 if both params are 0') for (let j = 1; j < 255; j++) { t.equal(GF.mul(j, 255 - j), GF.mul(255 - j, j), 'Multiplication should be commutative') } t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/kanji-data.test.js000066400000000000000000000017401465424452300242130ustar00rootroot00000000000000const test = require('tap').test const BitBuffer = require('core/bit-buffer') const KanjiData = require('core/kanji-data') const Mode = require('core/mode') const toSJIS = require('helper/to-sjis') require('core/utils').setToSJISFunction(toSJIS) test('Kanji Data', function (t) { const data = '漢字漾癶' const length = 4 const bitLength = 52 // length * 13 const dataBit = [57, 250, 134, 174, 129, 134, 0] let kanjiData = new KanjiData(data) t.equal(kanjiData.mode, Mode.KANJI, 'Mode should be KANJI') t.equal(kanjiData.getLength(), length, 'Should return correct length') t.equal(kanjiData.getBitsLength(), bitLength, 'Should return correct bit length') let bitBuffer = new BitBuffer() kanjiData.write(bitBuffer) t.deepEqual(bitBuffer.buffer, dataBit, 'Should write correct data to buffer') kanjiData = new KanjiData('abc') bitBuffer = new BitBuffer() t.throw(function () { kanjiData.write(bitBuffer) }, 'Should throw if data is invalid') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/mask-pattern.test.js000077500000000000000000000176561465424452300246360ustar00rootroot00000000000000const test = require('tap').test const BitMatrix = require('core/bit-matrix') const MaskPattern = require('core/mask-pattern') test('Mask pattern - Pattern references', function (t) { const patternsCount = Object.keys(MaskPattern.Patterns).length t.equals(patternsCount, 8, 'Should return 8 patterns') t.end() }) const expectedPattern000 = [ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ] const expectedPattern001 = [ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 ] const expectedPattern010 = [ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0 ] const expectedPattern011 = [ 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0 ] const expectedPattern100 = [ 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 ] const expectedPattern101 = [ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0 ] const expectedPattern110 = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1 ] const expectedPattern111 = [ 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0 ] test('MaskPattern validity', function (t) { t.notOk(MaskPattern.isValid(), 'Should return false if no input') t.notOk(MaskPattern.isValid(''), 'Should return false if value is not a number') t.notOk(MaskPattern.isValid(-1), 'Should return false if value is not in range') t.notOk(MaskPattern.isValid(8), 'Should return false if value is not in range') t.end() }) test('MaskPattern from value', function (t) { t.equal(MaskPattern.from(5), 5, 'Should return correct mask pattern from a number') t.equal(MaskPattern.from('5'), 5, 'Should return correct mask pattern from a string') t.equal(MaskPattern.from(-1), undefined, 'Should return undefined if value is invalid') t.equal(MaskPattern.from(null), undefined, 'Should return undefined if value is null') t.end() }) test('Mask pattern - Apply mask', function (t) { const patterns = Object.keys(MaskPattern.Patterns).length const expectedPatterns = [ expectedPattern000, expectedPattern001, expectedPattern010, expectedPattern011, expectedPattern100, expectedPattern101, expectedPattern110, expectedPattern111 ] for (let p = 0; p < patterns; p++) { const matrix = new BitMatrix(6) MaskPattern.applyMask(p, matrix) t.deepEqual(matrix.data, new Uint8Array(expectedPatterns[p]), 'Should return correct pattern') } const matrix = new BitMatrix(2) matrix.set(0, 0, false, true) matrix.set(0, 1, false, true) matrix.set(1, 0, false, true) matrix.set(1, 1, false, true) MaskPattern.applyMask(0, matrix) t.deepEqual(matrix.data, new Uint8Array([false, false, false, false]), 'Should leave reserved bit unchanged') t.throws(function () { MaskPattern.applyMask(-1, new BitMatrix(1)) }, 'Should throw if pattern is invalid') t.end() }) test('Mask pattern - Penalty N1', function (t) { let matrix = new BitMatrix(11) matrix.data = [ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 ] t.equals(MaskPattern.getPenaltyN1(matrix), 59, 'Should return correct penalty points') matrix = new BitMatrix(6) matrix.data = expectedPattern000 t.equals(MaskPattern.getPenaltyN1(matrix), 0, 'Should return correct penalty points') matrix.data = expectedPattern001 t.equals(MaskPattern.getPenaltyN1(matrix), 24, 'Should return correct penalty points') matrix.data = expectedPattern010 t.equals(MaskPattern.getPenaltyN1(matrix), 24, 'Should return correct penalty points') matrix.data = expectedPattern101 t.equals(MaskPattern.getPenaltyN1(matrix), 20, 'Should return correct penalty points') t.end() }) test('Mask pattern - Penalty N2', function (t) { let matrix = new BitMatrix(8) matrix.data = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1 ] t.equals(MaskPattern.getPenaltyN2(matrix), 45, 'Should return correct penalty points') matrix = new BitMatrix(6) matrix.data = expectedPattern000 t.equals(MaskPattern.getPenaltyN2(matrix), 0, 'Should return correct penalty points') matrix.data = expectedPattern010 t.equals(MaskPattern.getPenaltyN2(matrix), 30, 'Should return correct penalty points') matrix.data = expectedPattern100 t.equals(MaskPattern.getPenaltyN2(matrix), 36, 'Should return correct penalty points') t.end() }) test('Mask pattern - Penalty N3', function (t) { const matrix = new BitMatrix(11) matrix.data = [ 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0 ] t.equals(MaskPattern.getPenaltyN3(matrix), 160, 'Should return correct penalty points') matrix.data = [ 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 ] t.equals(MaskPattern.getPenaltyN3(matrix), 280, 'Should return correct penalty points') t.end() }) test('Mask pattern - Penalty N4', function (t) { const matrix = new BitMatrix(10) matrix.data = new Array(50).fill(1).concat(new Array(50).fill(0)) t.equals(MaskPattern.getPenaltyN4(matrix), 0, 'Should return correct penalty points') const matrix2 = new BitMatrix(21) matrix2.data = new Array(190).fill(1).concat(new Array(251).fill(0)) t.equals(MaskPattern.getPenaltyN4(matrix2), 10, 'Should return correct penalty points') const matrix3 = new BitMatrix(10) matrix3.data = new Array(22).fill(1).concat(new Array(78).fill(0)) t.equals(MaskPattern.getPenaltyN4(matrix3), 50, 'Should return correct penalty points') t.end() }) test('Mask pattern - Best mask', function (t) { const matrix = new BitMatrix(11) matrix.data = [ 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0 ] const mask = MaskPattern.getBestMask(matrix, function () {}) t.ok(!isNaN(mask), 'Should return a number') t.ok(mask >= 0 && mask < 8, 'Should return a number in range 0,7') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/mode.test.js000066400000000000000000000074621465424452300231430ustar00rootroot00000000000000const test = require('tap').test const Mode = require('core/mode') test('Mode bits', function (t) { const EXPECTED_BITS = { numeric: 1, alphanumeric: 2, byte: 4, kanji: 8, mixed: -1 } t.equal(Mode.NUMERIC.bit, EXPECTED_BITS.numeric) t.equal(Mode.ALPHANUMERIC.bit, EXPECTED_BITS.alphanumeric) t.equal(Mode.BYTE.bit, EXPECTED_BITS.byte) t.equal(Mode.KANJI.bit, EXPECTED_BITS.kanji) t.equal(Mode.MIXED.bit, EXPECTED_BITS.mixed) t.end() }) test('Char count bits', function (t) { const EXPECTED_BITS = { numeric: [10, 12, 14], alphanumeric: [9, 11, 13], byte: [8, 16, 16], kanji: [8, 10, 12] } let v for (v = 1; v < 10; v++) { t.equal(Mode.getCharCountIndicator(Mode.NUMERIC, v), EXPECTED_BITS.numeric[0]) t.equal(Mode.getCharCountIndicator(Mode.ALPHANUMERIC, v), EXPECTED_BITS.alphanumeric[0]) t.equal(Mode.getCharCountIndicator(Mode.BYTE, v), EXPECTED_BITS.byte[0]) t.equal(Mode.getCharCountIndicator(Mode.KANJI, v), EXPECTED_BITS.kanji[0]) } for (v = 10; v < 27; v++) { t.equal(Mode.getCharCountIndicator(Mode.NUMERIC, v), EXPECTED_BITS.numeric[1]) t.equal(Mode.getCharCountIndicator(Mode.ALPHANUMERIC, v), EXPECTED_BITS.alphanumeric[1]) t.equal(Mode.getCharCountIndicator(Mode.BYTE, v), EXPECTED_BITS.byte[1]) t.equal(Mode.getCharCountIndicator(Mode.KANJI, v), EXPECTED_BITS.kanji[1]) } for (v = 27; v <= 40; v++) { t.equal(Mode.getCharCountIndicator(Mode.NUMERIC, v), EXPECTED_BITS.numeric[2]) t.equal(Mode.getCharCountIndicator(Mode.ALPHANUMERIC, v), EXPECTED_BITS.alphanumeric[2]) t.equal(Mode.getCharCountIndicator(Mode.BYTE, v), EXPECTED_BITS.byte[2]) t.equal(Mode.getCharCountIndicator(Mode.KANJI, v), EXPECTED_BITS.kanji[2]) } t.throw(function () { Mode.getCharCountIndicator({}, 1) }, 'Should throw if mode is invalid') t.throw(function () { Mode.getCharCountIndicator(Mode.BYTE, 0) }, 'Should throw if version is invalid') t.end() }) test('Best mode', function (t) { /* eslint-disable quote-props */ const EXPECTED_MODE = { '12345': Mode.NUMERIC, 'abcde': Mode.BYTE, '1234a': Mode.BYTE, 'ABCDa': Mode.BYTE, 'ABCDE': Mode.ALPHANUMERIC, '12ABC': Mode.ALPHANUMERIC, '乂Ð�Жã�žÎ²': Mode.KANJI, 'ΑΒΓψωЮЯабв': Mode.KANJI, 'çš¿a晒三': Mode.BYTE } Object.keys(EXPECTED_MODE).forEach(function (data) { t.equal(Mode.getBestModeForData(data), EXPECTED_MODE[data], 'Should return mode ' + Mode.toString(EXPECTED_MODE[data]) + ' for data: ' + data) }) t.end() }) test('Is valid', function (t) { t.ok(Mode.isValid(Mode.NUMERIC)) t.ok(Mode.isValid(Mode.ALPHANUMERIC)) t.ok(Mode.isValid(Mode.BYTE)) t.ok(Mode.isValid(Mode.KANJI)) t.notOk(Mode.isValid(undefined)) t.notOk(Mode.isValid({ bit: 1 })) t.notOk(Mode.isValid({ ccBits: [] })) t.end() }) test('From value', function (t) { const modes = [ { name: 'numeric', mode: Mode.NUMERIC }, { name: 'alphanumeric', mode: Mode.ALPHANUMERIC }, { name: 'kanji', mode: Mode.KANJI }, { name: 'byte', mode: Mode.BYTE } ] for (let m = 0; m < modes.length; m++) { t.equal(Mode.from(modes[m].name), modes[m].mode) t.equal(Mode.from(modes[m].name.toUpperCase()), modes[m].mode) t.equal(Mode.from(modes[m].mode), modes[m].mode) } t.equal(Mode.from('', Mode.NUMERIC), Mode.NUMERIC, 'Should return default value if mode is invalid') t.equal(Mode.from(null, Mode.NUMERIC), Mode.NUMERIC, 'Should return default value if mode undefined') t.end() }) test('To string', function (t) { t.equal(Mode.toString(Mode.NUMERIC), 'Numeric') t.equal(Mode.toString(Mode.ALPHANUMERIC), 'Alphanumeric') t.equal(Mode.toString(Mode.BYTE), 'Byte') t.equal(Mode.toString(Mode.KANJI), 'Kanji') t.throw(function () { Mode.toString({}) }, 'Should throw if mode is invalid') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/numeric-data.test.js000066400000000000000000000023011465424452300245530ustar00rootroot00000000000000const test = require('tap').test const BitBuffer = require('core/bit-buffer') const NumericData = require('core/numeric-data') const Mode = require('core/mode') const testData = [ { data: 8, length: 1, bitLength: 4, dataBit: [128] }, { data: 16, length: 2, bitLength: 7, dataBit: [32] }, { data: 128, length: 3, bitLength: 10, dataBit: [32, 0] }, { data: 12345, length: 5, bitLength: 17, // (123)d -> (0001111011)b 10bit // (45)d -> (0101101)b 7bit // // (00011110)b -> (30)d // (11010110)b -> (214)d // (10000000)b -> (128)d dataBit: [30, 214, 128] } ] test('Numeric Data', function (t) { testData.forEach(function (data) { const numericData = new NumericData(data.data) t.equal(numericData.mode, Mode.NUMERIC, 'Mode should be NUMERIC') t.equal(numericData.getLength(), data.length, 'Should return correct length') t.equal(numericData.getBitsLength(), data.bitLength, 'Should return correct bit length') const bitBuffer = new BitBuffer() numericData.write(bitBuffer) t.deepEqual(bitBuffer.buffer, data.dataBit, 'Should write correct data to buffer') }) t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/polynomial.test.js000066400000000000000000000017201465424452300243710ustar00rootroot00000000000000const test = require('tap').test const Poly = require('core/polynomial') test('Generator polynomial', function (t) { const result = Poly.generateECPolynomial(0) t.ok(result instanceof Uint8Array, 'Should return an Uint8Array') t.deepEqual(result, new Uint8Array([1]), 'Should return coeff [1] for polynomial of degree 0') for (let e = 2; e <= 68; e++) { t.equal(Poly.generateECPolynomial(e).length, e + 1, 'Should return a number of coefficients equal to (degree + 1)') } t.end() }) test('Polynomial', function (t) { const p1 = [0, 1, 2, 3, 4] const p2 = [5, 6] let result = Poly.mul(p1, p2) t.ok(result instanceof Uint8Array, 'Should return an Uint8Array') t.equal(result.length, 6, 'Should return correct number of coefficients') result = Poly.mod(p1, Poly.generateECPolynomial(2)) t.ok(result instanceof Uint8Array, 'Should return an Uint8Array') t.equal(result.length, 2, 'Should return correct number of coefficients') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/qrcode.test.js000066400000000000000000000102621465424452300234640ustar00rootroot00000000000000const test = require('tap').test const ECLevel = require('core/error-correction-level') const Version = require('core/version') const QRCode = require('core/qrcode') const toSJIS = require('helper/to-sjis') test('QRCode interface', function (t) { t.type(QRCode.create, 'function', 'Should have "create" function') t.throw(function () { QRCode.create() }, 'Should throw if no data is provided') t.notThrow(function () { QRCode.create('1234567') }, 'Should not throw') let qr = QRCode.create('a123456A', { version: 1, maskPattern: 1, errorCorrectionLevel: 'H' }) t.equal(qr.modules.size, 21, 'Should return correct modules count') t.equal(qr.maskPattern, 1, 'Should return correct mask pattern') const darkModule = qr.modules.get(qr.modules.size - 8, 8) t.ok(darkModule, 'Should have a dark module at coords [size-8][8]') t.throw(function () { qr = QRCode.create({}) }, 'Should throw if invalid data is passed') t.notThrow(function () { qr = QRCode.create('AAAAA00000', { version: 5 }) }, 'Should accept data as string') t.notThrow(function () { qr = QRCode.create([ { data: 'ABCDEFG', mode: 'alphanumeric' }, { data: 'abcdefg' }, { data: '晒三', mode: 'kanji' }, { data: '0123456', mode: 'numeric' } ], { toSJISFunc: toSJIS }) }, 'Should accept data as array of objects') t.notThrow(function () { qr = QRCode.create('AAAAA00000', { errorCorrectionLevel: 'quartile' }) qr = QRCode.create('AAAAA00000', { errorCorrectionLevel: 'q' }) }, 'Should accept errorCorrectionLevel as string') t.end() }) test('QRCode error correction', function (t) { let qr const ecValues = [ { name: ['l', 'low'], level: ECLevel.L }, { name: ['m', 'medium'], level: ECLevel.M }, { name: ['q', 'quartile'], level: ECLevel.Q }, { name: ['h', 'high'], level: ECLevel.H } ] for (let l = 0; l < ecValues.length; l++) { for (let i = 0; i < ecValues[l].name.length; i++) { t.notThrow(function () { qr = QRCode.create('ABCDEFG', { errorCorrectionLevel: ecValues[l].name[i] }) }, 'Should accept errorCorrectionLevel value: ' + ecValues[l].name[i]) t.deepEqual(qr.errorCorrectionLevel, ecValues[l].level, 'Should have correct errorCorrectionLevel value') t.notThrow(function () { qr = QRCode.create('ABCDEFG', { errorCorrectionLevel: ecValues[l].name[i].toUpperCase() }) }, 'Should accept errorCorrectionLevel value: ' + ecValues[l].name[i].toUpperCase()) t.deepEqual(qr.errorCorrectionLevel, ecValues[l].level, 'Should have correct errorCorrectionLevel value') } } qr = QRCode.create('ABCDEFG') t.equal(qr.errorCorrectionLevel, ECLevel.M, 'Should set default EC level to M') t.end() }) test('QRCode version', function (t) { let qr = QRCode.create('data', { version: 9, errorCorrectionLevel: ECLevel.M }) t.equal(qr.version, 9, 'Should create qrcode with correct version') t.equal(qr.errorCorrectionLevel, ECLevel.M, 'Should set correct EC level') t.throw(function () { qr = QRCode.create(new Array(Version.getCapacity(2, ECLevel.H)).join('a'), { version: 1, errorCorrectionLevel: ECLevel.H }) }, 'Should throw if data cannot be contained with chosen version') t.throw(function () { qr = QRCode.create(new Array(Version.getCapacity(40, ECLevel.H) + 2).join('a'), { version: 40, errorCorrectionLevel: ECLevel.H }) }, 'Should throw if data cannot be contained in a qr code') t.notThrow(function () { qr = QRCode.create('abcdefg', { version: 'invalid' }) }, 'Should use best version if the one provided is invalid') t.end() }) test('QRCode capacity', function (t) { let qr qr = QRCode.create([{ data: 'abcdefg', mode: 'byte' }]) t.equal(qr.version, 1, 'Should contain 7 byte characters') qr = QRCode.create([{ data: '12345678901234567', mode: 'numeric' }]) t.equal(qr.version, 1, 'Should contain 17 numeric characters') qr = QRCode.create([{ data: 'ABCDEFGHIL', mode: 'alphanumeric' }]) t.equal(qr.version, 1, 'Should contain 10 alphanumeric characters') qr = QRCode.create([{ data: 'AIã��サ', mode: 'kanji' }], { toSJISFunc: toSJIS }) t.equal(qr.version, 1, 'Should contain 4 kanji characters') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/reed-solomon-encoder.test.js000066400000000000000000000021461465424452300262310ustar00rootroot00000000000000const test = require('tap').test const RS = require('core/reed-solomon-encoder') test('Reed-Solomon encoder', function (t) { let enc = new RS() t.notOk(enc.genPoly, 'Should have an undefined generator polynomial') t.throw(function () { enc.encode([]) }, 'Should throw if generator polynomial is undefined') enc.initialize(2) t.equal(enc.degree, 2, 'Should set correct degree value') t.ok(enc.genPoly, 'Generator polynomial should be defined') const result = enc.encode(new Uint8Array([48, 49, 50, 51, 52])) t.equal(result.length, 2, 'Should return a number of codewords equal to gen poly degree') enc = new RS(2) const genPoly = enc.genPoly t.equal(enc.degree, 2, 'Should set correct degree value') t.ok(genPoly, 'Generator polynomial should be defined') enc.initialize(3) t.notEqual(enc.genPoly, genPoly, 'Should reinitialize the generator polynomial') enc = new RS(0) t.notOk(enc.genPoly, 'Should not create a generator polynomial if degree is 0') enc = new RS(1) t.deepEqual(enc.encode(new Uint8Array([0])), new Uint8Array([0]), 'Should return correct buffer') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/regex.test.js000066400000000000000000000026651465424452300233310ustar00rootroot00000000000000const test = require('tap').test const Regex = require('core/regex') test('Regex', function (t) { t.ok(Regex.NUMERIC instanceof RegExp, 'Should export a regex for NUMERIC') t.ok(Regex.ALPHANUMERIC instanceof RegExp, 'Should export a regex for ALPHANUMERIC') t.ok(Regex.BYTE instanceof RegExp, 'Should export a regex for BYTE') t.ok(Regex.KANJI instanceof RegExp, 'Should export a regex for KANJI') t.ok(Regex.BYTE_KANJI instanceof RegExp, 'Should export a regex for BYTE_KANJI') t.end() }) test('Regex test', function (t) { t.ok(Regex.testNumeric('123456'), 'Should return true if is a number') t.notOk(Regex.testNumeric('a12345'), 'Should return false if is not a number') t.notOk(Regex.testNumeric('ABC123'), 'Should return false if is not a number') t.ok(Regex.testAlphanumeric('123ABC'), 'Should return true if is alphanumeric') t.ok(Regex.testAlphanumeric('123456'), 'Should return true if is alphanumeric') t.notOk(Regex.testAlphanumeric('ABCabc'), 'Should return false if is not alphanumeric') t.ok(Regex.testKanji('乂Ð�Жã�žÎ²'), 'Should return true if is a kanji') t.notOk(Regex.testKanji('çš¿a晒三A'), 'Should return false if is not a kanji') t.notOk(Regex.testKanji('123456'), 'Should return false if is not a kanji') t.notOk(Regex.testKanji('ABC123'), 'Should return false if is not a kanji') t.notOk(Regex.testKanji('abcdef'), 'Should return false if is not a kanji') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/segments.test.js000066400000000000000000000127731465424452300240450ustar00rootroot00000000000000const test = require('tap').test const Mode = require('core/mode') const Segments = require('core/segments') const NumericData = require('core/numeric-data') const AlphanumericData = require('core/alphanumeric-data') const ByteData = require('core/byte-data') const toSJIS = require('helper/to-sjis') const Utils = require('core/utils') let testData = [ { input: '1A1', result: [{ data: '1A1', mode: Mode.ALPHANUMERIC }] }, { input: 'a-1-b-2?', result: [{ data: 'a-1-b-2?', mode: Mode.BYTE }] }, { input: 'AB123456CDF', result: [{ data: 'AB123456CDF', mode: Mode.ALPHANUMERIC }] }, { input: 'aABC000000-?-----a', result: [ { data: 'aABC', mode: Mode.BYTE }, { data: '000000', mode: Mode.NUMERIC }, { data: '-?-----a', mode: Mode.BYTE } ] }, { input: 'aABC000000A?', result: [ { data: 'aABC', mode: Mode.BYTE }, { data: '000000', mode: Mode.NUMERIC }, { data: 'A?', mode: Mode.BYTE } ] }, { input: 'a1234ABCDEF?', result: [ { data: 'a', mode: Mode.BYTE }, { data: '1234ABCDEF', mode: Mode.ALPHANUMERIC }, { data: '?', mode: Mode.BYTE } ] }, { input: '12345A12345', result: [ { data: '12345A12345', mode: Mode.ALPHANUMERIC } ] }, { input: 'aABCDEFGHILMNa', result: [ { data: 'a', mode: Mode.BYTE }, { data: 'ABCDEFGHILMN', mode: Mode.ALPHANUMERIC }, { data: 'a', mode: Mode.BYTE } ] }, { input: 'Aa12345', result: [ { data: 'Aa', mode: Mode.BYTE }, { data: '12345', mode: Mode.NUMERIC } ] }, { input: 'a1A2B3C4D5E6F4G7', result: [ { data: 'a', mode: Mode.BYTE }, { data: '1A2B3C4D5E6F4G7', mode: Mode.ALPHANUMERIC } ] }, { input: '123456789QWERTYUIOPASD', result: [ { data: '123456789', mode: Mode.NUMERIC }, { data: 'QWERTYUIOPASD', mode: Mode.ALPHANUMERIC } ] }, { input: 'QWERTYUIOPASD123456789', result: [ { data: 'QWERTYUIOPASD', mode: Mode.ALPHANUMERIC }, { data: '123456789', mode: Mode.NUMERIC } ] }, { input: 'ABCDEF123456a', result: [ { data: 'ABCDEF123456', mode: Mode.ALPHANUMERIC }, { data: 'a', mode: Mode.BYTE } ] }, { input: 'abcdefABCDEF', result: [ { data: 'abcdef', mode: Mode.BYTE }, { data: 'ABCDEF', mode: Mode.ALPHANUMERIC } ] }, { input: 'a123456ABCDEa', result: [ { data: 'a', mode: Mode.BYTE }, { data: '123456ABCDE', mode: Mode.ALPHANUMERIC }, { data: 'a', mode: Mode.BYTE } ] }, { input: 'AAAAA12345678?A1A', result: [ { data: 'AAAAA', mode: Mode.ALPHANUMERIC }, { data: '12345678', mode: Mode.NUMERIC }, { data: '?A1A', mode: Mode.BYTE } ] }, { input: 'Aaa', result: [{ data: 'Aaa', mode: Mode.BYTE }] }, { input: 'Aa12345A', result: [ { data: 'Aa', mode: Mode.BYTE }, { data: '12345A', mode: Mode.ALPHANUMERIC } ] }, { input: 'ABC\nDEF', result: [ { data: 'ABC\nDEF', mode: Mode.BYTE } ] } ] const kanjiTestData = [ { input: '乂Ð�Жã�žÎ²', result: [{ data: '乂Ð�Жã�žÎ²', mode: Mode.KANJI }] }, { input: 'ΑΒΓψωЮЯабв', result: [{ data: 'ΑΒΓψωЮЯабв', mode: Mode.KANJI }] }, { input: 'çš¿a晒三', result: [ { data: 'çš¿a', mode: Mode.BYTE }, { data: '晒三', mode: Mode.KANJI } ] }, { input: 'çš¿a\n晒三', result: [ { data: 'çš¿a\n', mode: Mode.BYTE }, { data: '晒三', mode: Mode.KANJI } ] } ] testData = testData.concat(kanjiTestData) test('Segments from array', function (t) { t.deepEqual( Segments.fromArray(['abcdef', '12345']), [new ByteData('abcdef'), new NumericData('12345')], 'Should return correct segment from array of string') t.deepEqual( Segments.fromArray([{ data: 'abcdef', mode: Mode.BYTE }, { data: '12345', mode: Mode.NUMERIC }]), [new ByteData('abcdef'), new NumericData('12345')], 'Should return correct segment from array of objects') t.deepEqual( Segments.fromArray([{ data: 'abcdef', mode: 'byte' }, { data: '12345', mode: 'numeric' }]), [new ByteData('abcdef'), new NumericData('12345')], 'Should return correct segment from array of objects if mode is specified as string') t.deepEqual( Segments.fromArray([{ data: 'abcdef' }, { data: '12345' }]), [new ByteData('abcdef'), new NumericData('12345')], 'Should return correct segment from array of objects if mode is not specified') t.deepEqual(Segments.fromArray([{}]), [], 'Should return an empty array') t.throw(function () { Segments.fromArray([{ data: 'ABCDE', mode: 'numeric' }]) }, 'Should throw if segment cannot be encoded with specified mode') t.deepEqual( Segments.fromArray([{ data: 'ï¼�123', mode: Mode.KANJI }]), [new ByteData('ï¼�123')], 'Should use Byte mode if kanji support is disabled') t.end() }) test('Segments optimization', function (t) { t.deepEqual(Segments.fromString('乂Ð�Ж', 1), Segments.fromArray([{ data: '乂Ð�Ж', mode: 'byte' }]), 'Should use Byte mode if Kanji support is disabled') Utils.setToSJISFunction(toSJIS) testData.forEach(function (data) { t.deepEqual(Segments.fromString(data.input, 1), Segments.fromArray(data.result)) }) t.end() }) test('Segments raw split', function (t) { const splitted = [ new ByteData('abc'), new AlphanumericData('DEF'), new NumericData('123') ] t.deepEqual(Segments.rawSplit('abcDEF123'), splitted) t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/utils.test.js000077500000000000000000000035701465424452300233560ustar00rootroot00000000000000const test = require('tap').test const Utils = require('core/utils') /** * QR Code sizes. Each element refers to a version * @type {Array} */ const EXPECTED_SYMBOL_SIZES = [ 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177] test('Symbol size', function (t) { t.throws(function () { Utils.getSymbolSize() }, 'Should throw if version is undefined') t.throws(function () { Utils.getSymbolSize(0) }, 'Should throw if version is not in range') t.throws(function () { Utils.getSymbolSize(41) }, 'Should throw if version is not in range') for (let i = 1; i <= 40; i++) { t.equal(Utils.getSymbolSize(i), EXPECTED_SYMBOL_SIZES[i - 1], 'Should return correct symbol size') } t.end() }) test('Symbol codewords', function (t) { for (let i = 1; i <= 40; i++) { t.ok(Utils.getSymbolTotalCodewords(i), 'Should return positive number') } t.end() }) test('BCH Digit', function (t) { const testData = [ { data: 0, bch: 0 }, { data: 1, bch: 1 }, { data: 2, bch: 2 }, { data: 4, bch: 3 }, { data: 8, bch: 4 } ] testData.forEach(function (d) { t.equal(Utils.getBCHDigit(d.data), d.bch, 'Should return correct BCH for value: ' + d.data) }) t.end() }) test('Set/Get SJIS function', function (t) { t.throw(function () { Utils.setToSJISFunction() }, 'Should throw if param is not a function') t.notOk(Utils.isKanjiModeEnabled(), 'Kanji mode should be disabled if "toSJIS" function is not set') const testFunc = function testFunc (c) { return 'test_' + c } Utils.setToSJISFunction(testFunc) t.ok(Utils.isKanjiModeEnabled(), 'Kanji mode should be enabled if "toSJIS" function is set') t.equal(Utils.toSJIS('a'), 'test_a', 'Should correctly call "toSJIS" function') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/core/version.test.js000066400000000000000000000221741465424452300237010ustar00rootroot00000000000000const test = require('tap').test const Version = require('core/version') const VersionCheck = require('core/version-check') const ECLevel = require('core/error-correction-level') const Mode = require('core/mode') const NumericData = require('core/numeric-data') const AlphanumericData = require('core/alphanumeric-data') const KanjiData = require('core/kanji-data') const ByteData = require('core/byte-data') const EC_LEVELS = [ECLevel.L, ECLevel.M, ECLevel.Q, ECLevel.H] const EXPECTED_NUMERIC_CAPACITY = [ [41, 34, 27, 17], [77, 63, 48, 34], [127, 101, 77, 58], [187, 149, 111, 82], [255, 202, 144, 106], [322, 255, 178, 139], [370, 293, 207, 154], [461, 365, 259, 202], [552, 432, 312, 235], [652, 513, 364, 288], [772, 604, 427, 331], [883, 691, 489, 374], [1022, 796, 580, 427], [1101, 871, 621, 468], [1250, 991, 703, 530], [1408, 1082, 775, 602], [1548, 1212, 876, 674], [1725, 1346, 948, 746], [1903, 1500, 1063, 813], [2061, 1600, 1159, 919], [2232, 1708, 1224, 969], [2409, 1872, 1358, 1056], [2620, 2059, 1468, 1108], [2812, 2188, 1588, 1228], [3057, 2395, 1718, 1286], [3283, 2544, 1804, 1425], [3517, 2701, 1933, 1501], [3669, 2857, 2085, 1581], [3909, 3035, 2181, 1677], [4158, 3289, 2358, 1782], [4417, 3486, 2473, 1897], [4686, 3693, 2670, 2022], [4965, 3909, 2805, 2157], [5253, 4134, 2949, 2301], [5529, 4343, 3081, 2361], [5836, 4588, 3244, 2524], [6153, 4775, 3417, 2625], [6479, 5039, 3599, 2735], [6743, 5313, 3791, 2927], [7089, 5596, 3993, 3057] ] const EXPECTED_ALPHANUMERIC_CAPACITY = [ [25, 20, 16, 10], [47, 38, 29, 20], [77, 61, 47, 35], [114, 90, 67, 50], [154, 122, 87, 64], [195, 154, 108, 84], [224, 178, 125, 93], [279, 221, 157, 122], [335, 262, 189, 143], [395, 311, 221, 174], [468, 366, 259, 200], [535, 419, 296, 227], [619, 483, 352, 259], [667, 528, 376, 283], [758, 600, 426, 321], [854, 656, 470, 365], [938, 734, 531, 408], [1046, 816, 574, 452], [1153, 909, 644, 493], [1249, 970, 702, 557], [1352, 1035, 742, 587], [1460, 1134, 823, 640], [1588, 1248, 890, 672], [1704, 1326, 963, 744], [1853, 1451, 1041, 779], [1990, 1542, 1094, 864], [2132, 1637, 1172, 910], [2223, 1732, 1263, 958], [2369, 1839, 1322, 1016], [2520, 1994, 1429, 1080], [2677, 2113, 1499, 1150], [2840, 2238, 1618, 1226], [3009, 2369, 1700, 1307], [3183, 2506, 1787, 1394], [3351, 2632, 1867, 1431], [3537, 2780, 1966, 1530], [3729, 2894, 2071, 1591], [3927, 3054, 2181, 1658], [4087, 3220, 2298, 1774], [4296, 3391, 2420, 1852] ] const EXPECTED_KANJI_CAPACITY = [ [10, 8, 7, 4], [20, 16, 12, 8], [32, 26, 20, 15], [48, 38, 28, 21], [65, 52, 37, 27], [82, 65, 45, 36], [95, 75, 53, 39], [118, 93, 66, 52], [141, 111, 80, 60], [167, 131, 93, 74], [198, 155, 109, 85], [226, 177, 125, 96], [262, 204, 149, 109], [282, 223, 159, 120], [320, 254, 180, 136], [361, 277, 198, 154], [397, 310, 224, 173], [442, 345, 243, 191], [488, 384, 272, 208], [528, 410, 297, 235], [572, 438, 314, 248], [618, 480, 348, 270], [672, 528, 376, 284], [721, 561, 407, 315], [784, 614, 440, 330], [842, 652, 462, 365], [902, 692, 496, 385], [940, 732, 534, 405], [1002, 778, 559, 430], [1066, 843, 604, 457], [1132, 894, 634, 486], [1201, 947, 684, 518], [1273, 1002, 719, 553], [1347, 1060, 756, 590], [1417, 1113, 790, 605], [1496, 1176, 832, 647], [1577, 1224, 876, 673], [1661, 1292, 923, 701], [1729, 1362, 972, 750], [1817, 1435, 1024, 784] ] const EXPECTED_BYTE_CAPACITY = [ [17, 14, 11, 7], [32, 26, 20, 14], [53, 42, 32, 24], [78, 62, 46, 34], [106, 84, 60, 44], [134, 106, 74, 58], [154, 122, 86, 64], [192, 152, 108, 84], [230, 180, 130, 98], [271, 213, 151, 119], [321, 251, 177, 137], [367, 287, 203, 155], [425, 331, 241, 177], [458, 362, 258, 194], [520, 412, 292, 220], [586, 450, 322, 250], [644, 504, 364, 280], [718, 560, 394, 310], [792, 624, 442, 338], [858, 666, 482, 382], [929, 711, 509, 403], [1003, 779, 565, 439], [1091, 857, 611, 461], [1171, 911, 661, 511], [1273, 997, 715, 535], [1367, 1059, 751, 593], [1465, 1125, 805, 625], [1528, 1190, 868, 658], [1628, 1264, 908, 698], [1732, 1370, 982, 742], [1840, 1452, 1030, 790], [1952, 1538, 1112, 842], [2068, 1628, 1168, 898], [2188, 1722, 1228, 958], [2303, 1809, 1283, 983], [2431, 1911, 1351, 1051], [2563, 1989, 1423, 1093], [2699, 2099, 1499, 1139], [2809, 2213, 1579, 1219], [2953, 2331, 1663, 1273] ] const EXPECTED_VERSION_BITS = [ 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69 ] test('Version validity', function (t) { t.notOk(VersionCheck.isValid(), 'Should return false if no input') t.notOk(VersionCheck.isValid(''), 'Should return false if version is not a number') t.notOk(VersionCheck.isValid(0), 'Should return false if version is not in range') t.notOk(VersionCheck.isValid(41), 'Should return false if version is not in range') t.end() }) test('Version from value', function (t) { t.equal(Version.from(5), 5, 'Should return correct version from a number') t.equal(Version.from('5'), 5, 'Should return correct version from a string') t.equal(Version.from(0, 1), 1, 'Should return default value if version is invalid') t.equal(Version.from(null, 1), 1, 'Should return default value if version is undefined') t.end() }) test('Version capacity', function (t) { t.throws(function () { Version.getCapacity() }, 'Should throw if version is undefined') t.throws(function () { Version.getCapacity('') }, 'Should throw if version is not a number') t.throws(function () { Version.getCapacity(0) }, 'Should throw if version is not in range') t.throws(function () { Version.getCapacity(41) }, 'Should throw if version is not in range') for (let l = 0; l < EC_LEVELS.length; l++) { for (let i = 1; i <= 40; i++) { t.equal(Version.getCapacity(i, EC_LEVELS[l], Mode.NUMERIC), EXPECTED_NUMERIC_CAPACITY[i - 1][l], 'Should return correct numeric mode capacity') t.equal(Version.getCapacity(i, EC_LEVELS[l], Mode.ALPHANUMERIC), EXPECTED_ALPHANUMERIC_CAPACITY[i - 1][l], 'Should return correct alphanumeric mode capacity') t.equal(Version.getCapacity(i, EC_LEVELS[l], Mode.KANJI), EXPECTED_KANJI_CAPACITY[i - 1][l], 'Should return correct kanji mode capacity') t.equal(Version.getCapacity(i, EC_LEVELS[l], Mode.BYTE), EXPECTED_BYTE_CAPACITY[i - 1][l], 'Should return correct byte mode capacity') t.equal(Version.getCapacity(i, EC_LEVELS[l]), EXPECTED_BYTE_CAPACITY[i - 1][l], 'Should return correct byte mode capacity') } } t.end() }) test('Version best match', function (t) { function testBestVersionForCapacity (expectedCapacity, DataCtor) { for (let v = 0; v < 40; v++) { for (let l = 0; l < EC_LEVELS.length; l++) { const capacity = expectedCapacity[v][l] const data = new DataCtor(new Array(capacity + 1).join('-')) t.equal(Version.getBestVersionForData(data, EC_LEVELS[l]), v + 1, 'Should return best version') t.equal(Version.getBestVersionForData([data], EC_LEVELS[l]), v + 1, 'Should return best version') if (l === 1) { t.equal(Version.getBestVersionForData(data, null), v + 1, 'Should return best version for ECLevel.M if error level is undefined') t.equal(Version.getBestVersionForData([data], null), v + 1, 'Should return best version for ECLevel.M if error level is undefined') } } } for (let i = 0; i < EC_LEVELS.length; i++) { const exceededCapacity = expectedCapacity[39][i] + 1 const tooBigData = new DataCtor(new Array(exceededCapacity + 1).join('-')) const tooBigDataArray = [ new DataCtor(new Array(Math.floor(exceededCapacity / 2)).join('-')), new DataCtor(new Array(Math.floor(exceededCapacity / 2) + 1).join('-')) ] t.notOk(Version.getBestVersionForData(tooBigData, EC_LEVELS[i]), 'Should return undefined if data is too big') t.notOk(Version.getBestVersionForData([tooBigData], EC_LEVELS[i]), 'Should return undefined if data is too big') t.notOk(Version.getBestVersionForData(tooBigDataArray, EC_LEVELS[i]), 'Should return undefined if data is too big') } } testBestVersionForCapacity(EXPECTED_NUMERIC_CAPACITY, NumericData) testBestVersionForCapacity(EXPECTED_ALPHANUMERIC_CAPACITY, AlphanumericData) testBestVersionForCapacity(EXPECTED_KANJI_CAPACITY, KanjiData) testBestVersionForCapacity(EXPECTED_BYTE_CAPACITY, ByteData) t.ok(Version.getBestVersionForData([new ByteData('abc'), new NumericData('1234')]), 'Should return a version number if input array is valid') t.equal(Version.getBestVersionForData([]), 1, 'Should return 1 if array is empty') t.end() }) test('Version encoded info', function (t) { let v for (v = 0; v < 7; v++) { t.throws(function () { Version.getEncodedBits(v) }, 'Should throw if version is invalid or less than 7') } for (v = 7; v <= 40; v++) { const bch = Version.getEncodedBits(v) t.equal(bch, EXPECTED_VERSION_BITS[v - 7], 'Should return correct bits') } t.end() }) soldair-node-qrcode-5d87b5f/test/unit/helper/000077500000000000000000000000001465424452300212215ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/test/unit/helper/sjis.test.js000066400000000000000000000014451465424452300235110ustar00rootroot00000000000000const test = require('tap').test const toSJIS = require('helper/to-sjis') test('SJIS from char', function (t) { t.notOk(toSJIS(''), 'Should return undefined if character is invalid') t.notOk(toSJIS('A'), 'Should return undefined if character is not a kanji') t.equal(toSJIS('襦'), 0xe640, 'Should return correct SJIS value') t.equal(toSJIS('ï¿¢'), 0x81ca, 'Should return correct SJIS value') t.equal(toSJIS('≧'), 0x8186, 'Should return correct SJIS value') t.equal(toSJIS('⊥'), 0x81db, 'Should return correct SJIS value') t.equal(toSJIS('æ„›'), 0x88a4, 'Should return correct SJIS value') t.equal(toSJIS('è¡£'), 0x88df, 'Should return correct SJIS value') t.equal(toSJIS('è”­'), 0x88fc, 'Should return correct SJIS value') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/renderer/000077500000000000000000000000001465424452300215505ustar00rootroot00000000000000soldair-node-qrcode-5d87b5f/test/unit/renderer/canvas.test.js000066400000000000000000000074141465424452300243450ustar00rootroot00000000000000const test = require('tap').test const { Canvas, createCanvas } = require('canvas') const QRCode = require('core/qrcode') const CanvasRenderer = require('renderer/canvas') test('CanvasRenderer interface', function (t) { t.type(CanvasRenderer.render, 'function', 'Should have render function') t.type(CanvasRenderer.renderToDataURL, 'function', 'Should have renderToDataURL function') t.end() }) test('CanvasRenderer render', function (t) { // Mock document object global.document = { createElement: function (el) { if (el === 'canvas') { return createCanvas(200, 200) } } } const sampleQrData = QRCode.create('sample text', { version: 2 }) let canvasEl t.notThrow(function () { canvasEl = CanvasRenderer.render(sampleQrData) }, 'Should not throw if canvas is not provided') t.ok(canvasEl instanceof Canvas, 'Should return a new canvas object') t.notThrow(function () { canvasEl = CanvasRenderer.render(sampleQrData, { margin: 10, scale: 1 }) }, 'Should not throw with options param') // modules: 25, margins: 10 * 2, scale: 1 t.equal(canvasEl.width, 25 + 10 * 2, 'Should have correct size') t.equal(canvasEl.width, canvasEl.height, 'Should be a square image') global.document = undefined t.throw(function () { canvasEl = CanvasRenderer.render(sampleQrData) }, 'Should throw if canvas cannot be created') t.end() }) test('CanvasRenderer render to provided canvas', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) const canvasEl = createCanvas(200, 200) t.notThrow(function () { CanvasRenderer.render(sampleQrData, canvasEl) }, 'Should not throw with only qrData and canvas param') t.notThrow(function () { CanvasRenderer.render(sampleQrData, canvasEl, { margin: 10, scale: 1 }) }, 'Should not throw with options param') // modules: 25, margins: 10 * 2, scale: 1 t.equal(canvasEl.width, 25 + 10 * 2, 'Should have correct size') t.equal(canvasEl.width, canvasEl.height, 'Should be a square image') t.end() }) test('CanvasRenderer renderToDataURL', function (t) { // Mock document object global.document = { createElement: function (el) { if (el === 'canvas') { return createCanvas(200, 200) } } } const sampleQrData = QRCode.create('sample text', { version: 2 }) let url t.notThrow(function () { url = CanvasRenderer.renderToDataURL(sampleQrData) }, 'Should not throw if canvas is not provided') t.notThrow(function () { url = CanvasRenderer.renderToDataURL(sampleQrData, { margin: 10, scale: 1, type: 'image/png' }) }, 'Should not throw with options param') t.type(url, 'string', 'Should return a string') t.equal(url.split(',')[0], 'data:image/png;base64', 'Should have correct header') const b64png = url.split(',')[1] t.equal(b64png.length % 4, 0, 'Should have a correct length') global.document = undefined t.end() }) test('CanvasRenderer renderToDataURL to provided canvas', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) const canvasEl = createCanvas(200, 200) let url t.notThrow(function () { url = CanvasRenderer.renderToDataURL(sampleQrData, canvasEl) }, 'Should not throw with only qrData and canvas param') t.notThrow(function () { url = CanvasRenderer.renderToDataURL(sampleQrData, canvasEl, { margin: 10, scale: 1, type: 'image/png' }) }, 'Should not throw with options param') t.type(url, 'string', 'Should return a string') t.equal(url.split(',')[0], 'data:image/png;base64', 'Should have correct header') const b64png = url.split(',')[1] t.equal(b64png.length % 4, 0, 'Should have a correct length') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/renderer/png.test.js000066400000000000000000000073231465424452300236550ustar00rootroot00000000000000const test = require('tap').test const sinon = require('sinon') const fs = require('fs') const QRCode = require('core/qrcode') const PngRenderer = require('renderer/png') const PNG = require('pngjs').PNG const StreamMock = require('../../mocks/writable-stream') test('PNG renderer interface', function (t) { t.type(PngRenderer.render, 'function', 'Should have render function') t.type(PngRenderer.renderToDataURL, 'function', 'Should have renderToDataURL function') t.type(PngRenderer.renderToFile, 'function', 'Should have renderToFile function') t.type(PngRenderer.renderToFileStream, 'function', 'Should have renderToFileStream function') t.end() }) test('PNG render', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) let png t.notThrow(function () { png = PngRenderer.render(sampleQrData) }, 'Should not throw with only qrData param') t.ok(png instanceof PNG, 'Should return an instance of PNG') t.equal(png.width, png.height, 'Should be a square image') // modules: 25, margins: 4 * 2, scale: 4 t.equal(png.width, (25 + 4 * 2) * 4, 'Should have correct size') t.notThrow(function () { png = PngRenderer.render(sampleQrData, { margin: 10, scale: 1 }) }, 'Should not throw with options param') t.equal(png.width, png.height, 'Should be a square image') // modules: 25, margins: 10 * 2, scale: 1 t.equal(png.width, 25 + 10 * 2, 'Should have correct size') t.end() }) test('PNG renderToDataURL', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) t.plan(6) PngRenderer.renderToDataURL(sampleQrData, function (err, url) { t.ok(!err, 'Should not generate errors with only qrData param') t.type(url, 'string', 'Should return a string') }) PngRenderer.renderToDataURL(sampleQrData, { margin: 10, scale: 1 }, function (err, url) { t.ok(!err, 'Should not generate errors with options param') t.type(url, 'string', 'Should return a string') t.equal(url.split(',')[0], 'data:image/png;base64', 'Should have correct header') const b64png = url.split(',')[1] t.equal(b64png.length % 4, 0, 'Should have a correct length') } ) }) test('PNG renderToFile', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) const fileName = 'qrimage.png' let fsStub = sinon.stub(fs, 'createWriteStream') fsStub.returns(new StreamMock()) t.plan(5) PngRenderer.renderToFile(fileName, sampleQrData, function (err) { t.ok(!err, 'Should not generate errors with only qrData param') t.equal(fsStub.getCall(0).args[0], fileName, 'Should save file with correct file name') }) PngRenderer.renderToFile(fileName, sampleQrData, { margin: 10, scale: 1 }, function (err) { t.ok(!err, 'Should not generate errors with options param') t.equal(fsStub.getCall(0).args[0], fileName, 'Should save file with correct file name') }) fsStub.restore() fsStub = sinon.stub(fs, 'createWriteStream') fsStub.returns(new StreamMock().forceErrorOnWrite()) PngRenderer.renderToFile(fileName, sampleQrData, function (err) { t.ok(err, 'Should fail if error occurs during save') }) fsStub.restore() }) test('PNG renderToFileStream', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) t.notThrow(function () { PngRenderer.renderToFileStream(new StreamMock(), sampleQrData) }, 'Should not throw with only qrData param') t.notThrow(function () { PngRenderer.renderToFileStream(new StreamMock(), sampleQrData, { margin: 10, scale: 1 }) }, 'Should not throw with options param') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/renderer/svg.test.js000066400000000000000000000102661465424452300236700ustar00rootroot00000000000000const test = require('tap').test const sinon = require('sinon') const fs = require('fs') const htmlparser = require('htmlparser2') const QRCode = require('core/qrcode') const SvgRenderer = require('renderer/svg') function getExpectedViewbox (size, margin) { const expectedQrCodeSize = size + margin * 2 return '0 0 ' + expectedQrCodeSize + ' ' + expectedQrCodeSize } function testSvgFragment (t, svgFragment, expectedTags) { return new Promise(function (resolve, reject) { const parser = new htmlparser.Parser({ onopentag: function (name, attribs) { const tag = expectedTags.shift() t.equal(tag.name, name, 'Should have a ' + tag.name + ' tag') tag.attribs.forEach(function (attr) { t.equal(attribs[attr.name], attr.value.toString(), 'Should have attrib ' + attr.name + ' with value ' + attr.value) }) }, onend: function () { resolve() }, onerror: function (e) { reject(e) } }, { decodeEntities: true }) parser.write(svgFragment) parser.end() }) } function buildTest (t, data, opts, expectedTags) { const svg = SvgRenderer.render(data, opts) return testSvgFragment(t, svg, expectedTags.slice()) } test('svgrender interface', function (t) { t.type(SvgRenderer.render, 'function', 'Should have render function') t.type(SvgRenderer.renderToFile, 'function', 'Should have renderToFile function') t.end() }) test('Svg render', function (t) { const tests = [] const data = QRCode.create('sample text', { version: 2 }) const size = data.modules.size tests.push(buildTest(t, data, { scale: 4, margin: 4, color: { light: '#ffffff80' } }, [ { name: 'svg', attribs: [ { name: 'viewbox', value: getExpectedViewbox(size, 4) } ] }, { name: 'path', attribs: [ { name: 'fill', value: '#ffffff' }, { name: 'fill-opacity', value: '.50' } ] }, { name: 'path', attribs: [ { name: 'stroke', value: '#000000' } ] } ])) tests.push(buildTest(t, data, { scale: 0, margin: 8, color: { light: '#0000', dark: '#00000080' } }, [ { name: 'svg', attribs: [ { name: 'viewbox', value: getExpectedViewbox(size, 8) } ] }, { name: 'path', attribs: [ { name: 'stroke', value: '#000000' }, { name: 'stroke-opacity', value: '.50' } ] } ])) tests.push(buildTest(t, data, {}, [ { name: 'svg', attribs: [ { name: 'viewbox', value: getExpectedViewbox(size, 4) } ] }, { name: 'path', attribs: [{ name: 'fill', value: '#ffffff' }] }, { name: 'path', attribs: [{ name: 'stroke', value: '#000000' }] } ])) tests.push(buildTest(t, data, { width: 250 }, [ { name: 'svg', attribs: [ { name: 'width', value: '250' }, { name: 'height', value: '250' }, { name: 'viewbox', value: getExpectedViewbox(size, 4) } ] }, { name: 'path', attribs: [{ name: 'fill', value: '#ffffff' }] }, { name: 'path', attribs: [{ name: 'stroke', value: '#000000' }] } ])) Promise.all(tests).then(function () { t.end() }) }) test('Svg renderToFile', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) const fileName = 'qrimage.svg' let fsStub = sinon.stub(fs, 'writeFile').callsArg(2) t.plan(5) SvgRenderer.renderToFile(fileName, sampleQrData, function (err) { t.ok(!err, 'Should not generate errors with only qrData param') t.equal(fsStub.getCall(0).args[0], fileName, 'Should save file with correct file name') }) SvgRenderer.renderToFile(fileName, sampleQrData, { margin: 10, scale: 1 }, function (err) { t.ok(!err, 'Should not generate errors with options param') t.equal(fsStub.getCall(0).args[0], fileName, 'Should save file with correct file name') }) fsStub.restore() fsStub = sinon.stub(fs, 'writeFile').callsArgWith(2, new Error()) SvgRenderer.renderToFile(fileName, sampleQrData, function (err) { t.ok(err, 'Should fail if error occurs during save') }) fsStub.restore() }) soldair-node-qrcode-5d87b5f/test/unit/renderer/terminal.test.js000066400000000000000000000040651465424452300247040ustar00rootroot00000000000000const test = require('tap').test const QRCode = require('core/qrcode') const TerminalRenderer = require('renderer/terminal') test('TerminalRenderer interface', function (t) { t.type(TerminalRenderer.render, 'function', 'Should have render function') t.end() }) test('TerminalRenderer render big', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) let str t.notThrow(function () { str = TerminalRenderer.render(sampleQrData) }, 'Should not throw with only qrData param') t.notThrow(function () { str = TerminalRenderer.render(sampleQrData, { margin: 10, scale: 1 }) }, 'Should not throw with options param') t.type(str, 'string', 'Should return a string') t.notThrow(function () { str = TerminalRenderer.render(sampleQrData, { inverse: true }) }, 'Should not throw with inverse options') t.type(str, 'string', 'Should return a string if inverse option is set') t.end() }) test('TerminalRenderer render small', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) let str let calledCallback = false const callback = function () { calledCallback = true } t.notThrow(function () { str = TerminalRenderer.render(sampleQrData) }, 'Should not throw with only qrData param') t.notThrow(function () { str = TerminalRenderer.render(sampleQrData, { margin: 10, scale: 1, small: true }) }, 'Should not throw with options param and without callback') t.notThrow(function () { str = TerminalRenderer.render(sampleQrData, { margin: 10, scale: 1, small: true }, callback) }, 'Should not throw with options param and callback') t.type(str, 'string', 'Should return a string') t.equal(calledCallback, true, 'string', 'Should call a callback') t.notThrow(function () { str = TerminalRenderer.render(sampleQrData, { small: true, inverse: true }) }, 'Should not throw with inverse options') t.type(str, 'string', 'Should return a string if inverse option is set') t.end() }) soldair-node-qrcode-5d87b5f/test/unit/renderer/utf8.test.js000066400000000000000000000033461465424452300237600ustar00rootroot00000000000000const test = require('tap').test const sinon = require('sinon') const fs = require('fs') const QRCode = require('core/qrcode') const Utf8Renderer = require('renderer/utf8') test('Utf8Renderer interface', function (t) { t.type(Utf8Renderer.render, 'function', 'Should have render function') t.end() }) test('Utf8Renderer render', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) let str t.notThrow(function () { str = Utf8Renderer.render(sampleQrData) }, 'Should not throw with only qrData param') t.notThrow(function () { str = Utf8Renderer.render(sampleQrData, { margin: 10, scale: 1 }) }, 'Should not throw with options param') t.type(str, 'string', 'Should return a string') t.end() }) test('Utf8 renderToFile', function (t) { const sampleQrData = QRCode.create('sample text', { version: 2 }) const fileName = 'qrimage.txt' let fsStub = sinon.stub(fs, 'writeFile').callsArg(2) t.plan(5) Utf8Renderer.renderToFile(fileName, sampleQrData, function (err) { t.ok(!err, 'Should not generate errors with only qrData param') t.equal(fsStub.getCall(0).args[0], fileName, 'Should save file with correct file name') }) Utf8Renderer.renderToFile(fileName, sampleQrData, { margin: 10, scale: 1 }, function (err) { t.ok(!err, 'Should not generate errors with options param') t.equal(fsStub.getCall(0).args[0], fileName, 'Should save file with correct file name') }) fsStub.restore() fsStub = sinon.stub(fs, 'writeFile').callsArgWith(2, new Error()) Utf8Renderer.renderToFile(fileName, sampleQrData, function (err) { t.ok(err, 'Should fail if error occurs during save') }) fsStub.restore() }) soldair-node-qrcode-5d87b5f/test/unit/renderer/utils.test.js000066400000000000000000000075341465424452300242350ustar00rootroot00000000000000const test = require('tap').test const Utils = require('renderer/utils') test('Utils getOptions', function (t) { const defaultOptions = { width: undefined, scale: 4, margin: 4, color: { dark: { r: 0, g: 0, b: 0, a: 255, hex: '#000000' }, light: { r: 255, g: 255, b: 255, a: 255, hex: '#ffffff' } }, type: undefined, rendererOpts: {} } t.ok(Utils.getOptions, 'getOptions should be defined') t.deepEqual(Utils.getOptions(), defaultOptions, 'Should return default options if called without param') t.equal(Utils.getOptions({ scale: 8 }).scale, 8, 'Should return correct scale value') t.equal(Utils.getOptions({ width: 300 }).scale, 4, 'Should reset scale value to default if width is set') t.equal(Utils.getOptions({ margin: null }).margin, 4, 'Should return default margin if specified value is null') t.equal(Utils.getOptions({ margin: -1 }).margin, 4, 'Should return default margin if specified value is < 0') t.equal(Utils.getOptions({ margin: 20 }).margin, 20, 'Should return correct margin value') t.deepEqual(Utils.getOptions({ color: { dark: '#fff', light: '#000000' } }).color, { dark: { r: 255, g: 255, b: 255, a: 255, hex: '#ffffff' }, light: { r: 0, g: 0, b: 0, a: 255, hex: '#000000' } }, 'Should return correct colors value from strings') t.deepEqual(Utils.getOptions({ color: { dark: 111, light: 999 } }).color, { dark: { r: 17, g: 17, b: 17, a: 255, hex: '#111111' }, light: { r: 153, g: 153, b: 153, a: 255, hex: '#999999' } }, 'Should return correct colors value from numbers') t.throw(function () { Utils.getOptions({ color: { dark: true } }) }, 'Should throw if color is not a string') t.throw(function () { Utils.getOptions({ color: { dark: '#aa' } }) }, 'Should throw if color is not in a valid hex format') t.end() }) test('Utils getScale', function (t) { const symbolSize = 21 t.equal(Utils.getScale(symbolSize, { scale: 5 }), 5, 'Should return correct scale value') t.equal(Utils.getScale(symbolSize, { width: 50, margin: 2 }), 2, 'Should calculate correct scale from width and margin') t.equal(Utils.getScale(symbolSize, { width: 21, margin: 2, scale: 4 }), 4, 'Should return default scale if width is too small to contain the symbol') t.end() }) test('Utils getImageWidth', function (t) { const symbolSize = 21 t.equal(Utils.getImageWidth(symbolSize, { scale: 5, margin: 0 }), 105, 'Should return correct width value') t.equal(Utils.getImageWidth(symbolSize, { width: 250, margin: 2 }), 250, 'Should return specified width value') t.equal(Utils.getImageWidth(symbolSize, { width: 10, margin: 4, scale: 4 }), 116, 'Should ignore width option if too small to contain the symbol') t.end() }) test('Utils qrToImageData', function (t) { t.ok(Utils.qrToImageData, 'qrToImageData should be defined') const sampleQrData = { modules: { data: [ 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1 ], size: 4 } } const margin = 4 const scale = 2 const width = 100 const color = { dark: { r: 255, g: 255, b: 255, a: 255 }, light: { r: 0, g: 0, b: 0, a: 255 } } const opts = { margin: margin, scale: scale, color: color } let imageData = [] const expectedImageSize = (sampleQrData.modules.size + margin * 2) * scale let expectedImageDataLength = Math.pow(expectedImageSize, 2) * 4 Utils.qrToImageData(imageData, sampleQrData, opts) t.equal(imageData.length, expectedImageDataLength, 'Should return correct imageData length') imageData = [] opts.width = width expectedImageDataLength = Math.pow(width, 2) * 4 Utils.qrToImageData(imageData, sampleQrData, opts) t.equal(imageData.length, expectedImageDataLength, 'Should return correct imageData length') t.end() })