{"_id":"2ab2-js","_rev":"3-2cbe994e53cab095b20b4281a5754fb5","name":"2ab2-js","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"2ab2-js","version":"1.0.0","description":"Pure JavaScript 2ab2 Blockchain library for Node.js and browsers.","browser":{"ws":false,"crypto":false},"scripts":{"test":"mocha --compilers js:babel-core/register --recursive","test:chain":"mocha --compilers js:babel-core/register ./test/chain --recursive","test:ecc":"mocha --compilers js:babel-core/register ./test/ecc --recursive","test:serializer":"mocha --compilers js:babel-core/register ./test/serializer --recursive","test:watch":"npm test -- --watch","clean":"rm -rf ./dist/* & rm -rf ./build/*","presbuild":"npm run clean","build":"babel lib --presets es2015-generators-async --out-dir dist","build:watch":"babel lib --presets es2015-generators-async --out-dir dist --watch","prebrowserify":"rm -rf ./build/*","browserify":"browserify --full-paths dist/browser.js --standalone steemJS -o build/2ab2.js -d","postbrowserify":"uglifyjs --compress --mangle --sequences --drop_console --output build/edc.min.js -- build/edc.js","prepare":"npm run build","doc":"esdoc -c esdoc.json"},"repository":{"type":"git","url":"git+https://github.com/blockchain-2ab2/2ab2-js.git"},"author":{"name":"Sigve Kvalsvik","email":"bitsharesblocks@gmail.com","url":"https://github.com/svk31"},"contributors":[{"name":"James Calfee","email":"james@jcalfee.info","url":"https://github.com/jcalfee/"},{"name":"Daniel Larimer","email":"dan@cryptonomex.com","url":"https://github.com/bytemaster/"},{"name":"Valentine Zavgorodnev","email":"valentine.zavgorodnev@gmail.com","url":"https://github.com/valzav/"},{"name":"Aliaksandr Lazarchyk","email":"lazari.dev@gmail.com"}],"license":"BSD-2-Clause-FreeBSD","bugs":{"url":"https://github.com/blockchain-2ab2/2ab2-js/issues"},"engines":{"node":">= 6.0.0"},"main":"./dist/index.js","dependencies":{"bigi":"^1.4.2","bluebird":"^3.7.2","bs58":"^4.0.1","bytebuffer":"^5.0.0","create-hash":"^1.1.2","create-hmac":"^1.1.4","crypto-js":"^3.1.9-1","deep-equal":"^1.1.1","ecurve":"^1.0.2","2ab2-ws-js":"^0.2.2","event-emitter":"^0.3.4","immutable":"^4.0.0-rc.12","moment":"^2.24.0","secure-random":"^1.1.2","transform-runtime":"0.0.0","safe-buffer":"latest"},"devDependencies":{"assert":"^2.0.0","babel-cli":"^6.9.0","babel-core":"^6.10.4","babel-eslint":"^10.1.0","babel-preset-es2015":"^6.24.1","babel-preset-es2015-generators-async":"^6.3.13","browserify":"^16.5.0","esdoc":"^1.1.0","eslint":"^6.8.0","mocha":"^6.2.2","uglifyjs":"^2.4.10"},"gitHead":"dd2ba455e328698c1deb6155416409a2672e17bf","homepage":"https://github.com/blockchain-2ab2/2ab2-js#readme","_id":"2ab2-js@1.0.0","_nodeVersion":"14.18.1","_npmVersion":"6.14.15","dist":{"integrity":"sha512-AeK7sPui/wpFNoE3yUDgg1daZB8n3P7Brzzt9hhDLjL3xWulKhRP97ECmfwHY2qG41uhzQ03IgjjGVZrcsjhFw==","shasum":"a35b376e0e1ac011a2aedca0b17299c94a527fdd","tarball":"https://registry.npmjs.org/2ab2-js/-/2ab2-js-1.0.0.tgz","fileCount":54,"unpackedSize":671090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh6WyGCRA9TVsSAnZWagAASTwQAIXijjcUv57ks/rTBy/d\nqC0JhQV6B738nmWG1f71SfBi7QYWZz64r6xC42RJbn8X/Z8sUtKnJyaRixrH\nmH4T3jeXtokd2sMYVaHRHmaXqKETMSui/ZdVynBBKygk73oaRMJuHj9pRPqU\n8SmPXkIXaGT8zGQ6rEPduj24BrhKV3RCKwYkV1aylaYU6XKtlkYJR5VlZyUA\nZwbsFGmyjB0nCZEnaz1EiyRByYOQVAIJpPC0badwZB3utgslDfRqyhDbOQF2\npIZYVSSI4ZGcAZi/hmE8k+px6QtJLMfKgIGGzQLPL0DzLJxKUcDC2Rr+hKH4\nr6+OzYOrn21SVh17HCnDOoTFszagxNiQIUxVrojo9SnllLkStP3kG4NNGFfE\nJwQOwkhaNv/wnVZB2ySJdxaC28d/1A7TefxPWkhVBa20lOnASaGBDsXYVOFm\noCpijKFYPPMYiXeidROY+88k0ji2Knic+BqvTOXFuOOEvM+2zLxSm6/nCzSH\n4TiNORglZdnfvdQLxJEwA3ouzPCHN9x6OYyLcVqX2enYuQ4VBDdTsX+QHmi7\nJVvYOgSh9t4TIYr3fJ0aOflE9L/wn/Dbsy9/vpe5Ca6lYQa87KekrrjfmLy7\nu4JezMCQC5FpzcemBUnF15nIUKhW8zXX6FSyIAO/nlOQNL3gQcPyhPy0kLbF\nWZzw\r\n=ecsb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID83gDwqUJhjNx1PJuM0JuJDw9ByO8WEaJr2TTYpxFM9AiEA/c9dtC9WVXod3d1gpLVG9tCOvt/zZN9D/PfYCThtvew="}]},"_npmUser":{"name":"2ab2-blockchain","email":"development@2ab2.com"},"directories":{},"maintainers":[{"name":"2ab2-blockchain","email":"development@2ab2.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/2ab2-js_1.0.0_1642687622018_0.6431442723315695"},"_hasShrinkwrap":false},"1.0.1":{"name":"2ab2-js","version":"1.0.1","description":"Pure JavaScript 2ab2 Blockchain library for Node.js and browsers.","browser":{"ws":false,"crypto":false},"scripts":{"test":"mocha --compilers js:babel-core/register --recursive","test:chain":"mocha --compilers js:babel-core/register ./test/chain --recursive","test:ecc":"mocha --compilers js:babel-core/register ./test/ecc --recursive","test:serializer":"mocha --compilers js:babel-core/register ./test/serializer --recursive","test:watch":"npm test -- --watch","clean":"rm -rf ./dist/* & rm -rf ./build/*","presbuild":"npm run clean","build":"babel lib --presets es2015-generators-async --out-dir dist","build:watch":"babel lib --presets es2015-generators-async --out-dir dist --watch","prebrowserify":"rm -rf ./build/*","browserify":"browserify --full-paths dist/browser.js --standalone steemJS -o build/2ab2.js -d","postbrowserify":"uglifyjs --compress --mangle --sequences --drop_console --output build/edc.min.js -- build/edc.js","prepare":"npm run build","doc":"esdoc -c esdoc.json"},"repository":{"type":"git","url":"git+https://github.com/blockchain-2ab2/2ab2-js.git"},"author":{"name":"Sigve Kvalsvik","email":"bitsharesblocks@gmail.com","url":"https://github.com/svk31"},"contributors":[{"name":"James Calfee","email":"james@jcalfee.info","url":"https://github.com/jcalfee/"},{"name":"Daniel Larimer","email":"dan@cryptonomex.com","url":"https://github.com/bytemaster/"},{"name":"Valentine Zavgorodnev","email":"valentine.zavgorodnev@gmail.com","url":"https://github.com/valzav/"},{"name":"Aliaksandr Lazarchyk","email":"lazari.dev@gmail.com"}],"license":"BSD-2-Clause-FreeBSD","bugs":{"url":"https://github.com/blockchain-2ab2/2ab2-js/issues"},"engines":{"node":">= 6.0.0"},"main":"./dist/index.js","dependencies":{"bigi":"^1.4.2","bluebird":"^3.7.2","bs58":"^4.0.1","bytebuffer":"^5.0.0","create-hash":"^1.1.2","create-hmac":"^1.1.4","crypto-js":"^3.1.9-1","deep-equal":"^1.1.1","ecurve":"^1.0.2","2ab2-ws-js":"^0.2.3","event-emitter":"^0.3.4","immutable":"^4.0.0-rc.12","moment":"^2.24.0","secure-random":"^1.1.2","transform-runtime":"0.0.0","safe-buffer":"latest"},"devDependencies":{"assert":"^2.0.0","babel-cli":"^6.9.0","babel-core":"^6.10.4","babel-eslint":"^10.1.0","babel-preset-es2015":"^6.24.1","babel-preset-es2015-generators-async":"^6.3.13","browserify":"^16.5.0","esdoc":"^1.1.0","eslint":"^6.8.0","mocha":"^6.2.2","uglifyjs":"^2.4.10"},"gitHead":"29772c84c6f5da54464c79f56c11576300bf3a70","homepage":"https://github.com/blockchain-2ab2/2ab2-js#readme","_id":"2ab2-js@1.0.1","_nodeVersion":"10.24.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-7FXaA9q7grGXWojZJIlGZzcGTpW2Zh8EEM3igQQtj5TOkQduX6GDOTR/DXvV3AMMTNkSKrZMXbSuSiCPf6jZEQ==","shasum":"80377de9b8fba587e6bb8b7c331ae84d753171d4","tarball":"https://registry.npmjs.org/2ab2-js/-/2ab2-js-1.0.1.tgz","fileCount":54,"unpackedSize":671090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiLN30ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpamQ//Uf0I+119NfeD8PDRb/nViN+SSBLOX0EItr7WdZl1k1NZylC/\r\nkSjTTg+M/ghfHEiWWdkF7yVuDiLGDeJpVt/z8Z/LBKl8MXQEPIRAtIjjFE+H\r\nUxEZ6ZpqkMN8iySN/5UMNHAG5LbiCFY9/wma8N+UOQIMdZ6UMZEYzpgL4PlS\r\nKCUmBEbSlIYa4nAcv++bpeqnlWSc3RhYkNCC9m9rq7Piw+lTG0QIxfC0jIBv\r\nCpHyQsEEctCs9CoThDLCuCUfl+LVk3t8H8H56m5pWpip7Q+FPSaSAG3BNJ1R\r\nKeH/6mBe2JVbduZzmbj6qws4R36E5Cv7NkCgfh0GWgxZYeZCZMYxDZQBW6jY\r\n3hvwcb15baITB/hIClV0JG7sPCCHce0q66Sa9icQQuAn7gQKVfdMOUZDvlKB\r\naoW/a0Z1aDzZ0XBjsT6vVDJGRtXxYOd+ywP8ga/0O+u8aXH/0xolE8CeOcnq\r\nd6gGz70JyaFQE785PKKpAGDDg/ObjyiPAZASstnft4RPq0PiZdT4VHip8x8l\r\nBAZVjvIVpW/gthmek7o8G9CWP298haI4t7ARZ4Fwm9QrBTLrgjA6vGFHkWLh\r\nOfwRecAqRZxSGHzqcOaxvR0McEEzN6BW/6VgNdShdD8U236aM8ZH7b1gt3F1\r\nJYnP+ramXgiAlXytIHZ7muwavMBhEHhIiyI=\r\n=c+Fz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0IMhaOt1fBGeJ3Oa0gMXkUEiUkKi+mtSzit2i7f0ltwIgJZ51w0gEFx2SCj4PDjv2+Yc16EBKSjbNpJkVfVkCPHY="}]},"_npmUser":{"name":"2ab2-blockchain","email":"development@2ab2.com"},"directories":{},"maintainers":[{"name":"2ab2-blockchain","email":"development@2ab2.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/2ab2-js_1.0.1_1647107572395_0.17880405870611993"},"_hasShrinkwrap":false},"1.0.2":{"name":"2ab2-js","version":"1.0.2","description":"Pure JavaScript 2ab2 Blockchain library for Node.js and browsers.","browser":{"ws":false,"crypto":false},"scripts":{"test":"mocha --compilers js:babel-core/register --recursive","test:chain":"mocha --compilers js:babel-core/register ./test/chain --recursive","test:ecc":"mocha --compilers js:babel-core/register ./test/ecc --recursive","test:serializer":"mocha --compilers js:babel-core/register ./test/serializer --recursive","test:watch":"npm test -- --watch","clean":"rm -rf ./dist/* & rm -rf ./build/*","presbuild":"npm run clean","build":"babel lib --presets es2015-generators-async --out-dir dist","build:watch":"babel lib --presets es2015-generators-async --out-dir dist --watch","prebrowserify":"rm -rf ./build/*","browserify":"browserify --full-paths dist/browser.js --standalone steemJS -o build/2ab2.js -d","postbrowserify":"uglifyjs --compress --mangle --sequences --drop_console --output build/edc.min.js -- build/edc.js","prepare":"npm run build","doc":"esdoc -c esdoc.json"},"repository":{"type":"git","url":"git+https://github.com/blockchain-2ab2/2ab2-js.git"},"author":{"name":"Sigve Kvalsvik","email":"bitsharesblocks@gmail.com","url":"https://github.com/svk31"},"contributors":[{"name":"James Calfee","email":"james@jcalfee.info","url":"https://github.com/jcalfee/"},{"name":"Daniel Larimer","email":"dan@cryptonomex.com","url":"https://github.com/bytemaster/"},{"name":"Valentine Zavgorodnev","email":"valentine.zavgorodnev@gmail.com","url":"https://github.com/valzav/"},{"name":"Aliaksandr Lazarchyk","email":"lazari.dev@gmail.com"}],"license":"BSD-2-Clause-FreeBSD","bugs":{"url":"https://github.com/blockchain-2ab2/2ab2-js/issues"},"engines":{"node":">= 6.0.0"},"main":"./dist/index.js","dependencies":{"bigi":"^1.4.2","bluebird":"^3.7.2","bs58":"^4.0.1","bytebuffer":"^5.0.0","create-hash":"^1.1.2","create-hmac":"^1.1.4","crypto-js":"^3.1.9-1","deep-equal":"^1.1.1","ecurve":"^1.0.2","2ab2-ws-js":"^0.2.4","event-emitter":"^0.3.4","immutable":"^4.0.0-rc.12","moment":"^2.24.0","secure-random":"^1.1.2","transform-runtime":"0.0.0","safe-buffer":"latest"},"devDependencies":{"assert":"^2.0.0","babel-cli":"^6.9.0","babel-core":"^6.10.4","babel-eslint":"^10.1.0","babel-preset-es2015":"^6.24.1","babel-preset-es2015-generators-async":"^6.3.13","browserify":"^16.5.0","esdoc":"^1.1.0","eslint":"^6.8.0","mocha":"^6.2.2","uglifyjs":"^2.4.10"},"gitHead":"f208ec58181691e58ee6d15d93b44c0aa1f4547a","homepage":"https://github.com/blockchain-2ab2/2ab2-js#readme","_id":"2ab2-js@1.0.2","_nodeVersion":"10.24.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-j9fYabp3vPJ98xUXvbeUzrUEQSETn+s1jXGyopag4RtfHojmT9sDe7ZkN/HFfs4AzHmhkbRqfk/M0e5HddCujQ==","shasum":"3acd4741f81e7ee2a73dd6650b0952f9e5f45e2a","tarball":"https://registry.npmjs.org/2ab2-js/-/2ab2-js-1.0.2.tgz","fileCount":54,"unpackedSize":671090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiLONXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqM/Q//VFY/6NATc2FC+Qo3AMlHqvXyT3BfZC2fgqfEiDtfsiNSHedx\r\nROoITwUnf2WaU4WxLlzdjU5exNMLbOkmwWJGh283Y9C9grsN2dGah40QD+Uo\r\nMCy/MTkpfX8mfymDtpmcoUGLhgeOVQbACBaX0sgPcSu92bRIcGP/WK4s7NWr\r\nauZ0DPz7906xoXbw/viFjUixFJymbTDdl6ej3clh1K+IlZHN1FOg3Nub0JDG\r\nDzzQOrDEzO0kaYf0L3kbYOknvx8e48x041MqPb9DdBHpL5U80ZkYjixCYXkT\r\nT8ZS0i5UauPCbs6eX3rQeCk8b5pXHFsnxRxJ4yvY7gscpT72Tt6J9w0zXAaE\r\nxIk//+oNHvfZuvprE7adMUK0u9V0K6Bfed5TVy50YkqYdoinbKBKY1g+2z3H\r\nlKfjgBc1wV+5uYujYOg2b1dWzeNINKE30oqQrwcoohti4rwnpPd5382r+Au/\r\nSZ13hb9kuoKnhtZpAWoHgSbVkjcxBEgDZiRuLviF6SZ97Mzekk9SIu+r3mMb\r\nEH2HSpzDGLdzrwCKqhl4ASyvNjdF6Q4MTpkBZgkV8DX4mLATQumbFYx2Zd//\r\neAiKtCjvLHPoQH8flBOekilT/zVdrzKp6ZSwGcOCVFQlKhiwPhuqoqVGX1Mc\r\nig3NGFXXEeyuk7aZepNELCASpTLQ2kmv3hQ=\r\n=nvR3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcaCJhonEBMuyP1POKLncToKOlRLk2uglD+15itFbiQgIhAIs3xRVPaKcTyx7ckugmuH0ybgO06gohp8rb9qzP+TDs"}]},"_npmUser":{"name":"2ab2-blockchain","email":"development@2ab2.com"},"directories":{},"maintainers":[{"name":"2ab2-blockchain","email":"development@2ab2.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/2ab2-js_1.0.2_1647108951137_0.744918612605197"},"_hasShrinkwrap":false}},"time":{"created":"2022-01-20T14:07:02.018Z","1.0.0":"2022-01-20T14:07:02.171Z","modified":"2022-04-04T10:18:41.256Z","1.0.1":"2022-03-12T17:52:52.594Z","1.0.2":"2022-03-12T18:15:51.345Z"},"maintainers":[{"name":"2ab2-blockchain","email":"development@2ab2.com"}],"description":"Pure JavaScript 2ab2 Blockchain library for Node.js and browsers.","homepage":"https://github.com/blockchain-2ab2/2ab2-js#readme","repository":{"type":"git","url":"git+https://github.com/blockchain-2ab2/2ab2-js.git"},"contributors":[{"name":"James Calfee","email":"james@jcalfee.info","url":"https://github.com/jcalfee/"},{"name":"Daniel Larimer","email":"dan@cryptonomex.com","url":"https://github.com/bytemaster/"},{"name":"Valentine Zavgorodnev","email":"valentine.zavgorodnev@gmail.com","url":"https://github.com/valzav/"},{"name":"Aliaksandr Lazarchyk","email":"lazari.dev@gmail.com"}],"author":{"name":"Sigve Kvalsvik","email":"bitsharesblocks@gmail.com","url":"https://github.com/svk31"},"bugs":{"url":"https://github.com/blockchain-2ab2/2ab2-js/issues"},"license":"BSD-2-Clause-FreeBSD","readme":"# 2ab2 Blockchain JS (2ab2-js)\n\nPure JavaScript 2AB2 Blockchain library for Node.js and browsers. Can be used to construct, sign and broadcast transactions in JavaScript, and to easily obtain data from the blockchain via public apis.\n\nMost of this code was written by [jcalfeee](https://github.com/jcalfee), my work was mostly just repackaging to a discrete npm package.\n\n## Setup\n\nThis library can be obtained through npm:\n```\nnpm install 2ab2-js\n```\n\n## Usage\n\nThree sub-libraries are included: `ECC`, `Chain` and `Serializer`. Generally only the `ECC` and `Chain` libraries need to be used directly.\n\n### Chain\nThis library provides utility functions to handle blockchain state as well as a login class that can be used for simple login functionality using a specific key seed.\n\n#### Login\nThe login class uses the following format for keys:\n\n```\nkeySeed = accountName + role + password\n```\n\nUsing this seed, private keys are generated for either the default roles `active, owner, memo`, or as specified. A minimum password length of 12 characters is enforced, but an even longer password is recommended. Three methods are provided:\n\n```\ngenerateKeys(account, password, [roles])\ncheckKeys(account, password, auths)\nsignTransaction(tr)\n```\n\nThe auths object should contain the auth arrays from the account object. An example is this:\n\n```\n{\n    active: [\n        [\"GPH5Abm5dCdy3hJ1C5ckXkqUH2Me7dXqi9Y7yjn9ACaiSJ9h8r8mL\", 1]\n    ]\n}\n```\n\nIf checkKeys is successful, you can use signTransaction to sign a TransactionBuilder transaction using the private keys for that account...\n\n#### State container\nThe Chain library contains a complete state container called the ChainStore. The ChainStore will automatically configure the `set_subscribe_callback` and handle any incoming state changes appropriately. It uses Immutable.js for storing the state, so all objects are return as immutable objects. It has its own `subscribe` method that can be used to register a callback that will be called whenever a state change happens.\n\nThe ChainStore has several useful methods to retrieve, among other things, objects, assets and accounts using either object ids or asset/account names. These methods are synchronous and will return `undefined` to indicate fetching in progress, and `null` to indicate that the object does not exist.\n\n```\nvar {Apis} = require(\"2ab2-ws-js\");\nvar {ChainStore} = require(\"2ab2-js\");\n\nApis.instance(\"wss://bitshares.openledger.info/ws\", true).init_promise.then((res) => {\n    console.log(\"connected to:\", res[0].network);\n    ChainStore.init().then(() => {\n        ChainStore.subscribe(updateState);\n    });\n});\n\nlet dynamicGlobal = null;\nfunction updateState(object) {\n    dynamicGlobal = ChainStore.getObject(\"2.1.0\");\n    console.log(\"ChainStore object update\\n\", dynamicGlobal ? dynamicGlobal.toJS() : dynamicGlobal);\n}\n\n```\n\n### ECC\nThe ECC library contains all the crypto functions for private and public keys as well as transaction creation/signing.\n\n#### Private keys\nAs a quick example, here's how to generate a new private key from a seed (a brainkey for example):\n\n```\nvar {PrivateKey, key} = require(\"2ab2-js\");\n\nlet seed = \"THIS IS A TERRIBLE BRAINKEY SEED WORD SEQUENCE\";\nlet pkey = PrivateKey.fromSeed( key.normalize_brainKey(seed) );\n\nconsole.log(\"\\nPrivate key:\", pkey.toWif());\nconsole.log(\"Public key :\", pkey.toPublicKey().toString(), \"\\n\");\n```\n\n#### Transactions\nTODO transaction signing example\n\n## ESDoc (beta)\n```bash\nnpm i -g esdoc esdoc-es7-plugin\nesdoc -c ./esdoc.json\nopen out/esdoc/index.html\n```\n","readmeFilename":"README.md"}