motion
Version:
motion - moving development forward
139 lines (138 loc) • 21.7 kB
JSON
{
"_args": [
[
"micromatch@https://registry.npmjs.org/micromatch/-/micromatch-2.3.7.tgz",
"/Users/nw/flint/packages/flint"
]
],
"_from": "micromatch@>=2.1.5 <3.0.0",
"_id": "micromatch@2.3.7",
"_inCache": true,
"_location": "/micromatch",
"_phantomChildren": {},
"_requested": {
"name": "micromatch",
"raw": "micromatch@https://registry.npmjs.org/micromatch/-/micromatch-2.3.7.tgz",
"rawSpec": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.7.tgz",
"scope": null,
"spec": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.7.tgz",
"type": "remote"
},
"_requiredBy": [
"/anymatch"
],
"_resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.7.tgz",
"_shasum": "2f2e85ef46140dbea6cb55e739b6b11b30eaa509",
"_shrinkwrap": null,
"_spec": "micromatch@https://registry.npmjs.org/micromatch/-/micromatch-2.3.7.tgz",
"_where": "/Users/nw/flint/packages/flint",
"author": {
"name": "Jon Schlinkert",
"url": "https://github.com/jonschlinkert"
},
"bugs": {
"url": "https://github.com/jonschlinkert/micromatch/issues"
},
"dependencies": {
"arr-diff": "^2.0.0",
"array-unique": "^0.2.1",
"braces": "^1.8.2",
"expand-brackets": "^0.1.4",
"extglob": "^0.3.1",
"filename-regex": "^2.0.0",
"is-extglob": "^1.0.0",
"is-glob": "^2.0.1",
"kind-of": "^3.0.2",
"normalize-path": "^2.0.1",
"object.omit": "^2.0.0",
"parse-glob": "^3.0.4",
"regex-cache": "^0.4.2"
},
"description": "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. Just use `micromatch.isMatch()` instead of `minimatch()`, or use `micromatch()` instead of `multimatch()`.",
"devDependencies": {
"benchmarked": "^0.1.4",
"chalk": "^1.1.1",
"gulp": "^3.9.0",
"gulp-eslint": "^1.1.1",
"gulp-istanbul": "^0.10.1",
"gulp-mocha": "^2.1.3",
"minimatch": "^3.0.0",
"minimist": "^1.2.0",
"mocha": "*",
"multimatch": "^2.0.0",
"should": "*",
"write": "^0.2.1"
},
"engines": {
"node": ">=0.10.0"
},
"files": [
"index.js",
"lib/"
],
"homepage": "https://github.com/jonschlinkert/micromatch",
"keywords": [
"bash",
"expand",
"expansion",
"expression",
"file",
"files",
"filter",
"find",
"glob",
"globbing",
"globs",
"globstar",
"match",
"matcher",
"matches",
"matching",
"minimatch",
"multimatch",
"path",
"pattern",
"patterns",
"regex",
"regexp",
"regular",
"shell",
"wildcard"
],
"license": "MIT",
"main": "index.js",
"name": "micromatch",
"optionalDependencies": {},
"readme": "# micromatch [](http://badge.fury.io/js/micromatch) [](https://travis-ci.org/jonschlinkert/micromatch)\n\n> Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. Just use `micromatch.isMatch()` instead of `minimatch()`, or use `micromatch()` instead of `multimatch()`.\n\n## Install\n\nInstall with [npm](https://www.npmjs.com/)\n\n```sh\n$ npm i micromatch --save\n```\n\n## Table of contents\n\n<!-- toc -->\n\n* [Features](#features)\n* [Usage](#usage)\n* [Switch from minimatch](#switch-from-minimatch)\n* [Methods](#methods)\n - [.isMatch](#ismatch)\n - [.contains](#contains)\n - [.matcher](#matcher)\n - [.filter](#filter)\n - [.any](#any)\n - [.expand](#expand)\n - [.makeRe](#makere)\n* [Options](#options)\n - [options.unixify](#optionsunixify)\n - [options.dot](#optionsdot)\n - [options.unescape](#optionsunescape)\n - [options.nodupes](#optionsnodupes)\n - [options.matchBase](#optionsmatchbase)\n - [options.nobraces](#optionsnobraces)\n - [options.nobrackets](#optionsnobrackets)\n - [options.noextglob](#optionsnoextglob)\n - [options.nocase](#optionsnocase)\n - [options.nonull](#optionsnonull)\n - [options.cache](#optionscache)\n* [Other features](#other-features)\n - [Extended globbing](#extended-globbing)\n + [extglobs](#extglobs)\n + [brace expansion](#brace-expansion)\n + [regex character classes](#regex-character-classes)\n + [regex groups](#regex-groups)\n + [POSIX bracket expressions](#posix-bracket-expressions)\n* [Notes](#notes)\n* [Benchmarks](#benchmarks)\n* [Run tests](#run-tests)\n* [Contributing](#contributing)\n* [Related](#related)\n* [Author](#author)\n* [License](#license)\n\n_(Table of contents generated by [verb](https://github.com/verbose/verb))_\n\n<!-- tocstop -->\n\n## Features\n\nMicromatch is [10-55x faster](#benchmarks) than [minimatch](https://github.com/isaacs/minimatch), resulting from a combination of caching, tokenization, parsing, runtime compilation and regex optimization strategies.\n\n* [Drop-in replacement](#switch-from-minimatch) for [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch)\n* Built-in support for multiple glob patterns, like `['foo/*.js', '!bar.js']`\n* Better support for the Bash 4.3 specification, and less buggy\n* Extensive [unit tests](./test) (approx. 1,300 tests). Minimatch fails many of the tests.\n\n**Mainstream glob features:**\n\n* [Brace Expansion](https://github.com/jonschlinkert/braces) (`foo/bar-{1..5}.md`, `one/{two,three}/four.md`)\n* Typical glob patterns, like `**/*`, `a/b/*.js`, or `['foo/*.js', '!bar.js']`\n\n**Extended globbing features:**\n\n* Logical `OR` (`foo/bar/(abc|xyz).js`)\n* Regex character classes (`foo/bar/baz-[1-5].js`)\n* POSIX [bracket expressions](https://github.com/jonschlinkert/expand-brackets) (`**/[[:alpha:][:digit:]]/`)\n* [extglobs](https://github.com/jonschlinkert/extglob) (`**/+(x|y)`, `!(a|b)`, etc)\n\nYou can combine these to create whatever matching patterns you need.\n\n## Usage\n\n```js\nvar mm = require('micromatch');\nmm(array, patterns);\n```\n\n**Examples**\n\n```js\nmm(['a.js', 'b.md', 'c.txt'], '*.{js,txt}');\n//=> ['a.js', 'c.txt']\n```\n\n**Multiple patterns**\n\nMultiple patterns can also be passed:\n\n```js\nmm(['a.md', 'b.js', 'c.txt', 'd.json'], ['*.md', '*.txt']);\n//=> ['a.md', 'c.txt']\n```\n\n**Negation patterns:**\n\nBehavior;\n\n* when the pattern is a string, [minimatch](https://github.com/isaacs/minimatch) behavior is used, so patterns are **inclusive by default**.\n* when an array of patterns is passed, [multimatch](https://github.com/sindresorhus/multimatch) behavior is used, so patterns are **exclusive by default**\n\n```js\nmm(['a.js', 'b.md', 'c.txt'], '!*.{js,txt}');\n//=> ['b.md']\n\nmm(['a.md', 'b.js', 'c.txt', 'd.json'], ['*.*', '!*.{js,txt}']);\n//=> ['a.md', 'd.json']\n```\n\n## Switch from minimatch\n\n> Use `micromatch.isMatch()` instead of `minimatch()`\n\n**Minimatch**\n\nThe main `minimatch()` function returns true/false for a single file path and pattern:\n\n```js\nvar minimatch = require('minimatch');\nminimatch('foo.js', '*.js');\n//=> 'true'\n```\n\n**Micromatch**\n\nWith micromatch, `.isMatch()` to get the same result:\n\n```js\nvar mm = require('micromatch');\nmm.isMatch('foo.js', '*.js');\n//=> 'true'\n```\n\nThis implementation difference is necessary since the main `micromatch()` method supports matching on multiple globs, with behavior similar to [multimatch](https://github.com/sindresorhus/multimatch).\n\n## Methods\n\n```js\nvar mm = require('micromatch');\n```\n\n### .isMatch\n\n```js\nmm.isMatch(filepath, globPattern);\n```\n\nReturns true if a file path matches the given glob pattern.\n\n**Example**\n\n```js\nmm.isMatch('.verb.md', '*.md');\n//=> false\n\nmm.isMatch('.verb.md', '*.md', {dot: true});\n//=> true\n```\n\n### .contains\n\nReturns true if any part of a file path matches the given glob pattern. Think of this is \"has path\" versus \"is path\".\n\n**Example**\n\n`.isMatch()` would return false for both of the following:\n\n```js\nmm.contains('a/b/c', 'a/b');\n//=> true\n\nmm.contains('a/b/c', 'a/*');\n//=> true\n```\n\n### .matcher\n\nReturns a function for matching using the supplied pattern. e.g. create your own \"matcher\". The advantage of this method is that the pattern can be compiled outside of a loop.\n\n**Pattern**\n\nCan be any of the following:\n\n* `glob/string`\n* `regex`\n* `function`\n\n**Example**\n\n```js\nvar isMatch = mm.matcher('*.md');\nvar files = [];\n\n['a.md', 'b.txt', 'c.md'].forEach(function(fp) {\n if (isMatch(fp)) {\n files.push(fp);\n }\n});\n```\n\n### .filter\n\nReturns a function that can be passed to `Array#filter()`.\n\n**Params**\n\n* `patterns` **{String|Array}**:\n\n**Examples**\n\nSingle glob:\n\n```js\nvar fn = mm.filter('*.md');\n['a.js', 'b.txt', 'c.md'].filter(fn);\n//=> ['c.md']\n\nvar fn = mm.filter('[a-c]');\n['a', 'b', 'c', 'd', 'e'].filter(fn);\n//=> ['a', 'b', 'c']\n```\n\nArray of glob patterns:\n\n```js\nvar arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];\n\nvar fn = mm.filter(['{1..10}', '![7-9]', '!{3..4}']);\narr.filter(fn);\n//=> [1, 2, 5, 6, 10]\n```\n\n_(Internally this function generates the matching function by using the [matcher](#matcher) method. You can use the [matcher](#matcher) method directly to create your own filter function)_\n\n### .any\n\nReturns true if a file path matches any of the given patterns.\n\n```js\nmm.any(filepath, patterns, options);\n```\n\n**Params**\n\n* filepath `{String}`: The file path to test.\n* patterns `{String|Array}`: One or more glob patterns\n* options: `{Object}`: options to pass to the `.matcher()` method.\n\n**Example**\n\n```js\nmm.any('abc', ['!*z']);\n//=> true\nmm.any('abc', ['a*', 'z*']);\n//=> true\nmm.any('abc', 'a*');\n//=> true\nmm.any('abc', ['z*']);\n//=> false\n```\n\n### .expand\n\nReturns an object with a regex-compatible string and tokens.\n\n```js\nmm.expand('*.js');\n\n// when `track` is enabled (for debugging), the `history` array is used\n// to record each mutation to the glob pattern as it's converted to regex\n{ options: { track: false, dot: undefined, makeRe: true, negated: false },\n pattern: '(.*\\\\/|^)bar\\\\/(?:(?!(?:^|\\\\/)\\\\.).)*?',\n history: [],\n tokens:\n { path:\n { whole: '**/bar/**',\n dirname: '**/bar/',\n filename: '**',\n basename: '**',\n extname: '',\n ext: '' },\n is:\n { glob: true,\n negated: false,\n globstar: true,\n dotfile: false,\n dotdir: false },\n match: {},\n original: '**/bar/**',\n pattern: '**/bar/**',\n base: '' } }\n```\n\n### .makeRe\n\nCreate a regular expression for matching file paths based on the given pattern:\n\n```js\nmm.makeRe('*.js');\n//=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n```\n\n## Options\n\n### options.unixify\n\nNormalize slashes in file paths and glob patterns to forward slashes.\n\nType: `{Boolean}`\n\nDefault: `undefined` on non-windows, `true` on windows.\n\n### options.dot\n\nMatch dotfiles. Same behavior as [minimatch](https://github.com/isaacs/minimatch).\n\nType: `{Boolean}`\n\nDefault: `false`\n\n### options.unescape\n\nUnescape slashes in glob patterns. Use cautiously, especially on windows.\n\nType: `{Boolean}`\n\nDefault: `undefined`\n\n**Example**\n\n```js\nmm.isMatch('abc', '\\\\a\\\\b\\\\c', {unescape: true});\n//=> true\n```\n\n### options.nodupes\n\nRemove duplicate elements from the result array.\n\nType: `{Boolean}`\n\nDefault: `undefined`\n\n**Example**\n\nExample of using the `unescape` and `nodupes` options together:\n\n```js\nmm.match(['abc', '\\\\a\\\\b\\\\c'], '\\\\a\\\\b\\\\c', {unescape: true});\n//=> ['abc', 'abc']\n\nmm.match(['abc', '\\\\a\\\\b\\\\c'], '\\\\a\\\\b\\\\c', {unescape: true, nodupes: true});\n//=> ['abc']\n```\n\n### options.matchBase\n\nAllow glob patterns without slashes to match a file path based on its basename. . Same behavior as [minimatch](https://github.com/isaacs/minimatch).\n\nType: `{Boolean}`\n\nDefault: `false`\n\n**Example**\n\n```js\nmm(['a/b.js', 'a/c.md'], '*.js');\n//=> []\n\nmm(['a/b.js', 'a/c.md'], '*.js', {matchBase: true});\n//=> ['a/b.js']\n```\n\n### options.nobraces\n\nDon't expand braces in glob patterns. Same behavior as [minimatch](https://github.com/isaacs/minimatch) `nobrace`.\n\nType: `{Boolean}`\n\nDefault: `undefined`\n\nSee [braces](https://github.com/jonschlinkert/braces) for more information about extended brace expansion.\n\n### options.nobrackets\n\nDon't expand POSIX bracket expressions.\n\nType: `{Boolean}`\n\nDefault: `undefined`\n\nSee [expand-brackets](https://github.com/jonschlinkert/expand-brackets) for more information about extended bracket expressions.\n\n### options.noextglob\n\nDon't expand extended globs.\n\nType: `{Boolean}`\n\nDefault: `undefined`\n\nSee [extglob](https://github.com/jonschlinkert/extglob) for more information about extended globs.\n\n### options.nocase\n\nUse a case-insensitive regex for matching files. Same behavior as [minimatch](https://github.com/isaacs/minimatch).\n\nType: `{Boolean}`\n\nDefault: `false`\n\n### options.nonull\n\nIf `true`, when no matches are found the actual (array-ified) glob pattern is returned instead of an empty array. Same behavior as [minimatch](https://github.com/isaacs/minimatch).\n\nType: `{Boolean}`\n\nDefault: `false`\n\n### options.cache\n\nCache the platform (e.g. `win32`) to prevent this from being looked up for every filepath.\n\nType: `{Boolean}`\n\nDefault: `true`\n\n## Other features\n\nMicromatch also supports the following.\n\n### Extended globbing\n\n#### extglobs\n\nExtended globbing, as described by the bash man page:\n\n| **pattern** | **regex equivalent** | **description** |\n| --- | --- | --- |\n| `?(pattern-list)` | `(...|...)?` | Matches zero or one occurrence of the given patterns |\n| `*(pattern-list)` | `(...|...)*` | Matches zero or more occurrences of the given patterns |\n| `+(pattern-list)` | `(...|...)+` | Matches one or more occurrences of the given patterns |\n| `@(pattern-list)` | `(...|...)` <sup>*</sup> | Matches one of the given patterns |\n| `!(pattern-list)` | N/A | Matches anything except one of the given patterns |\n\n<sup><strong>*</strong></sup> `@` isn't a RegEx character.\n\nPowered by [extglob](https://github.com/jonschlinkert/extglob). Visit that library for the full range of options or to report extglob related issues.\n\nSee [extglob](https://github.com/jonschlinkert/extglob) for more information about extended globs.\n\n#### brace expansion\n\nIn simple cases, brace expansion appears to work the same way as the logical `OR` operator. For example, `(a|b)` will achieve the same result as `{a,b}`.\n\nHere are some powerful features unique to brace expansion (versus character classes):\n\n* range expansion: `a{1..3}b/*.js` expands to: `['a1b/*.js', 'a2b/*.js', 'a3b/*.js']`\n* nesting: `a{c,{d,e}}b/*.js` expands to: `['acb/*.js', 'adb/*.js', 'aeb/*.js']`\n\nVisit [braces](https://github.com/jonschlinkert/braces) to ask questions and create an issue related to brace-expansion, or to see the full range of features and options related to brace expansion.\n\n#### regex character classes\n\nWith the exception of brace expansion (`{a,b}`, `{1..5}`, etc), most of the special characters convert directly to regex, so you can expect them to follow the same rules and produce the same results as regex.\n\nFor example, given the list: `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`:\n\n* `[ac].js`: matches both `a` and `c`, returning `['a.js', 'c.js']`\n* `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']`\n* `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']`\n* `a/[A-Z].js`: matches and uppercase letter, returning `['a/E.md']`\n\nLearn about [regex character classes](http://www.regular-expressions.info/charclass.html).\n\n#### regex groups\n\nGiven `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`:\n\n* `(a|c).js`: would match either `a` or `c`, returning `['a.js', 'c.js']`\n* `(b|d).js`: would match either `b` or `d`, returning `['b.js', 'd.js']`\n* `(b|[A-Z]).js`: would match either `b` or an uppercase letter, returning `['b.js', 'E.js']`\n\nAs with regex, parenthese can be nested, so patterns like `((a|b)|c)/b` will work. But it might be easier to achieve your goal using brace expansion.\n\n#### POSIX bracket expressions\n\n**Example**\n\n```js\nmm.isMatch('a1', '[[:alpha:][:digit:]]');\n//=> true\n```\n\nSee [expand-brackets](https://github.com/jonschlinkert/expand-brackets) for more information about extended bracket expressions.\n\n## Notes\n\nWhenever possible parsing behavior for patterns is based on globbing specifications in Bash 4.3. Patterns that aren't described by Bash follow wildmatch spec (used by git).\n\n## Benchmarks\n\nRun the [benchmarks](./benchmark):\n\n```bash\nnode benchmark\n```\n\nAs of October 03, 2015:\n\n```bash\n#1: basename-braces\n micromatch x 26,420 ops/sec ±0.89% (91 runs sampled)\n minimatch x 3,507 ops/sec ±0.64% (97 runs sampled)\n\n#2: basename\n micromatch x 25,315 ops/sec ±0.82% (93 runs sampled)\n minimatch x 4,398 ops/sec ±0.86% (94 runs sampled)\n\n#3: braces-no-glob\n micromatch x 341,254 ops/sec ±0.78% (93 runs sampled)\n minimatch x 30,197 ops/sec ±1.12% (91 runs sampled)\n\n#4: braces\n micromatch x 54,649 ops/sec ±0.74% (94 runs sampled)\n minimatch x 3,095 ops/sec ±0.82% (95 runs sampled)\n\n#5: immediate\n micromatch x 16,719 ops/sec ±0.79% (95 runs sampled)\n minimatch x 4,348 ops/sec ±0.86% (96 runs sampled)\n\n#6: large\n micromatch x 721 ops/sec ±0.77% (94 runs sampled)\n minimatch x 17.73 ops/sec ±1.08% (50 runs sampled)\n\n#7: long\n micromatch x 5,051 ops/sec ±0.87% (97 runs sampled)\n minimatch x 628 ops/sec ±0.83% (94 runs sampled)\n\n#8: mid\n micromatch x 51,280 ops/sec ±0.80% (95 runs sampled)\n minimatch x 1,923 ops/sec ±0.84% (95 runs sampled)\n\n#9: multi-patterns\n micromatch x 22,440 ops/sec ±0.97% (94 runs sampled)\n minimatch x 2,481 ops/sec ±1.10% (94 runs sampled)\n\n#10: no-glob\n micromatch x 722,823 ops/sec ±1.30% (87 runs sampled)\n minimatch x 52,967 ops/sec ±1.09% (94 runs sampled)\n\n#11: range\n micromatch x 243,471 ops/sec ±0.79% (94 runs sampled)\n minimatch x 11,736 ops/sec ±0.82% (96 runs sampled)\n\n#12: shallow\n micromatch x 190,874 ops/sec ±0.98% (95 runs sampled)\n minimatch x 21,699 ops/sec ±0.81% (97 runs sampled)\n\n#13: short\n micromatch x 496,393 ops/sec ±3.86% (90 runs sampled)\n minimatch x 53,765 ops/sec ±0.75% (95 runs sampled)\n```\n\n## Run tests\n\nInstall dev dependencies:\n\n```sh\n$ npm i -d && npm test\n```\n\n## Contributing\n\nPull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/micromatch/issues/new).\n\nPlease be sure to run the benchmarks before/after any code changes to judge the impact before you do a PR. thanks!\n\n## Related\n\n* [braces](https://www.npmjs.com/package/braces): Fastest brace expansion for node.js, with the most complete… [more](https://www.npmjs.com/package/braces) | [homepage](https://github.com/jonschlinkert/braces)\n* [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/jonschlinkert/expand-brackets)\n* [expand-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers… [more](https://www.npmjs.com/package/expand-range) | [homepage](https://github.com/jonschlinkert/expand-range)\n* [extglob](https://www.npmjs.com/package/extglob): Convert extended globs to regex-compatible strings. Add (almost) the… [more](https://www.npmjs.com/package/extglob) | [homepage](https://github.com/jonschlinkert/extglob)\n* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally… [more](https://www.npmjs.com/package/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range)\n* [gulp-micromatch](https://www.npmjs.com/package/gulp-micromatch): Filter vinyl files with glob patterns, string, regexp, array,… [more](https://www.npmjs.com/package/gulp-micromatch) | [homepage](https://github.com/tunnckocore/gulp-micromatch)\n* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a… [more](https://www.npmjs.com/package/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob)\n* [parse-glob](https://www.npmjs.com/package/parse-glob): Parse a glob pattern into an object of tokens. | [homepage](https://github.com/jonschlinkert/parse-glob)\n\n## Author\n\n**Jon Schlinkert**\n\n+ [github/jonschlinkert](https://github.com/jonschlinkert)\n+ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)\n\n## License\n\nCopyright © 2014-2015 [Jon Schlinkert](https://github.com/jonschlinkert)\nReleased under the MIT license.\n\n***\n\n_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on October 03, 2015._\n\n<!-- deps:mocha browserify -->",
"readmeFilename": "README.md",
"repository": {
"type": "git",
"url": "git+https://github.com/jonschlinkert/micromatch.git"
},
"scripts": {
"test": "mocha"
},
"verb": {
"reflinks": [
"braces",
"expand-brackets",
"extglob",
"minimatch",
"multimatch",
"verb"
],
"related": {
"list": [
"braces",
"expand-brackets",
"expand-range",
"extglob",
"fill-range",
"gulp-micromatch",
"is-glob",
"parse-glob"
]
}
},
"version": "2.3.7"
}