JavaScript generic ASN.1 parser (mirror)

Compare changes

Choose any two refs to compare.

+10
.editorconfig
··· 1 + root = true 2 + end_of_line = lf 3 + max_line_length = 120 4 + 5 + [*.{js,css}] 6 + charset = utf-8 7 + indent_size = 4 8 + indent_style = space 9 + insert_final_newline = true 10 + trim_trailing_whitespace = true
+9 -5
.github/workflows/node.js.yml
··· 12 12 13 13 strategy: 14 14 matrix: 15 - node-version: [ 12.20.0, latest ] 15 + node-version: [ 14.6.0, latest ] 16 16 17 17 steps: 18 18 - uses: actions/checkout@v4 19 + - name: Use pnpm 20 + uses: pnpm/action-setup@v4 21 + with: 22 + run_install: false 19 23 - name: Use Node.js ${{ matrix.node-version }} 20 24 uses: actions/setup-node@v4 21 25 with: 22 26 node-version: ${{ matrix.node-version }} 23 - - run: npm test all 24 - - run: npm install 25 - if: matrix.node-version == 'latest' 26 - - run: npm run lint 27 + cache: pnpm 28 + - run: pnpm install 29 + - run: node test all 30 + - run: pnpm run lint 27 31 if: matrix.node-version == 'latest'
-1
.gitignore
··· 4 4 node_modules/ 5 5 dist/ 6 6 package-lock.json 7 - pnpm-lock.yaml 8 7 # Artifacts from release.sh 9 8 index-local.html 10 9 sha256sums.asc
-1
.mtn-ignore
··· 3 3 node_modules$ 4 4 dist$ 5 5 package-lock[.]json 6 - pnpm-lock[.]yaml 7 6 # Artifacts from release.sh 8 7 index-local.html 9 8 sha256sums[.]asc
+99
.vscode/launch.json
··· 1 + { 2 + // Use IntelliSense to learn about possible attributes. 3 + // Hover to view descriptions of existing attributes. 4 + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 + "version": "0.2.0", 6 + "configurations": [ 7 + { 8 + "type": "node", 9 + "request": "launch", 10 + "name": "test", 11 + "skipFiles": [ 12 + "<node_internals>/**" 13 + ], 14 + "program": "${workspaceFolder}/test.js", 15 + "args": [] 16 + }, 17 + { 18 + "type": "node", 19 + "request": "launch", 20 + "name": "dumpASN1", 21 + "skipFiles": [ 22 + "<node_internals>/**" 23 + ], 24 + "program": "${workspaceFolder}/dumpASN1.js", 25 + "args": [ 26 + "examples/ed25519.cer" 27 + ] 28 + }, 29 + { 30 + "type": "node", 31 + "request": "launch", 32 + "name": "parseRFC", 33 + "skipFiles": [ 34 + "<node_internals>/**" 35 + ], 36 + "program": "${workspaceFolder}/parseRFC.js", 37 + "args": [ 38 + "rfc/rfc4511.txt", 39 + "rfcdef.json" 40 + ] 41 + }, 42 + { 43 + "type": "node", 44 + "request": "launch", 45 + "name": "dumpASN1 X.509", 46 + "skipFiles": [ 47 + "<node_internals>/**" 48 + ], 49 + "program": "${workspaceFolder}/dumpASN1.js", 50 + "args": [ 51 + "examples/ed25519.cer", 52 + "1.3.6.1.5.5.7.0.18", 53 + "Certificate" 54 + ] 55 + }, 56 + { 57 + "type": "node", 58 + "request": "launch", 59 + "name": "dumpASN1 CRL", 60 + "skipFiles": [ 61 + "<node_internals>/**" 62 + ], 63 + "program": "${workspaceFolder}/dumpASN1.js", 64 + "args": [ 65 + "data:base64,MIG9AgEBMA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxUUjM0IFNhbXBsZXMxGzAZBgNVBAMTElRSMzQgU2FtcGxlIENBIEtESBcNMTAxMTAyMTczMzMwWhcNMTAxMjAyMTczMzMwWjBIMBYCBTQAAAAIFw0xMDExMDIxNzI4MTNaMBYCBTQAAAAKFw0xMDExMDIxNzMxNDZaMBYCBTQAAAALFw0xMDExMDIxNzMzMjVa", 66 + "1.3.6.1.5.5.7.0.18", 67 + "TBSCertList" 68 + ] 69 + }, 70 + { 71 + "type": "node", 72 + "request": "launch", 73 + "name": "dumpASN1 CMS", 74 + "skipFiles": [ 75 + "<node_internals>/**" 76 + ], 77 + "program": "${workspaceFolder}/dumpASN1.js", 78 + "args": [ 79 + "examples/cms-password.p7m", 80 + "1.2.840.113549.1.9.16.0.14", 81 + "ContentInfo" 82 + ] 83 + }, 84 + { 85 + "type": "node", 86 + "request": "launch", 87 + "name": "dumpASN1 LDAP", 88 + "skipFiles": [ 89 + "<node_internals>/**" 90 + ], 91 + "program": "${workspaceFolder}/dumpASN1.js", 92 + "args": [ 93 + "data:base64,MDMCAQFjLgQACgEACgEAAgEAAgEAAQEAoA+jDQQFTnRWZXIEBAEAAAAwCgQITmV0bG9nb24===", 94 + "1.3.6.1.1.18", 95 + "LDAPMessage" 96 + ] 97 + } 98 + ] 99 + }
+9
.vscode/settings.json
··· 1 + { 2 + "editor.insertSpaces": true, 3 + "editor.tabSize": 8, 4 + "editor.indentSize": 4, 5 + "editor.stickyScroll.enabled": true, 6 + "explorer.excludeGitIgnore": true, 7 + "files.eol": "\n", 8 + "git.openRepositoryInParentFolders": "never" 9 + }
+27
CHANGELOG.md
··· 1 + # ChangeLog 2 + 3 + ## 2.1.0 - 2025-08-03 4 + 5 + ### Changed 6 + 7 + - when fields are CHOICEs now both the field name and the choice name are shown (fixes GitHub #102) 8 + - upgrade minimum NodeJS version supported from 12.20.0 to 14.6.0 due to usage of ?. and ?? operators in defs.js (ECMAScript 2020); older code is still linted against ECMAScript 2015 for now 9 + 10 + ### Added 11 + 12 + - add tests to check expected decoding 13 + 14 + ## 2.0.6 - 2025-07-29 15 + 16 + ### Added 17 + 18 + - add proper support for standard Base64 (we previously only supported Base64url) (fixes GitHub #99) 19 + - improve test harness 20 + 21 + ## 2.0.5 - 2025-04-12 22 + 23 + ### Added 24 + 25 + - add `index-local.html` for local `file://` usage without needing a web server 26 + - add definitions support for `LDAPMessage` 27 + - #TODO continue producing old ChangeLog entries
+1 -1
LICENSE
··· 1 1 ISC License 2 2 3 - Copyright (c) 2008-2024 Lapo Luchini <lapo@lapo.it> 3 + Copyright (c) 2008-2025 Lapo Luchini <lapo@lapo.it> 4 4 5 5 Permission to use, copy, modify, and/or distribute this software for any 6 6 purpose with or without fee is hereby granted, provided that the above
+4 -3
README.md
··· 3 3 4 4 asn1js is a JavaScript generic ASN.1 parser/decoder that can decode any valid ASN.1 DER or BER structures. 5 5 6 - An example page that can decode Base64-encoded (raw base64, PEM armoring and `begin-base64` are recognized) or Hex-encoded (or local files with some browsers) is included and can be used both [online on the official website](https://lapo.it/asn1js/) or [offline (ZIP file)](https://lapo.it/asn1js/asn1js.zip). 6 + An example page that can decode Base64-encoded (raw base64, PEM armoring and `begin-base64` are recognized) or Hex-encoded (or local files with some browsers) is included and can be used both [online on the official website](https://asn1js.eu/) or [offline (ZIP file)](https://lapo.it/asn1js/asn1js.zip) by opening `index-local.html`. 7 7 8 8 Usage with `nodejs` 9 9 ------------------- ··· 67 67 Local usage 68 68 -------------------- 69 69 70 - Since unfortunately ESM modules are not working on `file:` protocol due to [CORS issues](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#other_differences_between_modules_and_standard_scripts), there is a bundled [single-file version working locally](https://asn1js.eu/index-local.html). It doesn't work online (due to [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) restrictions about inline content) but can be saved locally and opened in a browser. ([known bug](https://github.com/lapo-luchini/asn1js/issues/89): dark mode is currently broken in this mode) 70 + Since unfortunately ESM modules are not working on `file:` protocol due to [CORS issues](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#other_differences_between_modules_and_standard_scripts), there is a bundled [single-file version working locally](https://asn1js.eu/index-local.html). It doesn't work online (due to [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) restrictions about inline content) but can be saved locally and opened in a browser. 71 71 72 72 Usage from CLI 73 73 -------------------- ··· 81 81 ISC license 82 82 ----------- 83 83 84 - ASN.1 JavaScript decoder Copyright (c) 2008-2024 Lapo Luchini <lapo@lapo.it> 84 + ASN.1 JavaScript decoder Copyright (c) 2008-2025 Lapo Luchini <lapo@lapo.it> 85 85 86 86 Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 87 87 ··· 105 105 - [dedicated domain](https://asn1js.eu/) 106 106 - [InDefero tracker](http://idf.lapo.it/p/asn1js/) 107 107 - [GitHub mirror](https://github.com/lapo-luchini/asn1js) 108 + - [ChangeLog on GitHub](https://github.com/lapo-luchini/asn1js/blob/trunk/CHANGELOG.md) 108 109 - [Ohloh code stats](https://www.openhub.net/p/asn1js)
+55 -24
asn1.js
··· 1 1 // ASN.1 JavaScript decoder 2 - // Copyright (c) 2008-2024 Lapo Luchini <lapo@lapo.it> 2 + // Copyright (c) 2008 Lapo Luchini <lapo@lapo.it> 3 3 4 4 // Permission to use, copy, modify, and/or distribute this software for any 5 5 // purpose with or without fee is hereby granted, provided that the above 6 6 // copyright notice and this permission notice appear in all copies. 7 - // 7 + // 8 8 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 9 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 10 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ··· 21 21 reTimeS = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|(-(?:0\d|1[0-2])|[+](?:0\d|1[0-4]))([0-5]\d)?)?$/, 22 22 reTimeL = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|(-(?:0\d|1[0-2])|[+](?:0\d|1[0-4]))([0-5]\d)?)?$/, 23 23 hexDigits = '0123456789ABCDEF', 24 - b64Safe = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', 24 + b64Std = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', 25 + b64URL = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', 25 26 tableT61 = [ 26 27 ['', ''], 27 28 ['AEIOUaeiou', 'ร€รˆรŒร’ร™ร รจรฌรฒรน'], // Grave ··· 56 57 } 57 58 } 58 59 59 - class Stream { 60 + /** Class to manage a stream of bytes, with a zero-copy approach. 61 + * It uses an existing array or binary string and advances a position index. */ 62 + export class Stream { 60 63 64 + /** 65 + * @param {Stream|array|string} enc data (will not be copied) 66 + * @param {?number} pos starting position (mandatory when `end` is not a Stream) 67 + */ 61 68 constructor(enc, pos) { 62 69 if (enc instanceof Stream) { 63 70 this.enc = enc.enc; 64 71 this.pos = enc.pos; 65 72 } else { 66 - // enc should be an array or a binary string 67 73 this.enc = enc; 68 74 this.pos = pos; 69 75 } 76 + if (typeof this.pos != 'number') 77 + throw new Error('"pos" must be a numeric value'); 78 + if (typeof this.enc == 'string') 79 + this.getRaw = pos => this.enc.charCodeAt(pos); 80 + else if (typeof this.enc[0] == 'number') 81 + this.getRaw = pos => this.enc[pos]; 82 + else 83 + throw new Error('"enc" must be a numeric array or a string'); 70 84 } 85 + /** Get the byte at current position (and increment it) or at a specified position (and avoid moving current position). 86 + * @param {?number} pos read position if specified, else current position (and increment it) */ 71 87 get(pos) { 72 88 if (pos === undefined) 73 89 pos = this.pos++; 74 90 if (pos >= this.enc.length) 75 91 throw new Error('Requesting byte offset ' + pos + ' on a stream of length ' + this.enc.length); 76 - return (typeof this.enc == 'string') ? this.enc.charCodeAt(pos) : this.enc[pos]; 92 + return this.getRaw(pos); 77 93 } 78 - hexByte(b) { 94 + /** Convert a single byte to an hexadcimal string (of length 2). 95 + * @param {number} b */ 96 + static hexByte(b) { 79 97 return hexDigits.charAt((b >> 4) & 0xF) + hexDigits.charAt(b & 0xF); 80 98 } 81 - /** Hexadecimal dump. 82 - * @param type 'raw', 'byte' or 'dump' */ 99 + /** Hexadecimal dump of a specified region of the stream. 100 + * @param {number} start starting position (included) 101 + * @param {number} end ending position (excluded) 102 + * @param {string} type 'raw', 'byte' or 'dump' (default) */ 83 103 hexDump(start, end, type = 'dump') { 84 104 let s = ''; 85 105 for (let i = start; i < end; ++i) { 86 106 if (type == 'byte' && i > start) 87 107 s += ' '; 88 - s += this.hexByte(this.get(i)); 108 + s += Stream.hexByte(this.get(i)); 89 109 if (type == 'dump') 90 110 switch (i & 0xF) { 91 111 case 0x7: s += ' '; break; ··· 95 115 } 96 116 return s; 97 117 } 98 - b64Dump(start, end) { 118 + /** Base64url dump of a specified region of the stream (according to RFC 4648 section 5). 119 + * @param {number} start starting position (included) 120 + * @param {number} end ending position (excluded) 121 + * @param {string} type 'url' (default, section 5 without padding) or 'std' (section 4 with padding) */ 122 + b64Dump(start, end, type = 'url') { 123 + const b64 = type === 'url' ? b64URL : b64Std; 99 124 let extra = (end - start) % 3, 100 125 s = '', 101 126 i, c; 102 127 for (i = start; i + 2 < end; i += 3) { 103 128 c = this.get(i) << 16 | this.get(i + 1) << 8 | this.get(i + 2); 104 - s += b64Safe.charAt(c >> 18 & 0x3F); 105 - s += b64Safe.charAt(c >> 12 & 0x3F); 106 - s += b64Safe.charAt(c >> 6 & 0x3F); 107 - s += b64Safe.charAt(c & 0x3F); 129 + s += b64.charAt(c >> 18 & 0x3F); 130 + s += b64.charAt(c >> 12 & 0x3F); 131 + s += b64.charAt(c >> 6 & 0x3F); 132 + s += b64.charAt(c & 0x3F); 108 133 } 109 134 if (extra > 0) { 110 135 c = this.get(i) << 16; 111 136 if (extra > 1) c |= this.get(i + 1) << 8; 112 - s += b64Safe.charAt(c >> 18 & 0x3F); 113 - s += b64Safe.charAt(c >> 12 & 0x3F); 114 - if (extra == 2) s += b64Safe.charAt(c >> 6 & 0x3F); 137 + s += b64.charAt(c >> 18 & 0x3F); 138 + s += b64.charAt(c >> 12 & 0x3F); 139 + if (extra == 2) s += b64.charAt(c >> 6 & 0x3F); 140 + if (b64 === b64Std) s += '==='.slice(0, 3 - extra); 115 141 } 116 142 return s; 117 143 } ··· 269 295 s = this.parseStringUTF(start, end, maxLength); 270 296 checkPrintable(s.str); 271 297 return { size: end - start, str: s.str }; 272 - } catch (e) { 298 + } catch (ignore) { 273 299 // ignore 274 300 } 275 301 maxLength /= 2; // we work in bytes ··· 277 303 end = start + maxLength; 278 304 s = ''; 279 305 for (let i = start; i < end; ++i) 280 - s += this.hexByte(this.get(i)); 306 + s += Stream.hexByte(this.get(i)); 281 307 if (len > maxLength) 282 308 s += ellipsis; 283 309 return { size: len, str: s }; ··· 435 461 } 436 462 switch (this.tag.tagNumber) { 437 463 case 0x01: // BOOLEAN 464 + if (len === 0) return 'invalid length 0'; 438 465 return (this.stream.get(content) === 0) ? 'false' : 'true'; 439 466 case 0x02: // INTEGER 467 + if (len === 0) return 'invalid length 0'; 440 468 return this.stream.parseInteger(content, content + len); 441 469 case 0x03: { // BIT_STRING 442 470 let d = recurse(this, 'parseBitString', maxLength); 443 471 return '(' + d.size + ' bit)\n' + d.str; 444 472 } 445 473 case 0x04: { // OCTET_STRING 474 + if (len === 0) return 'invalid length 0'; 446 475 let d = recurse(this, 'parseOctetString', maxLength); 447 476 return '(' + d.size + ' byte)\n' + d.str; 448 477 } ··· 535 564 toHexString(type = 'raw') { 536 565 return this.stream.hexDump(this.posStart(), this.posEnd(), type); 537 566 } 538 - /** Base64 dump of the node. */ 539 - toB64String() { 540 - return this.stream.b64Dump(this.posStart(), this.posEnd()); 567 + /** Base64url dump of the node (according to RFC 4648 section 5). 568 + * @param {string} type 'url' (default, section 5 without padding) or 'std' (section 4 with padding) 569 + */ 570 + toB64String(type = 'url') { 571 + return this.stream.b64Dump(this.posStart(), this.posEnd(), type); 541 572 } 542 573 static decodeLength(stream) { 543 574 let buf = stream.get(), ··· 610 641 throw new Error('Unable to parse content: ' + e); 611 642 } 612 643 } 613 - } catch (e) { 644 + } catch (ignore) { 614 645 // but silently ignore when they don't 615 646 sub = null; 616 647 //DEBUG console.log('Could not decode structure at ' + start + ':', e);
+8 -7
base64.js
··· 1 1 // Base64 JavaScript decoder 2 - // Copyright (c) 2008-2024 Lapo Luchini <lapo@lapo.it> 2 + // Copyright (c) 2008 Lapo Luchini <lapo@lapo.it> 3 3 4 4 // Permission to use, copy, modify, and/or distribute this software for any 5 5 // purpose with or without fee is hereby granted, provided that the above 6 6 // copyright notice and this permission notice appear in all copies. 7 - // 7 + // 8 8 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 9 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 10 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ··· 31 31 decoder[b64.charCodeAt(i)] = i; 32 32 for (i = 0; i < ignore.length; ++i) 33 33 decoder[ignore.charCodeAt(i)] = -1; 34 - // RFC 3548 URL & file safe encoding 34 + // also support decoding Base64url (RFC 4648 section 5) 35 35 decoder['-'.charCodeAt(0)] = decoder['+'.charCodeAt(0)]; 36 36 decoder['_'.charCodeAt(0)] = decoder['/'.charCodeAt(0)]; 37 37 } ··· 75 75 76 76 static pretty(str) { 77 77 // fix padding 78 - if (str.length % 4 > 0) 79 - str = (str + '===').slice(0, str.length + str.length % 4); 80 - // convert RFC 3548 to standard Base64 78 + let pad = 4 - str.length % 4; 79 + if (pad < 4) 80 + str += '==='.slice(0, pad); 81 + // convert Base64url (RFC 4648 section 5) to standard Base64 (RFC 4648 section 4) 81 82 str = str.replace(/-/g, '+').replace(/_/g, '/'); 82 83 // 80 column width 83 - return str.replace(/(.{80})/g, '$1\n'); 84 + return str.replace(/.{80}/g, '$&\n'); 84 85 } 85 86 86 87 static unarmor(a) {
+9 -16
context.js
··· 1 1 const 2 2 id = (elem) => document.getElementById(elem), 3 3 contextMenu = id('contextmenu'), 4 - btnHideTree = id('btnHideTree'), 5 4 btnCopyHex = id('btnCopyHex'), 6 5 btnCopyB64 = id('btnCopyB64'), 7 6 btnCopyTree = id('btnCopyTree'), ··· 11 10 const type = node.asn1.typeName(); 12 11 const valueEnabled = type != 'SET' && type != 'SEQUENCE'; 13 12 node.onclick = function (event) { 13 + // do not show the menu in case of clicking the icon 14 + if (event.srcElement.nodeName != 'SPAN') return; 14 15 contextMenu.style.left = event.pageX + 'px'; 15 16 contextMenu.style.top = event.pageY + 'px'; 16 17 contextMenu.style.visibility = 'visible'; 17 18 contextMenu.node = this; 18 - btnHideTree.innerText = (node.className == 'node') ? 'Hide subtree' : 'Show subtree'; 19 - btnHideTree.style.display = node.className.startsWith('node') ? 'block' : 'none'; 20 19 btnCopyValue.style.display = valueEnabled ? 'block' : 'none'; 20 + event.preventDefault(); 21 21 event.stopPropagation(); 22 22 }; 23 23 } 24 24 25 - function close() { 25 + function close(event) { 26 26 contextMenu.style.visibility = 'hidden'; 27 + event.stopPropagation(); 27 28 } 28 29 29 30 contextMenu.onmouseleave = close; 30 31 31 - btnHideTree.onclick = function (event) { 32 - event.stopPropagation(); 33 - const node = contextMenu.node; 34 - node.className = (node.className == 'node collapsed') ? 'node' : 'node collapsed'; 35 - close(); 36 - }; 37 - 38 32 btnCopyHex.onclick = function (event) { 39 - event.stopPropagation(); 40 33 navigator.clipboard.writeText(contextMenu.node.asn1.toHexString('byte')); 41 - close(); 34 + close(event); 42 35 }; 43 36 44 37 btnCopyB64.onclick = function (event) { 45 38 event.stopPropagation(); 46 39 navigator.clipboard.writeText(contextMenu.node.asn1.toB64String()); 47 - close(); 40 + close(event); 48 41 }; 49 42 50 43 btnCopyTree.onclick = function (event) { 51 44 event.stopPropagation(); 52 45 navigator.clipboard.writeText(contextMenu.node.asn1.toPrettyString()); 53 - close(); 46 + close(event); 54 47 }; 55 48 56 49 btnCopyValue.onclick = function (event) { 57 50 event.stopPropagation(); 58 51 navigator.clipboard.writeText(contextMenu.node.asn1.content()); 59 - close(); 52 + close(event); 60 53 };
+15 -10
defs.js
··· 1 1 // ASN.1 RFC definitions matcher 2 - // Copyright (c) 2023-2024 Lapo Luchini <lapo@lapo.it> 2 + // Copyright (c) 2023 Lapo Luchini <lapo@lapo.it> 3 3 4 4 // Permission to use, copy, modify, and/or distribute this software for any 5 5 // purpose with or without fee is hereby granted, provided that the above 6 6 // copyright notice and this permission notice appear in all copies. 7 - // 7 + // 8 8 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 9 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 10 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ··· 23 23 try { 24 24 // hope current OIDs contain the type name (will need to parse from RFC itself) 25 25 def = Defs.searchType(firstUpper(stats.defs[def.definedBy][1])); 26 - } catch (e) { /*ignore*/ } 26 + } catch (ignore) { /*ignore*/ } 27 27 while (def?.type == 'defined' || def?.type?.type == 'defined') { 28 28 const name = def?.type?.type ? def.type.name : def.name; 29 29 def = Object.assign({}, def); 30 30 def.type = Defs.searchType(name).type; 31 31 } 32 - if (def?.type?.name == 'CHOICE') { 33 - for (let c of def.type.content) { 32 + if (def?.name == 'CHOICE' || def?.type?.name == 'CHOICE') { 33 + for (let c of def.content ?? def.type.content) { 34 34 if (tn != c.type.name && tn != c.name) 35 35 c = translate(c); 36 36 if (tn == c.type.name || tn == c.name) { 37 37 def = Object.assign({}, def); 38 + if (c.id) // show the CHOICE id, but add it to existing one if present 39 + def.id = def.id ? def.id + ' ' + c.id : c.id; 38 40 def.type = c.type.name ? c.type : c; 39 41 break; 40 42 } ··· 68 70 69 71 static match(value, def, stats = { total: 0, recognized: 0, defs: {} }) { 70 72 value.def = {}; 71 - let tn = value.typeName().replaceAll('_', ' '); 73 + let tn = value.typeName().replace(/_/g, ' '); 72 74 def = translate(def, tn, stats); 73 75 ++stats.total; 74 76 if (def?.type) { ··· 89 91 if (def.typeOf) 90 92 type = def.content[0]; 91 93 else { 92 - let tn = subval.typeName().replaceAll('_', ' '); 94 + let tn = subval.typeName().replace(/_/g, ' '); 93 95 for (;;) { 94 96 type = def.content[j++]; 95 97 if (!type || typeof type != 'object') break; 96 98 if (type?.type?.type) 97 - type = type.type; 99 + // type = type.type; 100 + type = Object.assign({}, type.type, {id: type.id}); 98 101 if (type.type == 'defined') { 99 102 let t2 = translate(type, tn); 100 103 if (t2.type.name == tn) break; // exact match ··· 112 115 } else if (type?.definedBy && stats.defs?.[type.definedBy]?.[1]) { // hope current OIDs contain the type name (will need to parse from RFC itself) 113 116 try { 114 117 type = Defs.searchType(firstUpper(stats.defs[type.definedBy][1])); 115 - } catch (e) { /*ignore*/ } 118 + } catch (ignore) { /*ignore*/ } 116 119 } 117 120 } 118 121 } ··· 127 130 Defs.RFC = rfcdef; 128 131 129 132 Defs.commonTypes = [ 130 - [ 'X.509 certificate', '1.3.6.1.5.5.7.0.18', 'Certificate' ], 133 + [ 'X.509 certificate', '1.3.6.1.5.5.7.0.18', 'Certificate' ], 131 134 [ 'X.509 public key info', '1.3.6.1.5.5.7.0.18', 'SubjectPublicKeyInfo' ], 135 + [ 'X.509 certificate revocation list', '1.3.6.1.5.5.7.0.18', 'CertificateList' ], 132 136 [ 'CMS / PKCS#7 envelope', '1.2.840.113549.1.9.16.0.14', 'ContentInfo' ], 133 137 [ 'PKCS#1 RSA private key', '1.2.840.113549.1.1.0.1', 'RSAPrivateKey' ], 134 138 [ 'PKCS#8 encrypted private key', '1.2.840.113549.1.8.1.1', 'EncryptedPrivateKeyInfo' ], 135 139 [ 'PKCS#8 private key', '1.2.840.113549.1.8.1.1', 'PrivateKeyInfo' ], 136 140 [ 'PKCS#10 certification request', '1.2.840.113549.1.10.1.1', 'CertificationRequest' ], 137 141 [ 'CMP PKI Message', '1.3.6.1.5.5.7.0.16', 'PKIMessage' ], 142 + [ 'LDAP Message', '1.3.6.1.1.18', 'LDAPMessage' ], 138 143 ].map(arr => ({ description: arr[0], ...Defs.moduleAndType(rfcdef[arr[1]], arr[2]) }));
+27 -11
dom.js
··· 1 1 // ASN.1 JavaScript decoder 2 - // Copyright (c) 2008-2024 Lapo Luchini <lapo@lapo.it> 2 + // Copyright (c) 2008 Lapo Luchini <lapo@lapo.it> 3 3 4 4 // Permission to use, copy, modify, and/or distribute this software for any 5 5 // purpose with or without fee is hereby granted, provided that the above 6 6 // copyright notice and this permission notice appear in all copies. 7 - // 7 + // 8 8 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 9 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 10 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ··· 24 24 ellipsis: '\u2026', 25 25 tag: function (tagName, className, text) { 26 26 let t = document.createElement(tagName); 27 - t.className = className; 27 + if (className) t.className = className; 28 28 if (text) t.innerText = text; 29 29 return t; 30 30 }, ··· 56 56 toDOM(spaces) { 57 57 spaces = spaces || ''; 58 58 let isOID = (typeof oids === 'object') && (this.tag.isUniversal() && (this.tag.tagNumber == 0x06) || (this.tag.tagNumber == 0x0D)); 59 - let node = DOM.tag('div', 'node'); 59 + let node = DOM.tag('li'); 60 60 node.asn1 = this; 61 61 let head = DOM.tag('span', 'head'); 62 - head.appendChild(DOM.tag('span', 'spaces', spaces)); 63 62 const typeName = this.typeName().replace(/_/g, ' '); 64 63 if (this.def) { 65 64 if (this.def.id) { ··· 111 110 content = content.replace(/</g, '&lt;'); 112 111 content = content.replace(/\n/g, '<br>'); 113 112 } 114 - node.appendChild(head); 115 - this.node = node; 113 + // add the li and details section for this node 114 + let contentNode; 115 + let childNode; 116 + if (this.sub !== null) { 117 + let details = DOM.tag('details'); 118 + details.setAttribute('open', ''); 119 + node.appendChild(details); 120 + let summary = DOM.tag('summary', 'node'); 121 + details.appendChild(summary); 122 + summary.appendChild(head); 123 + contentNode = summary; 124 + childNode = details; 125 + } else { 126 + contentNode = node; 127 + contentNode.classList.add('node'); 128 + contentNode.appendChild(head); 129 + } 130 + this.node = contentNode; 116 131 this.head = head; 117 132 let value = DOM.tag('div', 'value'); 118 133 let s = 'Offset: ' + this.stream.pos + '<br>'; ··· 135 150 } 136 151 } 137 152 value.innerHTML = s; 138 - node.appendChild(value); 139 - let sub = DOM.tag('div', 'sub'); 153 + contentNode.appendChild(value); 140 154 if (this.sub !== null) { 155 + let sub = DOM.tag('ul'); 156 + childNode.appendChild(sub); 141 157 spaces += '\xA0 '; 142 158 for (let i = 0, max = this.sub.length; i < max; ++i) 143 159 sub.appendChild(this.sub[i].toDOM(spaces)); 144 160 } 145 - node.appendChild(sub); 146 161 bindContextMenu(node); 147 162 return node; 148 163 } ··· 169 184 this.head.onmouseover = function () { this.hexNode.className = 'hexCurrent'; }; 170 185 this.head.onmouseout = function () { this.hexNode.className = 'hex'; }; 171 186 node.asn1 = this; 172 - node.onmouseover = function () { 187 + node.onmouseover = function (event) { 173 188 let current = !root.selected; 174 189 if (current) { 175 190 root.selected = this.asn1; 176 191 this.className = 'hexCurrent'; 177 192 } 178 193 this.asn1.fakeHover(current); 194 + event.stopPropagation(); 179 195 }; 180 196 node.onmouseout = function () { 181 197 let current = (root.selected == this.asn1);
+5 -1
dumpASN1.js
··· 1 1 #!/usr/bin/env node 2 2 3 + // usage: 4 + // ./dumpASN1.js filename 5 + // ./dumpASN1.js data:base64,MDMCAQFjLgQACgEACgEAAgEAAgEAAQEAoA+jDQQFTnRWZXIEBAEAAAAwCgQITmV0bG9nb24=== 6 + 3 7 import * as fs from 'node:fs'; 4 8 import { Base64 } from './base64.js'; 5 9 import { ASN1 } from './asn1.js'; ··· 48 52 : fs.readFileSync(filename); 49 53 try { // try PEM first 50 54 content = Base64.unarmor(content); 51 - } catch (e) { // try DER/BER then 55 + } catch (ignore) { // try DER/BER then 52 56 } 53 57 let result = ASN1.decode(content); 54 58 content = null;
+69
eslint.config.js
··· 1 + import globals from 'globals'; 2 + import js from '@eslint/js'; 3 + 4 + export default [ 5 + js.configs.recommended, 6 + { 7 + languageOptions: { 8 + globals: { 9 + ...globals.browser, 10 + ...globals.node, 11 + Uint8Array: 'readonly', 12 + }, 13 + ecmaVersion: 2015, 14 + }, 15 + rules: { 16 + indent: ['error', 4], 17 + 'no-trailing-spaces': ['error'], 18 + 'linebreak-style': ['error', 'unix'], 19 + 'eol-last': ['error', 'always'], 20 + semi: ['warn', 'always'], 21 + quotes: [ 'error', 'single', { 22 + avoidEscape: true, 23 + }], 24 + 'no-var': ['warn'], 25 + 'comma-dangle': ['error', 'always-multiline'], 26 + 'no-unused-vars': ['error', { 27 + caughtErrorsIgnorePattern: 'ignore', 28 + }], 29 + }, 30 + }, 31 + { 32 + files: ['defs.js'], 33 + languageOptions: { 34 + ecmaVersion: 2020, // by use of optional chaining operator (?.) and null coalesching operator (??) 35 + }, 36 + }, 37 + { 38 + files: ['oids.js'], 39 + rules: { 40 + indent: 'off', 41 + quotes: ['warn', 'double'], 42 + }, 43 + }, 44 + { 45 + files: ['tags.js', 'rfcdef.js'], 46 + rules: { 47 + indent: [ 48 + 'error', 49 + 2, 50 + { 51 + ignoredNodes: [ 52 + "Program > ExpressionStatement > CallExpression > FunctionExpression > BlockStatement > ExpressionStatement[directive='use strict']:first-child", 53 + ], 54 + }, 55 + ], 56 + 'comma-dangle': 'off', 57 + quotes: ['warn', 'double'], 58 + }, 59 + }, 60 + { 61 + files: ['test.js', 'parseRFC.js', 'dumpASN1.js', 'testDefs.js', 'eslint.config.js'], 62 + languageOptions: { 63 + ecmaVersion: 'latest', 64 + }, 65 + rules: { 66 + strict: ['error', 'global'], 67 + }, 68 + }, 69 + ];
+12
examples/crl-rfc5280.b64
··· 1 + CRL example from RFC5280 as found here: 2 + https://csrc.nist.gov/projects/pki-testing/sample-certificates-and-crls 3 + 4 + begin-base64 644 crl-rfc5280.der 5 + MIIBYDCBygIBATANBgkqhkiG9w0BAQUFADBDMRMwEQYKCZImiZPyLGQBGRYDY29tMRcwFQYKCZIm 6 + iZPyLGQBGRYHZXhhbXBsZTETMBEGA1UEAxMKRXhhbXBsZSBDQRcNMDUwMjA1MTIwMDAwWhcNMDUw 7 + MjA2MTIwMDAwWjAiMCACARIXDTA0MTExOTE1NTcwM1owDDAKBgNVHRUEAwoBAaAvMC0wHwYDVR0j 8 + BBgwFoAUCGivhTPIOUp6+IKTjnBqSiCELDIwCgYDVR0UBAMCAQwwDQYJKoZIhvcNAQEFBQADgYEA 9 + ItwYffcIzsx10NBqm60Q9HYjtIFutW2+DvsVFGzIF20f7pAXom9g5L2qjFXejoRvkvifEBInr0rU 10 + L4XiNkR9qqNMJTgV/wD9Pn7uPSYS69jnK2LiK8NGgO94gtEVxtCccmrLznrtZ5mLbnCBfUNCdMGm 11 + r8FVF6IzTNYGmCuk/C4= 12 + ====
+45
examples/crl-rfc5280.b64.dump
··· 1 + CertificateList SEQUENCE @0+352 (constructed): (3 elem) 2 + tbsCertList TBSCertList SEQUENCE @4+202 (constructed): (7 elem) 3 + version Version INTEGER @7+1: 1 4 + signature AlgorithmIdentifier SEQUENCE @10+13 (constructed): (2 elem) 5 + algorithm OBJECT_IDENTIFIER @12+9: 1.2.840.113549.1.1.5|sha1WithRSAEncryption|PKCS #1 6 + parameters ANY NULL @23+0 7 + issuer rdnSequence Name SEQUENCE @25+67 (constructed): (3 elem) 8 + RelativeDistinguishedName SET @27+19 (constructed): (1 elem) 9 + AttributeTypeAndValue SEQUENCE @29+17 (constructed): (2 elem) 10 + type AttributeType OBJECT_IDENTIFIER @31+10: 0.9.2342.19200300.100.1.25|domainComponent|Men are from Mars, this OID is from Pluto 11 + value AttributeValue [?] IA5String @43+3: com 12 + RelativeDistinguishedName SET @48+23 (constructed): (1 elem) 13 + AttributeTypeAndValue SEQUENCE @50+21 (constructed): (2 elem) 14 + type AttributeType OBJECT_IDENTIFIER @52+10: 0.9.2342.19200300.100.1.25|domainComponent|Men are from Mars, this OID is from Pluto 15 + value AttributeValue [?] IA5String @64+7: example 16 + RelativeDistinguishedName SET @73+19 (constructed): (1 elem) 17 + AttributeTypeAndValue SEQUENCE @75+17 (constructed): (2 elem) 18 + type AttributeType OBJECT_IDENTIFIER @77+3: 2.5.4.3|commonName|X.520 DN component 19 + value AttributeValue [?] PrintableString @82+10: Example CA 20 + thisUpdate utcTime Time UTCTime @94+13: 2005-02-05 12:00:00 UTC 21 + nextUpdate utcTime Time UTCTime @109+13: 2005-02-06 12:00:00 UTC 22 + revokedCertificates SEQUENCE @124+34 (constructed): (1 elem) 23 + SEQUENCE @126+32 (constructed): (3 elem) 24 + userCertificate CertificateSerialNumber INTEGER @128+1: 18 25 + revocationDate utcTime Time UTCTime @131+13: 2004-11-19 15:57:03 UTC 26 + crlEntryExtensions Extensions SEQUENCE @146+12 (constructed): (1 elem) 27 + Extension SEQUENCE @148+10 (constructed): (2 elem) 28 + extnID OBJECT_IDENTIFIER @150+3: 2.5.29.21|cRLReason|X.509 extension 29 + extnValue OCTET_STRING @155+3 (encapsulates): (3 byte)|0A0101 30 + ENUMERATED @157+1: 1 31 + crlExtensions [0] @160+47 (constructed): (1 elem) 32 + Extensions SEQUENCE @162+45 (constructed): (2 elem) 33 + Extension SEQUENCE @164+31 (constructed): (2 elem) 34 + extnID OBJECT_IDENTIFIER @166+3: 2.5.29.35|authorityKeyIdentifier|X.509 extension 35 + extnValue OCTET_STRING @171+24 (encapsulates): (24 byte)|301680140868AF8533C8394A7AF882938E706A4A20842C32 36 + SEQUENCE @173+22 (constructed): (1 elem) 37 + [0] @175+20: (20 byte)|0868AF8533C8394A7AF882938E706A4A20842C32 38 + Extension SEQUENCE @197+10 (constructed): (2 elem) 39 + extnID OBJECT_IDENTIFIER @199+3: 2.5.29.20|cRLNumber|X.509 extension 40 + extnValue OCTET_STRING @204+3 (encapsulates): (3 byte)|02010C 41 + INTEGER @206+1: 12 42 + signatureAlgorithm AlgorithmIdentifier SEQUENCE @209+13 (constructed): (2 elem) 43 + algorithm OBJECT_IDENTIFIER @211+9: 1.2.840.113549.1.1.5|sha1WithRSAEncryption|PKCS #1 44 + parameters ANY NULL @222+0 45 + signature BIT_STRING @224+129: (1024 bit)|0010001011011100000110000111110111110111000010001100111011001100011101011101000011010000011010101001101110101101000100001111010001110110001000111011010010000001011011101011010101101101101111100000111011111011000101010001010001101100110010000001011101101101000111111110111010010000000101111010001001101111011000001110010010111101101010101000110001010101110111101000111010000100011011111001001011111000100111110001000000010010001001111010111101001010110101000010111110000101111000100011011001000100011111011010101010100011010011000010010100111000000101011111111100000000111111010011111001111110111011100011110100100110000100101110101111011000111001110010101101100010111000100010101111000011010001101000000011101111011110001000001011010001000101011100011011010000100111000111001001101010110010111100111001111010111011010110011110011001100010110110111001110000100000010111110101000011010000100111010011000001101001101010111111000001010101010001011110100010001100110100110011010110000001101001100000101011101001001111110000101110
+60
examples/ed25519.cer.dump
··· 1 + Certificate SEQUENCE @0+383 (constructed): (3 elem) 2 + tbsCertificate TBSCertificate SEQUENCE @4+305 (constructed): (8 elem) 3 + version [0] @8+3 (constructed): (1 elem) 4 + Version INTEGER @10+1: 2 5 + serialNumber CertificateSerialNumber INTEGER @13+20: (159 bit)|711090297755414526861352146244170174161660335942 6 + signature AlgorithmIdentifier SEQUENCE @35+5 (constructed): (1 elem) 7 + algorithm OBJECT_IDENTIFIER @37+3: 1.3.101.112|curveEd25519|EdDSA 25519 signature algorithm 8 + issuer rdnSequence Name SEQUENCE @42+53 (constructed): (3 elem) 9 + RelativeDistinguishedName SET @44+11 (constructed): (1 elem) 10 + AttributeTypeAndValue SEQUENCE @46+9 (constructed): (2 elem) 11 + type AttributeType OBJECT_IDENTIFIER @48+3: 2.5.4.6|countryName|X.520 DN component 12 + value AttributeValue [?] PrintableString @53+2: IT 13 + RelativeDistinguishedName SET @57+15 (constructed): (1 elem) 14 + AttributeTypeAndValue SEQUENCE @59+13 (constructed): (2 elem) 15 + type AttributeType OBJECT_IDENTIFIER @61+3: 2.5.4.7|localityName|X.520 DN component 16 + value AttributeValue [?] UTF8String @66+6: Milano 17 + RelativeDistinguishedName SET @74+21 (constructed): (1 elem) 18 + AttributeTypeAndValue SEQUENCE @76+19 (constructed): (2 elem) 19 + type AttributeType OBJECT_IDENTIFIER @78+3: 2.5.4.3|commonName|X.520 DN component 20 + value AttributeValue [?] UTF8String @83+12: Test ed25519 21 + validity Validity SEQUENCE @97+30 (constructed): (2 elem) 22 + notBefore utcTime Time UTCTime @99+13: 2020-09-02 13:25:26 UTC 23 + notAfter utcTime Time UTCTime @114+13: 2030-09-02 13:25:26 UTC 24 + subject rdnSequence Name SEQUENCE @129+53 (constructed): (3 elem) 25 + RelativeDistinguishedName SET @131+11 (constructed): (1 elem) 26 + AttributeTypeAndValue SEQUENCE @133+9 (constructed): (2 elem) 27 + type AttributeType OBJECT_IDENTIFIER @135+3: 2.5.4.6|countryName|X.520 DN component 28 + value AttributeValue [?] PrintableString @140+2: IT 29 + RelativeDistinguishedName SET @144+15 (constructed): (1 elem) 30 + AttributeTypeAndValue SEQUENCE @146+13 (constructed): (2 elem) 31 + type AttributeType OBJECT_IDENTIFIER @148+3: 2.5.4.7|localityName|X.520 DN component 32 + value AttributeValue [?] UTF8String @153+6: Milano 33 + RelativeDistinguishedName SET @161+21 (constructed): (1 elem) 34 + AttributeTypeAndValue SEQUENCE @163+19 (constructed): (2 elem) 35 + type AttributeType OBJECT_IDENTIFIER @165+3: 2.5.4.3|commonName|X.520 DN component 36 + value AttributeValue [?] UTF8String @170+12: Test ed25519 37 + subjectPublicKeyInfo SubjectPublicKeyInfo SEQUENCE @184+42 (constructed): (2 elem) 38 + algorithm AlgorithmIdentifier SEQUENCE @186+5 (constructed): (1 elem) 39 + algorithm OBJECT_IDENTIFIER @188+3: 1.3.101.112|curveEd25519|EdDSA 25519 signature algorithm 40 + subjectPublicKey BIT_STRING @193+33: (256 bit)|0011101110101001001011111111110111001011000101110110011011011110010000001010001010010010111101111001001111011110001100001111100000001010001000111010100000110001001000010101110111010000000001111101100001100011001001000010111011111111011010000010000110000101 41 + extensions [3] @228+83 (constructed): (1 elem) 42 + Extensions SEQUENCE @230+81 (constructed): (3 elem) 43 + Extension SEQUENCE @232+29 (constructed): (2 elem) 44 + extnID OBJECT_IDENTIFIER @234+3: 2.5.29.14|subjectKeyIdentifier|X.509 extension 45 + extnValue OCTET_STRING @239+22 (encapsulates): (22 byte)|04146BA5BDCF9DFA235978126417AE1E72D89A804AE8 46 + OCTET_STRING @241+20: (20 byte)|6BA5BDCF9DFA235978126417AE1E72D89A804AE8 47 + Extension SEQUENCE @263+31 (constructed): (2 elem) 48 + extnID OBJECT_IDENTIFIER @265+3: 2.5.29.35|authorityKeyIdentifier|X.509 extension 49 + extnValue OCTET_STRING @270+24 (encapsulates): (24 byte)|301680146BA5BDCF9DFA235978126417AE1E72D89A804AE8 50 + SEQUENCE @272+22 (constructed): (1 elem) 51 + [0] @274+20: (20 byte)|6BA5BDCF9DFA235978126417AE1E72D89A804AE8 52 + Extension SEQUENCE @296+15 (constructed): (3 elem) 53 + extnID OBJECT_IDENTIFIER @298+3: 2.5.29.19|basicConstraints|X.509 extension 54 + critical BOOLEAN @303+1: true 55 + extnValue OCTET_STRING @306+5 (encapsulates): (5 byte)|30030101FF 56 + SEQUENCE @308+3 (constructed): (1 elem) 57 + BOOLEAN @310+1: true 58 + signatureAlgorithm AlgorithmIdentifier SEQUENCE @313+5 (constructed): (1 elem) 59 + algorithm OBJECT_IDENTIFIER @315+3: 1.3.101.112|curveEd25519|EdDSA 25519 signature algorithm 60 + signature BIT_STRING @320+65: (512 bit)|01101111011100110111011110111110001010001001011001011010001100110011011011010111111001010011010011111101100100001111001111111101010000000111111100011111000000101111100100000000010101111111001000010110000011110001011001101011000001001011111101100101100001001011011010011000110100101101000011010010101111110100110011010110011011110000111010110110111000101110100010011101000001001010001111100000100110010101000011111001110000100110110111011110011100111010110100011101001101010101011110000101011001011000011000000110
+8
examples/ldapmessage.b64
··· 1 + LDAPMessage example as found on ldap.com. 2 + 3 + Original link: 4 + https://ldap.com/ldapv3-wire-protocol-reference-ldap-message/ 5 + 6 + begin-base64 644 ldapmessage.der 7 + MDUCAQVKEWRjPWV4YW1wbGUsZGM9Y29toB0wGwQWMS4yLjg0MC4xMTM1NTYuMS40LjgwNQEB/w== 8 + ====
+7
examples/ldapmessage.b64.dump
··· 1 + LDAPMessage SEQUENCE @0+53 (constructed): (3 elem) 2 + messageID MessageID INTEGER @2+1: 5 3 + protocolOp delRequest CHOICE Application_10 @5+17: (17 byte)|dc=example,dc=com 4 + Controls [?] [0] @24+29 (constructed): (1 elem) 5 + AttributeTypeAndValue SEQUENCE @26+27 (constructed): (2 elem) 6 + type AttributeType [?] OCTET_STRING @28+22: (22 byte)|1.2.840.113556.1.4.805 7 + value AttributeValue [?] BOOLEAN @52+1: true
+10
examples/pkcs1.pem.dump
··· 1 + RSAPrivateKey SEQUENCE @0+605 (constructed): (9 elem) 2 + version Version INTEGER @4+1: 0 3 + modulus INTEGER @7+129: (1024 bit)|117127183230921204401013393277767517103803021018182691416238029726599496957198017684901559383009459523071384847726671610377559004781710040051270748910270447756432733966622455162759462672603884318432883204215291756888413811504344870556870978773843838353155520698675084344179957236491745093327422201227604749459 4 + publicExponent INTEGER @139+3: 65537 5 + privateExponent INTEGER @144+129: (1024 bit)|92276282475226568589241550905865273709561889943250510752753436239739158443231274686159532997597455087892667385718350070754140814118578097684166368734227728473322161416664690885212698653195373932779792506838124961141214987311742627151011567342689730655630521241854903774681567286735997541758916977964830429313 6 + prime1 INTEGER @276+65: (512 bit)|10896821561662485361386011233938116142526936125648167362054539174681694465821232677159478832161550957167298418313068706031799276527005193877616679381489381 7 + prime2 INTEGER @343+65: (512 bit)|10748747473575365133625210720374663113238804836624829882840358384492696273600075746246298849279878235356215808273663889910189484797595139778277124898735639 8 + exponent1 INTEGER @410+64: (511 bit)|6091625365131581796315047890165719534213640521161662994088715561328917102465668272778610952193459304175325574129665657306361751287362700277617869028176853 9 + exponent2 INTEGER @476+65: (512 bit)|9619864112105977791898517014707043200694399482542575521432448550956476604540013165392532656448448632323473488540572223305800601817570919153380021725291669 10 + coefficient INTEGER @543+64: (511 bit)|4162468593383244686217782691133418477400302049612992866028022118893358867845916127581019785866484075341057799618361552573853678007698434146811407259880551
+16
examples/pkcs8-rsa.pem.dump
··· 1 + PrivateKeyInfo SEQUENCE @0+631 (constructed): (3 elem) 2 + version Version INTEGER @4+1: 0 3 + privateKeyAlgorithm AlgorithmIdentifier SEQUENCE @7+13 (constructed): (2 elem) 4 + algorithm OBJECT_IDENTIFIER @9+9: 1.2.840.113549.1.1.1|rsaEncryption|PKCS #1 5 + parameters ANY NULL @20+0 6 + privateKey PrivateKey OCTET_STRING @22+609 (encapsulates): (609 byte)|3082025D02010002818100A6CB6DE27CDF698B92CEE0C4772D4854D2FF8B666BFBF07FA377E47A90571665FD6A5B8C9F2930E4AF28E32E522162AC66CD70AA1B26888E3EEE268A2B59FECA7E4C693AE26B878B3027F5868429FD8BEBE85BFED3B0E5DF0E9D72AAB1216902B074FA2DD59001EFC4CDB1E7305FF48E0D310C0A4F798EFC758F9703C4F96C930203010001028181008367E1BA7E06C57060C8FBEBCCB8B033A3C8105B30D7DC31B2E7D1E97DAE1EC75B4F5FB0F9F3C9C160FE257D68D74495EEA80C0AF838F37C9DB7A24558C21E28C49D57470B002D90A383CAEBB5821A59583D15502F0012C9235F806C62C97F1E3CAFBC72118FCF60743168125801E06CC7293CDE64D241339AAD516E7BCC1081024100D00E8DE65F7C32094B732A5628CEFEDC35ED796B7CEA6297614545DF71D8DBC67EA14565534BFC9BC5F1A680239227189C2D493924A5BD64641169533201D6E5024100CD3AC881CC47AA776A9829C0E529E3D0DBB5A43C366842578341A051DAFAF4F6164F2DC0E72A3BD3B33F8B2F84A6CF35F0781E7C466E677FF8E553DE5C92C6170240744F3E9A83D4AD302F02B1AF3ADF04F0DC20E698E55B2E448C372AA9903E78164E221FE6561B8B9B159C52C51D9D8DC79F3F5DC8D928E268A5DC69F1FD69B3D5024100B7ACEA92B05F5B8370D52A5947400C727A90C0A25B174878C6324FE7B29273F662D50E5FDD04017360B3784058FA69ED1E8082D83AB8C8CCD1D77D0E3FCFE49502404F79B900CE9185833573BBA54E1B1D157EDFE8C37FC328D2520CCE7CC804A9A28B58D937626EBAD5FDE96534BBEE4E292EE8010CFFC8DB1E546C99FC517B4C67 7 + SEQUENCE @26+605 (constructed): (9 elem) 8 + INTEGER @30+1: 0 9 + INTEGER @33+129: (1024 bit)|117127183230921204401013393277767517103803021018182691416238029726599496957198017684901559383009459523071384847726671610377559004781710040051270748910270447756432733966622455162759462672603884318432883204215291756888413811504344870556870978773843838353155520698675084344179957236491745093327422201227604749459 10 + INTEGER @165+3: 65537 11 + INTEGER @170+129: (1024 bit)|92276282475226568589241550905865273709561889943250510752753436239739158443231274686159532997597455087892667385718350070754140814118578097684166368734227728473322161416664690885212698653195373932779792506838124961141214987311742627151011567342689730655630521241854903774681567286735997541758916977964830429313 12 + INTEGER @302+65: (512 bit)|10896821561662485361386011233938116142526936125648167362054539174681694465821232677159478832161550957167298418313068706031799276527005193877616679381489381 13 + INTEGER @369+65: (512 bit)|10748747473575365133625210720374663113238804836624829882840358384492696273600075746246298849279878235356215808273663889910189484797595139778277124898735639 14 + INTEGER @436+64: (511 bit)|6091625365131581796315047890165719534213640521161662994088715561328917102465668272778610952193459304175325574129665657306361751287362700277617869028176853 15 + INTEGER @502+65: (512 bit)|9619864112105977791898517014707043200694399482542575521432448550956476604540013165392532656448448632323473488540572223305800601817570919153380021725291669 16 + INTEGER @569+64: (511 bit)|4162468593383244686217782691133418477400302049612992866028022118893358867845916127581019785866484075341057799618361552573853678007698434146811407259880551
+118
examples/sig-p256-der.p7m.dump
··· 1 + ContentInfo SEQUENCE @0+10868 (constructed): (2 elem) 2 + contentType ContentType OBJECT_IDENTIFIER @4+9: 1.2.840.113549.1.7.2|signedData|PKCS #7 3 + content [0] @15+10853 (constructed): (1 elem) 4 + SignedData SEQUENCE @19+10849 (constructed): (5 elem) 5 + version CMSVersion INTEGER @23+1: 1 6 + digestAlgorithms DigestAlgorithmIdentifiers SET @26+15 (constructed): (1 elem) 7 + DigestAlgorithmIdentifier SEQUENCE @28+13 (constructed): (2 elem) 8 + algorithm OBJECT_IDENTIFIER @30+9: 2.16.840.1.101.3.4.2.1|sha-256|NIST Algorithm 9 + parameters ANY NULL @41+0 10 + encapContentInfo EncapsulatedContentInfo SEQUENCE @43+10053 (constructed): (2 elem) 11 + eContentType ContentType OBJECT_IDENTIFIER @47+9: 1.2.840.113549.1.7.1|data|PKCS #7 12 + eContent [0] @58+10038 (constructed): (1 elem) 13 + OCTET_STRING @62+10034: (10034 byte)|Inizio contenuto.|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|Fine contenuto. 14 + CertificateSet [?] [0] @10100+370 (constructed): (1 elem) 15 + certificate CertificateChoices SEQUENCE @10104+366 (constructed): (3 elem) 16 + tbsCertificate TBSCertificate SEQUENCE @10108+276 (constructed): (8 elem) 17 + version [0] @10112+3 (constructed): (1 elem) 18 + Version INTEGER @10114+1: 2 19 + serialNumber CertificateSerialNumber INTEGER @10117+16: (127 bit)|128087855099855233032551836648087377254 20 + signature AlgorithmIdentifier SEQUENCE @10135+10 (constructed): (1 elem) 21 + algorithm OBJECT_IDENTIFIER @10137+8: 1.2.840.10045.4.3.2|ecdsaWithSHA256|ANSI X9.62 ECDSA algorithm with SHA256 22 + issuer rdnSequence Name SEQUENCE @10147+15 (constructed): (1 elem) 23 + RelativeDistinguishedName SET @10149+13 (constructed): (1 elem) 24 + AttributeTypeAndValue SEQUENCE @10151+11 (constructed): (2 elem) 25 + type AttributeType OBJECT_IDENTIFIER @10153+3: 2.5.4.3|commonName|X.520 DN component 26 + value AttributeValue [?] UTF8String @10158+4: Test 27 + validity Validity SEQUENCE @10164+30 (constructed): (2 elem) 28 + notBefore utcTime Time UTCTime @10166+13: 2018-07-16 14:56:35 UTC 29 + notAfter utcTime Time UTCTime @10181+13: 2019-07-16 14:56:35 UTC 30 + subject rdnSequence Name SEQUENCE @10196+15 (constructed): (1 elem) 31 + RelativeDistinguishedName SET @10198+13 (constructed): (1 elem) 32 + AttributeTypeAndValue SEQUENCE @10200+11 (constructed): (2 elem) 33 + type AttributeType OBJECT_IDENTIFIER @10202+3: 2.5.4.3|commonName|X.520 DN component 34 + value AttributeValue [?] UTF8String @10207+4: Test 35 + subjectPublicKeyInfo SubjectPublicKeyInfo SEQUENCE @10213+89 (constructed): (2 elem) 36 + algorithm AlgorithmIdentifier SEQUENCE @10215+19 (constructed): (2 elem) 37 + algorithm OBJECT_IDENTIFIER @10217+7: 1.2.840.10045.2.1|ecPublicKey|ANSI X9.62 public key type 38 + parameters ANY OBJECT_IDENTIFIER @10226+8: 1.2.840.10045.3.1.7|prime256v1|ANSI X9.62 named elliptic curve 39 + subjectPublicKey BIT_STRING @10236+66: (520 bit)|0000010000100100010011001011011011001100000111000110100100100001111111110100100111011000101111100010011000111110000010110111110011010000010110100010100001100101010110101000010001101100100000100101111011001010111001101110110011100110100110100110101000100001110001001110010011110010001000000010010011000000111010011111010011100100011101001001110010011000101000011010110111110010010111111001000011011110011011101111100101001000001010110110011100011000100000111010011100001110101101001011011110101011100111110000011001000011 40 + extensions [3] @10304+82 (constructed): (1 elem) 41 + Extensions SEQUENCE @10306+80 (constructed): (3 elem) 42 + Extension SEQUENCE @10308+14 (constructed): (3 elem) 43 + extnID OBJECT_IDENTIFIER @10310+3: 2.5.29.15|keyUsage|X.509 extension 44 + critical BOOLEAN @10315+1: true 45 + extnValue OCTET_STRING @10318+4 (encapsulates): (4 byte)|030204F0 46 + BIT_STRING @10320+2: (4 bit)|1111 47 + Extension SEQUENCE @10324+29 (constructed): (2 elem) 48 + extnID OBJECT_IDENTIFIER @10326+3: 2.5.29.14|subjectKeyIdentifier|X.509 extension 49 + extnValue OCTET_STRING @10331+22 (encapsulates): (22 byte)|0414C3C084DF7B040DB038AF518CE397F6EC20D626E6 50 + OCTET_STRING @10333+20: (20 byte)|C3C084DF7B040DB038AF518CE397F6EC20D626E6 51 + Extension SEQUENCE @10355+31 (constructed): (2 elem) 52 + extnID OBJECT_IDENTIFIER @10357+3: 2.5.29.35|authorityKeyIdentifier|X.509 extension 53 + extnValue OCTET_STRING @10362+24 (encapsulates): (24 byte)|30168014C3C084DF7B040DB038AF518CE397F6EC20D626E6 54 + SEQUENCE @10364+22 (constructed): (1 elem) 55 + [0] @10366+20: (20 byte)|C3C084DF7B040DB038AF518CE397F6EC20D626E6 56 + signatureAlgorithm AlgorithmIdentifier SEQUENCE @10388+10 (constructed): (1 elem) 57 + algorithm OBJECT_IDENTIFIER @10390+8: 1.2.840.10045.4.3.2|ecdsaWithSHA256|ANSI X9.62 ECDSA algorithm with SHA256 58 + signature BIT_STRING @10400+72 (encapsulates): (568 bit)|0011000001000101000000100010000100000000110111100110000000011110010101110011110110101111101101011001101111000101010100011101010110001110001111100111101110011110110110100000011000010010110111010000000100010010100000000101101000100010000101111011011100110100011101011001101110001000010001000001011100000010001000000110011111000011111111011110011000000111100000001101010000011100000111010111101000111011100100000010100100011111001111010011100111000100110111000010111100100000011011011100110010111010001011111001100000101100000001101011011001111100000010011011001000110010 59 + SEQUENCE @10403+69 (constructed): (2 elem) 60 + INTEGER @10405+33: (256 bit)|100583279108105959323277080420227859612360091217401498640290749528265835693079 61 + INTEGER @10440+32: (255 bit)|46934510925111877438867701170553238261516280994969183555881415710868278719026 62 + signerInfos SignerInfos SET @10474+394 (constructed): (1 elem) 63 + SignerInfo SEQUENCE @10478+390 (constructed): (6 elem) 64 + version CMSVersion INTEGER @10482+1: 1 65 + sid issuerAndSerialNumber SignerIdentifier SEQUENCE @10485+35 (constructed): (2 elem) 66 + issuer rdnSequence Name SEQUENCE @10487+15 (constructed): (1 elem) 67 + RelativeDistinguishedName SET @10489+13 (constructed): (1 elem) 68 + AttributeTypeAndValue SEQUENCE @10491+11 (constructed): (2 elem) 69 + type AttributeType OBJECT_IDENTIFIER @10493+3: 2.5.4.3|commonName|X.520 DN component 70 + value AttributeValue [?] UTF8String @10498+4: Test 71 + serialNumber CertificateSerialNumber INTEGER @10504+16: (127 bit)|128087855099855233032551836648087377254 72 + digestAlgorithm DigestAlgorithmIdentifier SEQUENCE @10522+13 (constructed): (2 elem) 73 + algorithm OBJECT_IDENTIFIER @10524+9: 2.16.840.1.101.3.4.2.1|sha-256|NIST Algorithm 74 + parameters ANY NULL @10535+0 75 + SignedAttributes [?] [0] @10537+247 (constructed): (5 elem) 76 + Attribute SEQUENCE @10540+24 (constructed): (2 elem) 77 + type AttributeType OBJECT_IDENTIFIER @10542+9: 1.2.840.113549.1.9.3|contentType|PKCS #9 78 + values SET @10553+11 (constructed): (1 elem) 79 + AttributeValue [?] OBJECT_IDENTIFIER @10555+9: 1.2.840.113549.1.7.1|data|PKCS #7 80 + Attribute SEQUENCE @10566+28 (constructed): (2 elem) 81 + type AttributeType OBJECT_IDENTIFIER @10568+9: 1.2.840.113549.1.9.5|signingTime|PKCS #9 82 + values SET @10579+15 (constructed): (1 elem) 83 + AttributeValue [?] UTCTime @10581+13: 2018-07-16 14:56:35 UTC 84 + Attribute SEQUENCE @10596+42 (constructed): (2 elem) 85 + type AttributeType OBJECT_IDENTIFIER @10598+9: 1.2.840.113549.1.9.52|cmsAlgorithmProtection|RFC 6211 86 + values SET @10609+29 (constructed): (1 elem) 87 + AttributeValue [?] SEQUENCE @10611+27 (constructed): (2 elem) 88 + SEQUENCE @10613+13 (constructed): (2 elem) 89 + OBJECT_IDENTIFIER @10615+9: 2.16.840.1.101.3.4.2.1|sha-256|NIST Algorithm 90 + NULL @10626+0 91 + [1] @10628+10 (constructed): (1 elem) 92 + OBJECT_IDENTIFIER @10630+8: 1.2.840.10045.4.3.2|ecdsaWithSHA256|ANSI X9.62 ECDSA algorithm with SHA256 93 + Attribute SEQUENCE @10640+47 (constructed): (2 elem) 94 + type AttributeType OBJECT_IDENTIFIER @10642+9: 1.2.840.113549.1.9.4|messageDigest|PKCS #9 95 + values SET @10653+34 (constructed): (1 elem) 96 + AttributeValue [?] OCTET_STRING @10655+32: (32 byte)|724C51BBE76DA05AFB20CBE8EB037CDAE1AFD713125D2DC13D552DA9F442D24D 97 + Attribute SEQUENCE @10689+96 (constructed): (2 elem) 98 + type AttributeType OBJECT_IDENTIFIER @10691+11: 1.2.840.113549.1.9.16.2.47|signingCertificateV2|S/MIME Authenticated Attributes 99 + values SET @10704+81 (constructed): (1 elem) 100 + AttributeValue [?] SEQUENCE @10706+79 (constructed): (1 elem) 101 + SEQUENCE @10708+77 (constructed): (1 elem) 102 + SEQUENCE @10710+75 (constructed): (2 elem) 103 + OCTET_STRING @10712+32: (32 byte)|BABC08434C58267301E006861D27ECA125670E792797248E76A5717A5BF993C2 104 + SEQUENCE @10746+39 (constructed): (2 elem) 105 + SEQUENCE @10748+19 (constructed): (1 elem) 106 + [4] @10750+17 (constructed): (1 elem) 107 + SEQUENCE @10752+15 (constructed): (1 elem) 108 + SET @10754+13 (constructed): (1 elem) 109 + SEQUENCE @10756+11 (constructed): (2 elem) 110 + OBJECT_IDENTIFIER @10758+3: 2.5.4.3|commonName|X.520 DN component 111 + UTF8String @10763+4: Test 112 + INTEGER @10769+16: (127 bit)|128087855099855233032551836648087377254 113 + signatureAlgorithm SignatureAlgorithmIdentifier SEQUENCE @10787+10 (constructed): (1 elem) 114 + algorithm OBJECT_IDENTIFIER @10789+8: 1.2.840.10045.4.3.2|ecdsaWithSHA256|ANSI X9.62 ECDSA algorithm with SHA256 115 + signature SignatureValue OCTET_STRING @10799+71 (encapsulates): (71 byte)|3045022100F104302EABB428ECC8E71CE2E38F6CBED848A8E9A2B5D5DA19933E485C83CC7102200CBB40A0B7B9B2E048920622FB286FD14695F24CF650BDAA40B885F84C34BBB9 116 + SEQUENCE @10801+69 (constructed): (2 elem) 117 + INTEGER @10803+33: (256 bit)|109014796438891021115527318269695135443977065935278579101750090430030910049393 118 + INTEGER @10838+32: (252 bit)|5758600628818957274240888478952309319266088628943097300803726649607194983353
+1 -2
favicon.svg
··· 1 - <?xml version="1.0" encoding="UTF-8"?> 2 - <svg width="192" height="192" version="1.1" viewBox="0 0 50.8 50.8" xmlns="http://www.w3.org/2000/svg"><rect width="50.8" height="50.8" stroke-width=".25275"/><g transform="translate(0 .23698)"><g transform="translate(0 -.30431)"><path transform="matrix(.26458 0 0 .26458 .72192 -3.1337)" d="m65.411 87.986h-31.354l-4.9479 14.167h-20.156l28.802-77.761h23.906l28.802 77.761h-20.156zm-26.354-14.427h21.302l-10.625-30.938zm125.83-46.719v16.458q-6.4063-2.8646-12.5-4.3229t-11.51-1.4583q-7.1875 0-10.625 1.9792t-3.4375 6.1459q0 3.125 2.2917 4.8958 2.3438 1.7188 8.4375 2.9688l8.5417 1.7188q12.969 2.6042 18.438 7.9167 5.4688 5.3125 5.4688 15.104 0 12.865-7.6563 19.167-7.6042 6.25-23.281 6.25-7.3958 0-14.844-1.4062-7.4479-1.4063-14.896-4.1667v-16.927q7.4479 3.9583 14.375 5.9896 6.9792 1.9792 13.438 1.9792 6.5625 0 10.052-2.1875t3.4896-6.25q0-3.6458-2.3958-5.625-2.3438-1.9792-9.4271-3.5417l-7.7604-1.7188q-11.667-2.5-17.083-7.9688-5.3646-5.4688-5.3646-14.74 0-11.615 7.5-17.865 7.5-6.25 21.563-6.25 6.4063 0 13.177 0.98959 6.7708 0.9375 14.01 2.8646z" fill="#58a6ff" aria-label="AS"/><g transform="matrix(.26458 0 0 .26458 2.807 20.959)" style="white-space:pre" aria-label="N1"><path d="m7.2136 24.392h22.396l28.281 53.334v-53.334h19.01v77.761h-22.396l-28.281-53.334v53.334h-19.01z" fill="#58a6ff"/><path d="m109.19 88.298h17.708v-50.261l-18.177 3.75v-13.646l18.073-3.75h19.063v63.906h17.708v13.854h-54.375z" fill="#fffe58"/></g></g></g></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 50.8 50.8"><path d="M0 0h50.8v50.8H0z"/><path fill="#58a6ff" d="M18.028 20.078H9.733l-1.31 3.749H3.092l7.62-20.574h6.325l7.62 20.574h-5.332zm-6.972-3.817h5.636L13.88 8.076zm33.292-12.36v4.354q-1.695-.758-3.308-1.144t-3.045-.386q-1.902 0-2.811.524t-.91 1.626q0 .827.607 1.295.62.455 2.232.786l2.26.454q3.432.69 4.879 2.095t1.446 3.996q0 3.404-2.025 5.072-2.012 1.653-6.16 1.653-1.957 0-3.927-.372t-3.942-1.102v-4.479q1.971 1.047 3.804 1.585 1.846.523 3.555.523 1.737 0 2.66-.578t.923-1.654q0-.965-.634-1.488-.62-.524-2.494-.937l-2.053-.455q-3.087-.661-4.52-2.108-1.42-1.447-1.42-3.9 0-3.073 1.985-4.727 1.984-1.654 5.705-1.654 1.695 0 3.486.262 1.792.248 3.707.758z" aria-label="AS"/><g aria-label="N1" style="white-space:pre"><path fill="#58a6ff" d="M4.716 27.345h5.925l7.483 14.111v-14.11h5.03v20.573h-5.926L9.745 33.81v14.11h-5.03z"/><path fill="#fffe58" d="M31.696 44.254h4.686V30.955l-4.81.993v-3.61l4.782-.993h5.044v16.908h4.685v3.666H31.696z"/></g></svg>
+2 -2
hex.js
··· 1 1 // Hex JavaScript decoder 2 - // Copyright (c) 2008-2024 Lapo Luchini <lapo@lapo.it> 2 + // Copyright (c) 2008 Lapo Luchini <lapo@lapo.it> 3 3 4 4 // Permission to use, copy, modify, and/or distribute this software for any 5 5 // purpose with or without fee is hereby granted, provided that the above 6 6 // copyright notice and this permission notice appear in all copies. 7 - // 7 + // 8 8 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 9 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 10 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+103 -10
index.css
··· 1 - html[data-theme="light"] { 1 + html { 2 2 --main-bg-color: #C0C0C0; 3 3 --main-text-color: #000000; 4 4 --headline-text-color: #8be9fd; ··· 29 29 --dump-hex-current-hex: #A0A0A0; 30 30 --dump-hex-current-dlen: #004040; 31 31 --hover-bg-color: #E0E0E0; 32 + --tree-zoom-fix: -1px; 33 + --tree-line: #999; 32 34 } 33 35 html[data-theme="dark"] { 34 36 --main-bg-color: #0d1116; ··· 61 63 --dump-hex-current-hex: #474747; 62 64 --dump-hex-current-dlen: #00b6b6; 63 65 --hover-bg-color: #505050; 66 + --tree-line: #333; 64 67 } 65 68 html, body { 66 69 background-color: var(--page-bg-color); ··· 126 129 #main-page { 127 130 background-color: var(--main-bg-color); 128 131 border: 0px; 129 - padding: 15px; 132 + padding: 5px; 130 133 } 131 134 #main-page > div { 132 135 position: relative; ··· 158 161 /*display: block;*/ 159 162 visibility: visible; 160 163 } 161 - .node { 162 - position: relative; 163 - } 164 - .sub { 165 - padding-left: 1.5em; 166 - border-left: solid 1px var(--sub-border-color); 167 - } 168 164 .head { 169 165 height: 1em; 170 166 white-space: nowrap; ··· 197 193 position: absolute; 198 194 z-index: 2; 199 195 top: 1.2em; 200 - left: 0; 196 + left: 30px; 201 197 background-color: #efefef; /*minimal support for IE11*/ 202 198 background-color: var(--button-bg-color); 203 199 border: solid 1px var(--button-border-color); ··· 267 263 #contextmenu > button:hover { 268 264 background-color: var(--button-bghover-color); 269 265 } 266 + 267 + .treecollapse { 268 + --spacing: 1.5rem; 269 + --radius: 7px; 270 + padding-inline-start: 0px; 271 + } 272 + .treecollapse li{ 273 + display: block; 274 + position: relative; 275 + padding-left: calc(2 * var(--spacing) - var(--radius) - 2px); 276 + } 277 + .treecollapse ul{ 278 + padding-left: 0; 279 + margin-left: calc(var(--radius) - var(--spacing)); 280 + } 281 + .treecollapse ul li{ 282 + border-left: 1px solid var(--tree-line); 283 + } 284 + .treecollapse ul li:last-child{ 285 + border-color: transparent; 286 + } 287 + .treecollapse ul li::before{ 288 + content: ''; 289 + display: block; 290 + position: absolute; 291 + top: calc(var(--spacing) / -1.6); 292 + left: var(--tree-zoom-fix); 293 + width: calc(var(--spacing) + 2px); 294 + height: calc(var(--spacing) + 1px); 295 + border: solid var(--tree-line); 296 + border-width: 0 0 1px 1px; 297 + } 298 + .treecollapse summary{ 299 + display : block; 300 + cursor : pointer; 301 + } 302 + .treecollapse summary::marker, 303 + .treecollapse summary::-webkit-details-marker{ 304 + display : none; 305 + } 306 + .treecollapse summary:focus{ 307 + outline : none; 308 + } 309 + .treecollapse summary:focus-visible{ 310 + outline : 1px dotted #000; 311 + } 312 + .treecollapse summary::before{ 313 + content: ''; 314 + display: block; 315 + position: absolute; 316 + top: calc(var(--spacing) / 2 - var(--radius)); 317 + left: calc(var(--spacing) - var(--radius) - 1px); 318 + width: calc(2 * var(--radius)); 319 + height: calc(2 * var(--radius)); 320 + } 321 + .treecollapse summary::before{ 322 + z-index: 1; 323 + top: 1px; 324 + background: url('tree-icon-light.svg'); 325 + } 326 + html[data-theme="dark"] .treecollapse summary::before{ 327 + background: url('tree-icon-dark.svg'); 328 + } 329 + .treecollapse details[open] > summary::before{ 330 + background-position : calc(-2 * var(--radius)) 0; 331 + } 332 + 333 + /* 334 + Zoom fix to have straight lines in treeview 335 + Zoom level and dpi resolution: 336 + - 175%: 336dpi 337 + - 150%: 288dpi 338 + - 110%: 212dpi 339 + - 100%: 192dpi 340 + - 90%: 173dpi 341 + - 80%: 154dpi 342 + */ 343 + @media (resolution <= 154dpi) { 344 + :root{ 345 + --tree-zoom-fix: -0.6px; 346 + } 347 + } 348 + @media (155dpi <= resolution < 192dpi) { 349 + :root{ 350 + --tree-zoom-fix: -0.7px; 351 + } 352 + } 353 + @media (192dpi <= resolution < 336dpi) { 354 + :root{ 355 + --tree-zoom-fix: -1px; 356 + } 357 + } 358 + @media (336dpi <= resolution) { 359 + :root{ 360 + --tree-zoom-fix: -0.9px; 361 + } 362 + }
+7 -5
index.html
··· 11 11 </head> 12 12 <body> 13 13 <div id="contextmenu"> 14 - <button id="btnHideTree">Hide subtree</button> 15 14 <button id="btnCopyHex">Copy hex dump</button> 16 15 <button id="btnCopyB64">Copy Base64</button> 17 16 <button id="btnCopyTree">Copy subtree</button> ··· 38 37 <div id="tree"></div> 39 38 </div> 40 39 <form> 41 - <textarea id="area" rows="8"></textarea> 40 + <textarea id="area" rows="8" placeholder="Paste hex or base64 or PEM encoded ASN.1 BER or DER structures here, or load a file."></textarea> 42 41 <br> 43 42 <br> 44 43 <label title="can be slow with big files"><input type="checkbox" id="wantHex" checked="checked"> with hex dump</label> ··· 59 58 <option value="pkcs1.pem">PKCS#1 RSA key (RFC 8017)</option> 60 59 <option value="pkcs8-rsa.pem">PKCS#8 RSA key (RFC 5208)</option> 61 60 <option value="pkcs10.pem">PKCS#10 certification request (RFC 2986)</option> 61 + <option value="crl-rfc5280.b64">CRL example (RFC 5280)</option> 62 62 <option value="cmpv2.b64">CMP PKI message (RFC 4210)</option> 63 + <option value="ldapmessage.b64">LDAP message (RFC 4511)</option> 63 64 </select> 64 65 <input id="butExample" type="button" value="load"><br> 65 66 </td></tr> ··· 71 72 <div id="help"> 72 73 <h2>Instructions</h2> 73 74 <p>This page contains a JavaScript generic ASN.1 parser that can decode any valid ASN.1 DER or BER structure whether Base64-encoded (raw base64, PEM armoring and <span class="tt">begin-base64</span> are recognized) or Hex-encoded. </p> 74 - <p>This tool can be used online at the address <a href="https://asn1js.eu/"><span class="tt">https://asn1js.eu/</span></a> or offline, unpacking <a href="https://asn1js.eu/asn1js.zip">the ZIP file</a> in a directory and opening <span class="tt">index.html</span> in a browser</p> 75 + <p>This tool can be used online at the address <a href="https://asn1js.eu/"><span class="tt">https://asn1js.eu/</span></a> or offline, unpacking <a href="https://asn1js.eu/asn1js.zip">the ZIP file</a> in a directory and opening <span class="tt">index-local.html</span> in a browser.</p> 75 76 <p>On the left of the page will be printed a tree representing the hierarchical structure, on the right side an hex dump will be shown. <br> 76 77 Hovering on the tree highlights ancestry (the hovered node and all its ancestors get colored) and the position of the hovered node gets highlighted in the hex dump (with header and content in a different colors). <br> 77 78 Clicking a node in the tree will hide its sub-nodes (collapsed nodes can be noticed because they will become <i>italic</i>).</p> ··· 81 82 <h3>Copyright</h3> 82 83 <div><p class="hidden"> 83 84 ASN.1 JavaScript decoder<br> 84 - Copyright &copy; 2008-2024 Lapo Luchini <a href="mailto:lapo@lapo.it?subject=ASN1js">&lt;lapo@lapo.it&gt;</a><br> 85 + Copyright &copy; 2008-2025 Lapo Luchini <a href="mailto:lapo@lapo.it?subject=ASN1js">&lt;lapo@lapo.it&gt;</a><br> 85 86 <br> 86 87 Permission to use, copy, modify, and/or distribute this software for any 87 88 purpose with or without fee is hereby granted, provided that the above ··· 95 96 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 96 97 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 97 98 </p></div> 98 - <p>ASN.1 JavaScript decoder Copyright &copy; 2008-2024 <a href="https://lapo.it/">Lapo Luchini</a>; released as <a href="https://opensource.org/licenses/isc-license.txt">opensource</a> under the <a href="https://en.wikipedia.org/wiki/ISC_licence">ISC license</a>.</p> 99 + <p>ASN.1 JavaScript decoder Copyright &copy; 2008-2025 <a href="https://lapo.it/">Lapo Luchini</a>; released as <a href="https://opensource.org/licenses/isc-license.txt">opensource</a> under the <a href="https://en.wikipedia.org/wiki/ISC_licence">ISC license</a>.</p> 99 100 </div> 100 101 <p><span class="tt">OBJECT&nbsp;IDENTIFIER</span> values are recognized using data taken from Peter Gutmann's <a href="https://www.cs.auckland.ac.nz/~pgut001/#standards">dumpasn1</a> program.</p> 101 102 <h3>Links</h3> ··· 106 107 <li>previous versions on githack: <select id="tags"><option>[select tag]</option></select></li> 107 108 <li><a href="http://idf.lapo.it/p/asn1js/">InDefero tracker</a> (currently offline)</li> 108 109 <li><a href="https://github.com/lapo-luchini/asn1js">github mirror</a></li> 110 + <li><a href="https://github.com/lapo-luchini/asn1js/blob/trunk/CHANGELOG.md">ChangeLog on GitHub</a></li> 109 111 <li><a href="https://www.openhub.net/p/asn1js">OpenHub code stats</a></li> 110 112 </ul> 111 113 </div>
+6 -3
index.js
··· 41 41 function show(asn1) { 42 42 tree.innerHTML = ''; 43 43 dump.innerHTML = ''; 44 - tree.appendChild(asn1.toDOM()); 44 + let ul = document.createElement('ul'); 45 + ul.className = 'treecollapse'; 46 + tree.appendChild(ul); 47 + ul.appendChild(asn1.toDOM()); 45 48 if (wantHex.checked) dump.appendChild(asn1.toHexDOM(undefined, trimHex.checked)); 46 49 } 47 50 export function decode(der, offset) { ··· 83 86 if (area.value === '') area.value = Base64.pretty(b64); 84 87 try { 85 88 window.location.hash = hash = '#' + b64; 86 - } catch (e) { 89 + } catch (ignore) { 87 90 // fails with "Access Denied" on IE with URLs longer than ~2048 chars 88 91 window.location.hash = hash = '#'; 89 92 } ··· 119 122 else if (Base64.re.test(str)) der = Base64.unarmor(str); 120 123 else der = str; 121 124 decode(der); 122 - } catch (e) { 125 + } catch (ignore) { 123 126 text(tree, 'Cannot decode file.'); 124 127 dump.innerHTML = ''; 125 128 }
+15 -9
int10.js
··· 1 1 // Big integer base-10 printing library 2 - // Copyright (c) 2008-2024 Lapo Luchini <lapo@lapo.it> 2 + // Copyright (c) 2008 Lapo Luchini <lapo@lapo.it> 3 3 4 4 // Permission to use, copy, modify, and/or distribute this software for any 5 5 // purpose with or without fee is hereby granted, provided that the above 6 6 // copyright notice and this permission notice appear in all copies. 7 - // 7 + // 8 8 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 9 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 10 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ··· 13 13 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 14 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 15 16 - let max = 10000000000000; // biggest 10^n integer that can still fit 2^53 when multiplied by 256 16 + /** Biggest 10^n integer that can still fit 2^53 when multiplied by 256. */ 17 + const max = 10000000000000; 17 18 18 19 export class Int10 { 19 20 /** ··· 26 27 27 28 /** 28 29 * Multiply value by m and add c. 29 - * @param {number} m - multiplier, must be < =256 30 - * @param {number} c - value to add 30 + * @param {number} m - multiplier, must be 0<m<=256 31 + * @param {number} c - value to add, must be c>=0 31 32 */ 32 33 mulAdd(m, c) { 34 + // assert(m > 0) 33 35 // assert(m <= 256) 36 + // assert(c >= 0) 34 37 let b = this.buf, 35 38 l = b.length, 36 39 i, t; ··· 71 74 72 75 /** 73 76 * Convert to decimal string representation. 74 - * @param {*} base - optional value, only value accepted is 10 77 + * @param {number} [base=10] - optional value, only value accepted is 10 78 + * @returns {string} The decimal string representation. 75 79 */ 76 - toString(base) { 77 - if ((base || 10) != 10) 78 - throw 'only base 10 is supported'; 80 + toString(base = 10) { 81 + if (base != 10) 82 + throw new Error('only base 10 is supported'); 79 83 let b = this.buf, 80 84 s = b[b.length - 1].toString(); 81 85 for (let i = b.length - 2; i >= 0; --i) ··· 86 90 /** 87 91 * Convert to Number value representation. 88 92 * Will probably overflow 2^53 and thus become approximate. 93 + * @returns {number} The numeric value. 89 94 */ 90 95 valueOf() { 91 96 let b = this.buf, ··· 97 102 98 103 /** 99 104 * Return value as a simple Number (if it is <= 10000000000000), or return this. 105 + * @returns {number | Int10} The simplified value. 100 106 */ 101 107 simplify() { 102 108 let b = this.buf;
+34 -75
package.json
··· 1 1 { 2 2 "name": "@lapo/asn1js", 3 - "version": "2.0.4", 3 + "version": "2.1.0", 4 4 "description": "Generic ASN.1 parser/decoder that can decode any valid ASN.1 DER or BER structures.", 5 5 "type": "module", 6 6 "main": "asn1.js", ··· 8 8 "type": "git", 9 9 "url": "git+https://github.com/lapo-luchini/asn1js.git" 10 10 }, 11 - "keywords": [ "asn1", "ber", "der", "pem" ], 11 + "keywords": [ 12 + "asn1", 13 + "ber", 14 + "der", 15 + "pem" 16 + ], 12 17 "author": "Lapo Luchini <lapo@lapo.it>", 13 18 "license": "ISC", 14 - "bugs": { "url": "https://github.com/lapo-luchini/asn1js/issues" }, 19 + "bugs": { 20 + "url": "https://github.com/lapo-luchini/asn1js/issues" 21 + }, 15 22 "homepage": "https://lapo.it/asn1js/", 16 - "files": [ "asn1.js", "base64.js", "hex.js", "int10.js", "defs.js", "oids.js", "rfcdef.js", "dumpASN1.js" ], 23 + "files": [ 24 + "asn1.js", 25 + "base64.js", 26 + "hex.js", 27 + "int10.js", 28 + "dom.js", 29 + "defs.js", 30 + "oids.js", 31 + "rfcdef.js", 32 + "dumpASN1.js" 33 + ], 17 34 "scripts": { 18 - "lint": "npx eslint asn1.js base64.js hex.js int10.js defs.js oids.js rfcdef.js tags.js context.js index.js parseRFC.js dumpASN1.js test.js testDefs.js vite.config.js theme.js", 35 + "lint": "npx eslint asn1.js base64.js hex.js int10.js dom.js defs.js oids.js rfcdef.js tags.js context.js index.js parseRFC.js dumpASN1.js test.js testDefs.js vite.config.js theme.js", 19 36 "lint-action": "npx @action-validator/cli .github/workflows/node.js.yml", 20 37 "build": "vite build", 21 - "serve": "echo 'Connect to http://localhost:3000/' ; npx statik --port 3000 .", 38 + "serve": "npx -p local-web-server ws", 22 39 "test": "node test", 23 40 "testdefs": "node testDefs" 24 41 }, ··· 26 43 "dumpASN1": "./dumpASN1.js" 27 44 }, 28 45 "engines": { 29 - "node": ">=12.20.0" 46 + "node": ">=14.6.0" 30 47 }, 48 + "packageManager": "pnpm@7.33.7", 31 49 "devDependencies": { 32 - "eslint": "^8.34.0", 50 + "@eslint/eslintrc": "^3.3.1", 51 + "@eslint/js": "^9.32.0", 52 + "@rollup/wasm-node": "^4.46.2", 53 + "diff": "^8.0.2", 54 + "eslint": "^9.32.0", 55 + "globals": "^16.3.0", 33 56 "htmlparser2": "^9.1.0", 34 - "vite": "^5.2.10", 35 - "vite-plugin-dom": "^1.0.3", 36 - "vite-plugin-singlefile": "^2.0.1" 57 + "vite": "^5.4.19", 58 + "vite-plugin-dom": "^1.0.4", 59 + "vite-plugin-singlefile": "^2.3.0" 37 60 }, 38 61 "overrides": { 39 62 "rollup": "npm:@rollup/wasm-node" ··· 42 65 "overrides": { 43 66 "rollup": "npm:@rollup/wasm-node" 44 67 } 45 - }, 46 - "eslintConfig": { 47 - "env": { 48 - "es6": true, 49 - "browser": true, 50 - "node": true 51 - }, 52 - "parserOptions": { 53 - "ecmaVersion": 2015, 54 - "sourceType": "module" 55 - }, 56 - "extends": [ "eslint:recommended" ], 57 - "globals": { 58 - "Uint8Array": "readonly" 59 - }, 60 - "rules": { 61 - "strict": [ "error", "function" ], 62 - "indent": [ "error", 4 ], 63 - "linebreak-style": [ "error", "unix" ], 64 - "eol-last": [ "error", "always" ], 65 - "semi": [ "warn", "always" ], 66 - "quotes": [ "error", "single", { "avoidEscape": true } ], 67 - "no-var": [ "warn" ], 68 - "comma-dangle": [ "error", "always-multiline" ] 69 - }, 70 - "overrides": [ 71 - { 72 - "files": [ "defs.js" ], 73 - "parserOptions": { 74 - "ecmaVersion": 2020 75 - } 76 - }, { 77 - "files": [ "test.js", "parseRFC.js", "dumpASN1.js" ], 78 - "parserOptions": { 79 - "ecmaVersion": 2021 80 - }, 81 - "rules": { 82 - "strict": [ "error", "global" ] 83 - } 84 - }, { 85 - "files": [ "oids.js" ], 86 - "rules": { 87 - "indent": "off", 88 - "quotes": [ "warn", "double" ] 89 - } 90 - }, { 91 - "files": [ "tags.js", "rfcdef.js" ], 92 - "rules": { 93 - "indent": [ "error", 2, { "ignoredNodes": [ "Program > ExpressionStatement > CallExpression > FunctionExpression > BlockStatement > ExpressionStatement[directive='use strict']:first-child" ] } ], 94 - "comma-dangle": "off", 95 - "quotes": [ "warn", "double" ] 96 - } 97 - }, { 98 - "files": [ "defs.js" ], 99 - "parserOptions": { 100 - "ecmaVersion": 2021 101 - } 102 - }, { 103 - "files": [ "testDefs.js" ], 104 - "parserOptions": { 105 - "ecmaVersion": 2022 106 - } 107 - } 108 - ] 109 68 } 110 69 }
+55 -7
parseRFC.js
··· 1 1 #! /usr/bin/env node 2 2 3 + // RFC ASN.1 definition parser 4 + // Copyright (c) 2021 Lapo Luchini <lapo@lapo.it> 5 + 6 + // Permission to use, copy, modify, and/or distribute this software for any 7 + // purpose with or without fee is hereby granted, provided that the above 8 + // copyright notice and this permission notice appear in all copies. 9 + // 10 + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 + 3 18 import * as fs from 'node:fs'; 4 19 5 20 const ··· 56 71 [ /emptyString {4}EncodingParameters ::= ''H/g, '' ], 57 72 [ /[(]CONSTRAINED BY[^)]+[)]/g, '' ], 58 73 ], 74 + 4511: [ 75 + [ /^\s+-- .*\r?\n/mg, '' ], // comments 76 + [ 'EXTENSIBILITY IMPLIED', '' ], 77 + [ /\.\.\.(,| {2})/g, '' ], 78 + [ /value AttributeValue/g, 'AttributeValue' ], 79 + [ /control Control/g, 'Control' ], 80 + [ /Attribute ::= PartialAttribute\(WITH COMPONENTS \{[^}]+\}\)/g, 'PartialAttribute ::= SEQUENCE { type AttributeDescription, vals SET SIZE (1..MAX) OF AttributeValue }' ], 81 + [ /,\s+\}/g, '}' ], 82 + [ /SaslCredentials,/g, 'SaslCredentials' ], 83 + [ /(BindResponse|ExtendedResponse) ::= \[APPLICATION [0-9]+\] SEQUENCE \{[^}]+\}/g, '$1 ::= ANY' ], 84 + [ /selector LDAPString/g, 'LDAPString' ], 85 + [ /filter Filter/g, 'Filter' ], 86 + [ /MatchingRuleAssertion,/g, 'MatchingRuleAssertion' ], 87 + [ /OF substring CHOICE/g, 'OF CHOICE' ], 88 + [ /partialAttribute PartialAttribute/g, 'PartialAttribute' ], 89 + [ /uri URI/g, 'URI' ], 90 + [ /OF change SEQUENCE/g, 'OF SEQUENCE' ], 91 + [ /attribute Attribute/g, 'Attribute' ], 92 + ], 59 93 }; 60 94 61 95 // const reWhitespace = /(?:\s|--(?:[}-]?[^\n}-])*(?:\n|--))*/y; ··· 179 213 tryToken(expect) { 180 214 let p = this.pos; 181 215 let t; 182 - try { t = this.parseToken(); } catch (e) { /*ignore*/ } 216 + try { t = this.parseToken(); } catch (ignore) { /*ignore*/ } 183 217 // console.log('[debug] tryToken(' + expect + ') = ' + t); 184 218 if (t == expect) 185 219 return true; ··· 309 343 let plicit = this.getRegEx('explicit/implicit', reTagType); 310 344 if (plicit == '') plicit = currentMod.tagDefault; 311 345 let x = this.parseType(); 346 + let name; 347 + switch (tagClass) { // keep in sync with ASN1.typeName 348 + case 'APPLICATION': 349 + name = 'Application ' + t; 350 + break; 351 + case 'PRIVATE': 352 + name = 'Private ' + t; 353 + break; 354 + case 'CONTEXT': 355 + // fall through 356 + default: 357 + name = '[' + t + ']'; 358 + break; 359 + } 312 360 return { 313 - name: '[' + t + ']', 361 + name, 314 362 type: 'tag', 315 363 'class': tagClass, 316 364 explicit: (plicit == 'EXPLICIT'), ··· 323 371 let p = this.pos; 324 372 try { 325 373 return this.parseBuiltinType(); 326 - } catch (e) { 374 + } catch (ignore) { 327 375 // console.log('[debug] parseAssignment failed on parseType', e); 328 376 this.pos = p; 329 377 let x = { ··· 394 442 case 'NULL': 395 443 return null; 396 444 } 397 - } catch (e) { 445 + } catch (ignore) { 398 446 this.pos = p; 399 447 } 400 448 p = this.pos; 401 449 try { 402 450 return this.parseIdentifier(); 403 - } catch (e) { 451 + } catch (ignore) { 404 452 this.pos = p; 405 453 } 406 454 this.exception('Unknown value type.'); ··· 519 567 asn1[currentMod.oid] = currentMod; 520 568 } 521 569 /*asn1 = Object.keys(asn1).sort().reduce( 522 - (obj, key) => { 570 + (obj, key) => { 523 571 obj[key] = asn1[key]; 524 572 return obj; 525 - }, 573 + }, 526 574 {} 527 575 );*/ 528 576 fs.writeFileSync(process.argv[3], JSON.stringify(asn1, null, 2) + '\n', 'utf8');
+1348
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + overrides: 8 + rollup: npm:@rollup/wasm-node 9 + 10 + importers: 11 + 12 + .: 13 + devDependencies: 14 + '@eslint/eslintrc': 15 + specifier: ^3.3.1 16 + version: 3.3.1 17 + '@eslint/js': 18 + specifier: ^9.32.0 19 + version: 9.32.0 20 + '@rollup/wasm-node': 21 + specifier: ^4.46.2 22 + version: 4.46.2 23 + diff: 24 + specifier: ^8.0.2 25 + version: 8.0.2 26 + eslint: 27 + specifier: ^9.32.0 28 + version: 9.32.0 29 + globals: 30 + specifier: ^16.3.0 31 + version: 16.3.0 32 + htmlparser2: 33 + specifier: ^9.1.0 34 + version: 9.1.0 35 + vite: 36 + specifier: ^5.4.19 37 + version: 5.4.19 38 + vite-plugin-dom: 39 + specifier: ^1.0.4 40 + version: 1.0.4(vite@5.4.19) 41 + vite-plugin-singlefile: 42 + specifier: ^2.3.0 43 + version: 2.3.0(rollup@4.46.2)(vite@5.4.19) 44 + 45 + packages: 46 + 47 + '@esbuild/aix-ppc64@0.21.5': 48 + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 49 + engines: {node: '>=12'} 50 + cpu: [ppc64] 51 + os: [aix] 52 + 53 + '@esbuild/android-arm64@0.21.5': 54 + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 55 + engines: {node: '>=12'} 56 + cpu: [arm64] 57 + os: [android] 58 + 59 + '@esbuild/android-arm@0.21.5': 60 + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 61 + engines: {node: '>=12'} 62 + cpu: [arm] 63 + os: [android] 64 + 65 + '@esbuild/android-x64@0.21.5': 66 + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 67 + engines: {node: '>=12'} 68 + cpu: [x64] 69 + os: [android] 70 + 71 + '@esbuild/darwin-arm64@0.21.5': 72 + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 73 + engines: {node: '>=12'} 74 + cpu: [arm64] 75 + os: [darwin] 76 + 77 + '@esbuild/darwin-x64@0.21.5': 78 + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 79 + engines: {node: '>=12'} 80 + cpu: [x64] 81 + os: [darwin] 82 + 83 + '@esbuild/freebsd-arm64@0.21.5': 84 + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 85 + engines: {node: '>=12'} 86 + cpu: [arm64] 87 + os: [freebsd] 88 + 89 + '@esbuild/freebsd-x64@0.21.5': 90 + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 91 + engines: {node: '>=12'} 92 + cpu: [x64] 93 + os: [freebsd] 94 + 95 + '@esbuild/linux-arm64@0.21.5': 96 + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 97 + engines: {node: '>=12'} 98 + cpu: [arm64] 99 + os: [linux] 100 + 101 + '@esbuild/linux-arm@0.21.5': 102 + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 103 + engines: {node: '>=12'} 104 + cpu: [arm] 105 + os: [linux] 106 + 107 + '@esbuild/linux-ia32@0.21.5': 108 + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 109 + engines: {node: '>=12'} 110 + cpu: [ia32] 111 + os: [linux] 112 + 113 + '@esbuild/linux-loong64@0.21.5': 114 + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 115 + engines: {node: '>=12'} 116 + cpu: [loong64] 117 + os: [linux] 118 + 119 + '@esbuild/linux-mips64el@0.21.5': 120 + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 121 + engines: {node: '>=12'} 122 + cpu: [mips64el] 123 + os: [linux] 124 + 125 + '@esbuild/linux-ppc64@0.21.5': 126 + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 127 + engines: {node: '>=12'} 128 + cpu: [ppc64] 129 + os: [linux] 130 + 131 + '@esbuild/linux-riscv64@0.21.5': 132 + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 133 + engines: {node: '>=12'} 134 + cpu: [riscv64] 135 + os: [linux] 136 + 137 + '@esbuild/linux-s390x@0.21.5': 138 + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 139 + engines: {node: '>=12'} 140 + cpu: [s390x] 141 + os: [linux] 142 + 143 + '@esbuild/linux-x64@0.21.5': 144 + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 145 + engines: {node: '>=12'} 146 + cpu: [x64] 147 + os: [linux] 148 + 149 + '@esbuild/netbsd-x64@0.21.5': 150 + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 151 + engines: {node: '>=12'} 152 + cpu: [x64] 153 + os: [netbsd] 154 + 155 + '@esbuild/openbsd-x64@0.21.5': 156 + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 157 + engines: {node: '>=12'} 158 + cpu: [x64] 159 + os: [openbsd] 160 + 161 + '@esbuild/sunos-x64@0.21.5': 162 + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 163 + engines: {node: '>=12'} 164 + cpu: [x64] 165 + os: [sunos] 166 + 167 + '@esbuild/win32-arm64@0.21.5': 168 + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 169 + engines: {node: '>=12'} 170 + cpu: [arm64] 171 + os: [win32] 172 + 173 + '@esbuild/win32-ia32@0.21.5': 174 + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 175 + engines: {node: '>=12'} 176 + cpu: [ia32] 177 + os: [win32] 178 + 179 + '@esbuild/win32-x64@0.21.5': 180 + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 181 + engines: {node: '>=12'} 182 + cpu: [x64] 183 + os: [win32] 184 + 185 + '@eslint-community/eslint-utils@4.7.0': 186 + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 187 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 188 + peerDependencies: 189 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 190 + 191 + '@eslint-community/regexpp@4.12.1': 192 + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 193 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 194 + 195 + '@eslint/config-array@0.21.0': 196 + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} 197 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 198 + 199 + '@eslint/config-helpers@0.3.0': 200 + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} 201 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 202 + 203 + '@eslint/core@0.15.1': 204 + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} 205 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 206 + 207 + '@eslint/eslintrc@3.3.1': 208 + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 209 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 210 + 211 + '@eslint/js@9.32.0': 212 + resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} 213 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 214 + 215 + '@eslint/object-schema@2.1.6': 216 + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 217 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 218 + 219 + '@eslint/plugin-kit@0.3.4': 220 + resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} 221 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 222 + 223 + '@humanfs/core@0.19.1': 224 + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 225 + engines: {node: '>=18.18.0'} 226 + 227 + '@humanfs/node@0.16.6': 228 + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 229 + engines: {node: '>=18.18.0'} 230 + 231 + '@humanwhocodes/module-importer@1.0.1': 232 + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 233 + engines: {node: '>=12.22'} 234 + 235 + '@humanwhocodes/retry@0.3.1': 236 + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 237 + engines: {node: '>=18.18'} 238 + 239 + '@humanwhocodes/retry@0.4.3': 240 + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 241 + engines: {node: '>=18.18'} 242 + 243 + '@rollup/rollup-android-arm-eabi@4.46.2': 244 + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} 245 + cpu: [arm] 246 + os: [android] 247 + 248 + '@rollup/rollup-android-arm64@4.46.2': 249 + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} 250 + cpu: [arm64] 251 + os: [android] 252 + 253 + '@rollup/rollup-darwin-arm64@4.46.2': 254 + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} 255 + cpu: [arm64] 256 + os: [darwin] 257 + 258 + '@rollup/rollup-darwin-x64@4.46.2': 259 + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} 260 + cpu: [x64] 261 + os: [darwin] 262 + 263 + '@rollup/rollup-freebsd-arm64@4.46.2': 264 + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} 265 + cpu: [arm64] 266 + os: [freebsd] 267 + 268 + '@rollup/rollup-freebsd-x64@4.46.2': 269 + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} 270 + cpu: [x64] 271 + os: [freebsd] 272 + 273 + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': 274 + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} 275 + cpu: [arm] 276 + os: [linux] 277 + 278 + '@rollup/rollup-linux-arm-musleabihf@4.46.2': 279 + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} 280 + cpu: [arm] 281 + os: [linux] 282 + 283 + '@rollup/rollup-linux-arm64-gnu@4.46.2': 284 + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} 285 + cpu: [arm64] 286 + os: [linux] 287 + 288 + '@rollup/rollup-linux-arm64-musl@4.46.2': 289 + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} 290 + cpu: [arm64] 291 + os: [linux] 292 + 293 + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': 294 + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} 295 + cpu: [loong64] 296 + os: [linux] 297 + 298 + '@rollup/rollup-linux-ppc64-gnu@4.46.2': 299 + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} 300 + cpu: [ppc64] 301 + os: [linux] 302 + 303 + '@rollup/rollup-linux-riscv64-gnu@4.46.2': 304 + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} 305 + cpu: [riscv64] 306 + os: [linux] 307 + 308 + '@rollup/rollup-linux-riscv64-musl@4.46.2': 309 + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} 310 + cpu: [riscv64] 311 + os: [linux] 312 + 313 + '@rollup/rollup-linux-s390x-gnu@4.46.2': 314 + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} 315 + cpu: [s390x] 316 + os: [linux] 317 + 318 + '@rollup/rollup-linux-x64-gnu@4.46.2': 319 + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} 320 + cpu: [x64] 321 + os: [linux] 322 + 323 + '@rollup/rollup-linux-x64-musl@4.46.2': 324 + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} 325 + cpu: [x64] 326 + os: [linux] 327 + 328 + '@rollup/rollup-win32-arm64-msvc@4.46.2': 329 + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} 330 + cpu: [arm64] 331 + os: [win32] 332 + 333 + '@rollup/rollup-win32-ia32-msvc@4.46.2': 334 + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} 335 + cpu: [ia32] 336 + os: [win32] 337 + 338 + '@rollup/rollup-win32-x64-msvc@4.46.2': 339 + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} 340 + cpu: [x64] 341 + os: [win32] 342 + 343 + '@rollup/wasm-node@4.46.2': 344 + resolution: {integrity: sha512-lZRiZl+B1R3VhqZgORtuUpc2YYbgIv+X6g3LgQHS5sjlf1ENiK1HZ6N5e8pEZ04nAWiwYM0JX7rP0eyxflkJRg==} 345 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 346 + hasBin: true 347 + 348 + '@types/estree@1.0.8': 349 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 350 + 351 + '@types/json-schema@7.0.15': 352 + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 353 + 354 + acorn-jsx@5.3.2: 355 + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 356 + peerDependencies: 357 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 358 + 359 + acorn@8.15.0: 360 + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 361 + engines: {node: '>=0.4.0'} 362 + hasBin: true 363 + 364 + ajv@6.12.6: 365 + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 366 + 367 + ansi-styles@4.3.0: 368 + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 369 + engines: {node: '>=8'} 370 + 371 + argparse@2.0.1: 372 + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 373 + 374 + balanced-match@1.0.2: 375 + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 376 + 377 + brace-expansion@1.1.12: 378 + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 379 + 380 + braces@3.0.3: 381 + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 382 + engines: {node: '>=8'} 383 + 384 + callsites@3.1.0: 385 + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 386 + engines: {node: '>=6'} 387 + 388 + chalk@4.1.2: 389 + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 390 + engines: {node: '>=10'} 391 + 392 + color-convert@2.0.1: 393 + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 394 + engines: {node: '>=7.0.0'} 395 + 396 + color-name@1.1.4: 397 + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 398 + 399 + concat-map@0.0.1: 400 + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 401 + 402 + cross-spawn@7.0.6: 403 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 404 + engines: {node: '>= 8'} 405 + 406 + debug@4.4.1: 407 + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 408 + engines: {node: '>=6.0'} 409 + peerDependencies: 410 + supports-color: '*' 411 + peerDependenciesMeta: 412 + supports-color: 413 + optional: true 414 + 415 + deep-is@0.1.4: 416 + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 417 + 418 + diff@8.0.2: 419 + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} 420 + engines: {node: '>=0.3.1'} 421 + 422 + dom-serializer@2.0.0: 423 + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 424 + 425 + domelementtype@2.3.0: 426 + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 427 + 428 + domhandler@5.0.3: 429 + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 430 + engines: {node: '>= 4'} 431 + 432 + domutils@3.2.2: 433 + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 434 + 435 + entities@4.5.0: 436 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 437 + engines: {node: '>=0.12'} 438 + 439 + esbuild@0.21.5: 440 + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 441 + engines: {node: '>=12'} 442 + hasBin: true 443 + 444 + escape-string-regexp@4.0.0: 445 + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 446 + engines: {node: '>=10'} 447 + 448 + eslint-scope@8.4.0: 449 + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 450 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 451 + 452 + eslint-visitor-keys@3.4.3: 453 + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 454 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 455 + 456 + eslint-visitor-keys@4.2.1: 457 + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 458 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 459 + 460 + eslint@9.32.0: 461 + resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} 462 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 463 + hasBin: true 464 + peerDependencies: 465 + jiti: '*' 466 + peerDependenciesMeta: 467 + jiti: 468 + optional: true 469 + 470 + espree@10.4.0: 471 + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 472 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 473 + 474 + esquery@1.6.0: 475 + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 476 + engines: {node: '>=0.10'} 477 + 478 + esrecurse@4.3.0: 479 + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 480 + engines: {node: '>=4.0'} 481 + 482 + estraverse@5.3.0: 483 + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 484 + engines: {node: '>=4.0'} 485 + 486 + esutils@2.0.3: 487 + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 488 + engines: {node: '>=0.10.0'} 489 + 490 + fast-deep-equal@3.1.3: 491 + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 492 + 493 + fast-json-stable-stringify@2.1.0: 494 + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 495 + 496 + fast-levenshtein@2.0.6: 497 + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 498 + 499 + file-entry-cache@8.0.0: 500 + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 501 + engines: {node: '>=16.0.0'} 502 + 503 + fill-range@7.1.1: 504 + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 505 + engines: {node: '>=8'} 506 + 507 + find-up@5.0.0: 508 + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 509 + engines: {node: '>=10'} 510 + 511 + flat-cache@4.0.1: 512 + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 513 + engines: {node: '>=16'} 514 + 515 + flatted@3.3.3: 516 + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 517 + 518 + fsevents@2.3.3: 519 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 520 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 521 + os: [darwin] 522 + 523 + glob-parent@6.0.2: 524 + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 525 + engines: {node: '>=10.13.0'} 526 + 527 + globals@14.0.0: 528 + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 529 + engines: {node: '>=18'} 530 + 531 + globals@16.3.0: 532 + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} 533 + engines: {node: '>=18'} 534 + 535 + has-flag@4.0.0: 536 + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 537 + engines: {node: '>=8'} 538 + 539 + htmlparser2@9.1.0: 540 + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} 541 + 542 + ignore@5.3.2: 543 + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 544 + engines: {node: '>= 4'} 545 + 546 + import-fresh@3.3.1: 547 + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 548 + engines: {node: '>=6'} 549 + 550 + imurmurhash@0.1.4: 551 + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 552 + engines: {node: '>=0.8.19'} 553 + 554 + is-extglob@2.1.1: 555 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 556 + engines: {node: '>=0.10.0'} 557 + 558 + is-glob@4.0.3: 559 + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 560 + engines: {node: '>=0.10.0'} 561 + 562 + is-number@7.0.0: 563 + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 564 + engines: {node: '>=0.12.0'} 565 + 566 + isexe@2.0.0: 567 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 568 + 569 + js-yaml@4.1.0: 570 + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 571 + hasBin: true 572 + 573 + json-buffer@3.0.1: 574 + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 575 + 576 + json-schema-traverse@0.4.1: 577 + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 578 + 579 + json-stable-stringify-without-jsonify@1.0.1: 580 + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 581 + 582 + keyv@4.5.4: 583 + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 584 + 585 + levn@0.4.1: 586 + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 587 + engines: {node: '>= 0.8.0'} 588 + 589 + locate-path@6.0.0: 590 + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 591 + engines: {node: '>=10'} 592 + 593 + lodash.merge@4.6.2: 594 + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 595 + 596 + micromatch@4.0.8: 597 + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 598 + engines: {node: '>=8.6'} 599 + 600 + minimatch@3.1.2: 601 + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 602 + 603 + ms@2.1.3: 604 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 605 + 606 + nanoid@3.3.11: 607 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 608 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 609 + hasBin: true 610 + 611 + natural-compare@1.4.0: 612 + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 613 + 614 + optionator@0.9.4: 615 + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 616 + engines: {node: '>= 0.8.0'} 617 + 618 + p-limit@3.1.0: 619 + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 620 + engines: {node: '>=10'} 621 + 622 + p-locate@5.0.0: 623 + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 624 + engines: {node: '>=10'} 625 + 626 + parent-module@1.0.1: 627 + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 628 + engines: {node: '>=6'} 629 + 630 + path-exists@4.0.0: 631 + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 632 + engines: {node: '>=8'} 633 + 634 + path-key@3.1.1: 635 + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 636 + engines: {node: '>=8'} 637 + 638 + picocolors@1.1.1: 639 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 640 + 641 + picomatch@2.3.1: 642 + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 643 + engines: {node: '>=8.6'} 644 + 645 + postcss@8.5.6: 646 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 647 + engines: {node: ^10 || ^12 || >=14} 648 + 649 + prelude-ls@1.2.1: 650 + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 651 + engines: {node: '>= 0.8.0'} 652 + 653 + punycode@2.3.1: 654 + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 655 + engines: {node: '>=6'} 656 + 657 + resolve-from@4.0.0: 658 + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 659 + engines: {node: '>=4'} 660 + 661 + rollup@4.46.2: 662 + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} 663 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 664 + hasBin: true 665 + 666 + shebang-command@2.0.0: 667 + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 668 + engines: {node: '>=8'} 669 + 670 + shebang-regex@3.0.0: 671 + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 672 + engines: {node: '>=8'} 673 + 674 + source-map-js@1.2.1: 675 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 676 + engines: {node: '>=0.10.0'} 677 + 678 + strip-json-comments@3.1.1: 679 + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 680 + engines: {node: '>=8'} 681 + 682 + supports-color@7.2.0: 683 + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 684 + engines: {node: '>=8'} 685 + 686 + to-regex-range@5.0.1: 687 + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 688 + engines: {node: '>=8.0'} 689 + 690 + type-check@0.4.0: 691 + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 692 + engines: {node: '>= 0.8.0'} 693 + 694 + uri-js@4.4.1: 695 + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 696 + 697 + vite-plugin-dom@1.0.4: 698 + resolution: {integrity: sha512-GkmDAsVDo0Aabb7RmGTGWZNDowV5K+IkrhmJfrgMpgjHdE7F8H1OsTk48DQmnQ/2llM5UvP4z5h0icdsnL/C/g==} 699 + peerDependencies: 700 + vite: '>=4.0.0' 701 + 702 + vite-plugin-singlefile@2.3.0: 703 + resolution: {integrity: sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==} 704 + engines: {node: '>18.0.0'} 705 + peerDependencies: 706 + rollup: ^4.44.1 707 + vite: ^5.4.11 || ^6.0.0 || ^7.0.0 708 + 709 + vite@5.4.19: 710 + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} 711 + engines: {node: ^18.0.0 || >=20.0.0} 712 + hasBin: true 713 + peerDependencies: 714 + '@types/node': ^18.0.0 || >=20.0.0 715 + less: '*' 716 + lightningcss: ^1.21.0 717 + sass: '*' 718 + sass-embedded: '*' 719 + stylus: '*' 720 + sugarss: '*' 721 + terser: ^5.4.0 722 + peerDependenciesMeta: 723 + '@types/node': 724 + optional: true 725 + less: 726 + optional: true 727 + lightningcss: 728 + optional: true 729 + sass: 730 + optional: true 731 + sass-embedded: 732 + optional: true 733 + stylus: 734 + optional: true 735 + sugarss: 736 + optional: true 737 + terser: 738 + optional: true 739 + 740 + which@2.0.2: 741 + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 742 + engines: {node: '>= 8'} 743 + hasBin: true 744 + 745 + word-wrap@1.2.5: 746 + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 747 + engines: {node: '>=0.10.0'} 748 + 749 + yocto-queue@0.1.0: 750 + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 751 + engines: {node: '>=10'} 752 + 753 + snapshots: 754 + 755 + '@esbuild/aix-ppc64@0.21.5': 756 + optional: true 757 + 758 + '@esbuild/android-arm64@0.21.5': 759 + optional: true 760 + 761 + '@esbuild/android-arm@0.21.5': 762 + optional: true 763 + 764 + '@esbuild/android-x64@0.21.5': 765 + optional: true 766 + 767 + '@esbuild/darwin-arm64@0.21.5': 768 + optional: true 769 + 770 + '@esbuild/darwin-x64@0.21.5': 771 + optional: true 772 + 773 + '@esbuild/freebsd-arm64@0.21.5': 774 + optional: true 775 + 776 + '@esbuild/freebsd-x64@0.21.5': 777 + optional: true 778 + 779 + '@esbuild/linux-arm64@0.21.5': 780 + optional: true 781 + 782 + '@esbuild/linux-arm@0.21.5': 783 + optional: true 784 + 785 + '@esbuild/linux-ia32@0.21.5': 786 + optional: true 787 + 788 + '@esbuild/linux-loong64@0.21.5': 789 + optional: true 790 + 791 + '@esbuild/linux-mips64el@0.21.5': 792 + optional: true 793 + 794 + '@esbuild/linux-ppc64@0.21.5': 795 + optional: true 796 + 797 + '@esbuild/linux-riscv64@0.21.5': 798 + optional: true 799 + 800 + '@esbuild/linux-s390x@0.21.5': 801 + optional: true 802 + 803 + '@esbuild/linux-x64@0.21.5': 804 + optional: true 805 + 806 + '@esbuild/netbsd-x64@0.21.5': 807 + optional: true 808 + 809 + '@esbuild/openbsd-x64@0.21.5': 810 + optional: true 811 + 812 + '@esbuild/sunos-x64@0.21.5': 813 + optional: true 814 + 815 + '@esbuild/win32-arm64@0.21.5': 816 + optional: true 817 + 818 + '@esbuild/win32-ia32@0.21.5': 819 + optional: true 820 + 821 + '@esbuild/win32-x64@0.21.5': 822 + optional: true 823 + 824 + '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0)': 825 + dependencies: 826 + eslint: 9.32.0 827 + eslint-visitor-keys: 3.4.3 828 + 829 + '@eslint-community/regexpp@4.12.1': {} 830 + 831 + '@eslint/config-array@0.21.0': 832 + dependencies: 833 + '@eslint/object-schema': 2.1.6 834 + debug: 4.4.1 835 + minimatch: 3.1.2 836 + transitivePeerDependencies: 837 + - supports-color 838 + 839 + '@eslint/config-helpers@0.3.0': {} 840 + 841 + '@eslint/core@0.15.1': 842 + dependencies: 843 + '@types/json-schema': 7.0.15 844 + 845 + '@eslint/eslintrc@3.3.1': 846 + dependencies: 847 + ajv: 6.12.6 848 + debug: 4.4.1 849 + espree: 10.4.0 850 + globals: 14.0.0 851 + ignore: 5.3.2 852 + import-fresh: 3.3.1 853 + js-yaml: 4.1.0 854 + minimatch: 3.1.2 855 + strip-json-comments: 3.1.1 856 + transitivePeerDependencies: 857 + - supports-color 858 + 859 + '@eslint/js@9.32.0': {} 860 + 861 + '@eslint/object-schema@2.1.6': {} 862 + 863 + '@eslint/plugin-kit@0.3.4': 864 + dependencies: 865 + '@eslint/core': 0.15.1 866 + levn: 0.4.1 867 + 868 + '@humanfs/core@0.19.1': {} 869 + 870 + '@humanfs/node@0.16.6': 871 + dependencies: 872 + '@humanfs/core': 0.19.1 873 + '@humanwhocodes/retry': 0.3.1 874 + 875 + '@humanwhocodes/module-importer@1.0.1': {} 876 + 877 + '@humanwhocodes/retry@0.3.1': {} 878 + 879 + '@humanwhocodes/retry@0.4.3': {} 880 + 881 + '@rollup/rollup-android-arm-eabi@4.46.2': 882 + optional: true 883 + 884 + '@rollup/rollup-android-arm64@4.46.2': 885 + optional: true 886 + 887 + '@rollup/rollup-darwin-arm64@4.46.2': 888 + optional: true 889 + 890 + '@rollup/rollup-darwin-x64@4.46.2': 891 + optional: true 892 + 893 + '@rollup/rollup-freebsd-arm64@4.46.2': 894 + optional: true 895 + 896 + '@rollup/rollup-freebsd-x64@4.46.2': 897 + optional: true 898 + 899 + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': 900 + optional: true 901 + 902 + '@rollup/rollup-linux-arm-musleabihf@4.46.2': 903 + optional: true 904 + 905 + '@rollup/rollup-linux-arm64-gnu@4.46.2': 906 + optional: true 907 + 908 + '@rollup/rollup-linux-arm64-musl@4.46.2': 909 + optional: true 910 + 911 + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': 912 + optional: true 913 + 914 + '@rollup/rollup-linux-ppc64-gnu@4.46.2': 915 + optional: true 916 + 917 + '@rollup/rollup-linux-riscv64-gnu@4.46.2': 918 + optional: true 919 + 920 + '@rollup/rollup-linux-riscv64-musl@4.46.2': 921 + optional: true 922 + 923 + '@rollup/rollup-linux-s390x-gnu@4.46.2': 924 + optional: true 925 + 926 + '@rollup/rollup-linux-x64-gnu@4.46.2': 927 + optional: true 928 + 929 + '@rollup/rollup-linux-x64-musl@4.46.2': 930 + optional: true 931 + 932 + '@rollup/rollup-win32-arm64-msvc@4.46.2': 933 + optional: true 934 + 935 + '@rollup/rollup-win32-ia32-msvc@4.46.2': 936 + optional: true 937 + 938 + '@rollup/rollup-win32-x64-msvc@4.46.2': 939 + optional: true 940 + 941 + '@rollup/wasm-node@4.46.2': 942 + dependencies: 943 + '@types/estree': 1.0.8 944 + optionalDependencies: 945 + fsevents: 2.3.3 946 + 947 + '@types/estree@1.0.8': {} 948 + 949 + '@types/json-schema@7.0.15': {} 950 + 951 + acorn-jsx@5.3.2(acorn@8.15.0): 952 + dependencies: 953 + acorn: 8.15.0 954 + 955 + acorn@8.15.0: {} 956 + 957 + ajv@6.12.6: 958 + dependencies: 959 + fast-deep-equal: 3.1.3 960 + fast-json-stable-stringify: 2.1.0 961 + json-schema-traverse: 0.4.1 962 + uri-js: 4.4.1 963 + 964 + ansi-styles@4.3.0: 965 + dependencies: 966 + color-convert: 2.0.1 967 + 968 + argparse@2.0.1: {} 969 + 970 + balanced-match@1.0.2: {} 971 + 972 + brace-expansion@1.1.12: 973 + dependencies: 974 + balanced-match: 1.0.2 975 + concat-map: 0.0.1 976 + 977 + braces@3.0.3: 978 + dependencies: 979 + fill-range: 7.1.1 980 + 981 + callsites@3.1.0: {} 982 + 983 + chalk@4.1.2: 984 + dependencies: 985 + ansi-styles: 4.3.0 986 + supports-color: 7.2.0 987 + 988 + color-convert@2.0.1: 989 + dependencies: 990 + color-name: 1.1.4 991 + 992 + color-name@1.1.4: {} 993 + 994 + concat-map@0.0.1: {} 995 + 996 + cross-spawn@7.0.6: 997 + dependencies: 998 + path-key: 3.1.1 999 + shebang-command: 2.0.0 1000 + which: 2.0.2 1001 + 1002 + debug@4.4.1: 1003 + dependencies: 1004 + ms: 2.1.3 1005 + 1006 + deep-is@0.1.4: {} 1007 + 1008 + diff@8.0.2: {} 1009 + 1010 + dom-serializer@2.0.0: 1011 + dependencies: 1012 + domelementtype: 2.3.0 1013 + domhandler: 5.0.3 1014 + entities: 4.5.0 1015 + 1016 + domelementtype@2.3.0: {} 1017 + 1018 + domhandler@5.0.3: 1019 + dependencies: 1020 + domelementtype: 2.3.0 1021 + 1022 + domutils@3.2.2: 1023 + dependencies: 1024 + dom-serializer: 2.0.0 1025 + domelementtype: 2.3.0 1026 + domhandler: 5.0.3 1027 + 1028 + entities@4.5.0: {} 1029 + 1030 + esbuild@0.21.5: 1031 + optionalDependencies: 1032 + '@esbuild/aix-ppc64': 0.21.5 1033 + '@esbuild/android-arm': 0.21.5 1034 + '@esbuild/android-arm64': 0.21.5 1035 + '@esbuild/android-x64': 0.21.5 1036 + '@esbuild/darwin-arm64': 0.21.5 1037 + '@esbuild/darwin-x64': 0.21.5 1038 + '@esbuild/freebsd-arm64': 0.21.5 1039 + '@esbuild/freebsd-x64': 0.21.5 1040 + '@esbuild/linux-arm': 0.21.5 1041 + '@esbuild/linux-arm64': 0.21.5 1042 + '@esbuild/linux-ia32': 0.21.5 1043 + '@esbuild/linux-loong64': 0.21.5 1044 + '@esbuild/linux-mips64el': 0.21.5 1045 + '@esbuild/linux-ppc64': 0.21.5 1046 + '@esbuild/linux-riscv64': 0.21.5 1047 + '@esbuild/linux-s390x': 0.21.5 1048 + '@esbuild/linux-x64': 0.21.5 1049 + '@esbuild/netbsd-x64': 0.21.5 1050 + '@esbuild/openbsd-x64': 0.21.5 1051 + '@esbuild/sunos-x64': 0.21.5 1052 + '@esbuild/win32-arm64': 0.21.5 1053 + '@esbuild/win32-ia32': 0.21.5 1054 + '@esbuild/win32-x64': 0.21.5 1055 + 1056 + escape-string-regexp@4.0.0: {} 1057 + 1058 + eslint-scope@8.4.0: 1059 + dependencies: 1060 + esrecurse: 4.3.0 1061 + estraverse: 5.3.0 1062 + 1063 + eslint-visitor-keys@3.4.3: {} 1064 + 1065 + eslint-visitor-keys@4.2.1: {} 1066 + 1067 + eslint@9.32.0: 1068 + dependencies: 1069 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) 1070 + '@eslint-community/regexpp': 4.12.1 1071 + '@eslint/config-array': 0.21.0 1072 + '@eslint/config-helpers': 0.3.0 1073 + '@eslint/core': 0.15.1 1074 + '@eslint/eslintrc': 3.3.1 1075 + '@eslint/js': 9.32.0 1076 + '@eslint/plugin-kit': 0.3.4 1077 + '@humanfs/node': 0.16.6 1078 + '@humanwhocodes/module-importer': 1.0.1 1079 + '@humanwhocodes/retry': 0.4.3 1080 + '@types/estree': 1.0.8 1081 + '@types/json-schema': 7.0.15 1082 + ajv: 6.12.6 1083 + chalk: 4.1.2 1084 + cross-spawn: 7.0.6 1085 + debug: 4.4.1 1086 + escape-string-regexp: 4.0.0 1087 + eslint-scope: 8.4.0 1088 + eslint-visitor-keys: 4.2.1 1089 + espree: 10.4.0 1090 + esquery: 1.6.0 1091 + esutils: 2.0.3 1092 + fast-deep-equal: 3.1.3 1093 + file-entry-cache: 8.0.0 1094 + find-up: 5.0.0 1095 + glob-parent: 6.0.2 1096 + ignore: 5.3.2 1097 + imurmurhash: 0.1.4 1098 + is-glob: 4.0.3 1099 + json-stable-stringify-without-jsonify: 1.0.1 1100 + lodash.merge: 4.6.2 1101 + minimatch: 3.1.2 1102 + natural-compare: 1.4.0 1103 + optionator: 0.9.4 1104 + transitivePeerDependencies: 1105 + - supports-color 1106 + 1107 + espree@10.4.0: 1108 + dependencies: 1109 + acorn: 8.15.0 1110 + acorn-jsx: 5.3.2(acorn@8.15.0) 1111 + eslint-visitor-keys: 4.2.1 1112 + 1113 + esquery@1.6.0: 1114 + dependencies: 1115 + estraverse: 5.3.0 1116 + 1117 + esrecurse@4.3.0: 1118 + dependencies: 1119 + estraverse: 5.3.0 1120 + 1121 + estraverse@5.3.0: {} 1122 + 1123 + esutils@2.0.3: {} 1124 + 1125 + fast-deep-equal@3.1.3: {} 1126 + 1127 + fast-json-stable-stringify@2.1.0: {} 1128 + 1129 + fast-levenshtein@2.0.6: {} 1130 + 1131 + file-entry-cache@8.0.0: 1132 + dependencies: 1133 + flat-cache: 4.0.1 1134 + 1135 + fill-range@7.1.1: 1136 + dependencies: 1137 + to-regex-range: 5.0.1 1138 + 1139 + find-up@5.0.0: 1140 + dependencies: 1141 + locate-path: 6.0.0 1142 + path-exists: 4.0.0 1143 + 1144 + flat-cache@4.0.1: 1145 + dependencies: 1146 + flatted: 3.3.3 1147 + keyv: 4.5.4 1148 + 1149 + flatted@3.3.3: {} 1150 + 1151 + fsevents@2.3.3: 1152 + optional: true 1153 + 1154 + glob-parent@6.0.2: 1155 + dependencies: 1156 + is-glob: 4.0.3 1157 + 1158 + globals@14.0.0: {} 1159 + 1160 + globals@16.3.0: {} 1161 + 1162 + has-flag@4.0.0: {} 1163 + 1164 + htmlparser2@9.1.0: 1165 + dependencies: 1166 + domelementtype: 2.3.0 1167 + domhandler: 5.0.3 1168 + domutils: 3.2.2 1169 + entities: 4.5.0 1170 + 1171 + ignore@5.3.2: {} 1172 + 1173 + import-fresh@3.3.1: 1174 + dependencies: 1175 + parent-module: 1.0.1 1176 + resolve-from: 4.0.0 1177 + 1178 + imurmurhash@0.1.4: {} 1179 + 1180 + is-extglob@2.1.1: {} 1181 + 1182 + is-glob@4.0.3: 1183 + dependencies: 1184 + is-extglob: 2.1.1 1185 + 1186 + is-number@7.0.0: {} 1187 + 1188 + isexe@2.0.0: {} 1189 + 1190 + js-yaml@4.1.0: 1191 + dependencies: 1192 + argparse: 2.0.1 1193 + 1194 + json-buffer@3.0.1: {} 1195 + 1196 + json-schema-traverse@0.4.1: {} 1197 + 1198 + json-stable-stringify-without-jsonify@1.0.1: {} 1199 + 1200 + keyv@4.5.4: 1201 + dependencies: 1202 + json-buffer: 3.0.1 1203 + 1204 + levn@0.4.1: 1205 + dependencies: 1206 + prelude-ls: 1.2.1 1207 + type-check: 0.4.0 1208 + 1209 + locate-path@6.0.0: 1210 + dependencies: 1211 + p-locate: 5.0.0 1212 + 1213 + lodash.merge@4.6.2: {} 1214 + 1215 + micromatch@4.0.8: 1216 + dependencies: 1217 + braces: 3.0.3 1218 + picomatch: 2.3.1 1219 + 1220 + minimatch@3.1.2: 1221 + dependencies: 1222 + brace-expansion: 1.1.12 1223 + 1224 + ms@2.1.3: {} 1225 + 1226 + nanoid@3.3.11: {} 1227 + 1228 + natural-compare@1.4.0: {} 1229 + 1230 + optionator@0.9.4: 1231 + dependencies: 1232 + deep-is: 0.1.4 1233 + fast-levenshtein: 2.0.6 1234 + levn: 0.4.1 1235 + prelude-ls: 1.2.1 1236 + type-check: 0.4.0 1237 + word-wrap: 1.2.5 1238 + 1239 + p-limit@3.1.0: 1240 + dependencies: 1241 + yocto-queue: 0.1.0 1242 + 1243 + p-locate@5.0.0: 1244 + dependencies: 1245 + p-limit: 3.1.0 1246 + 1247 + parent-module@1.0.1: 1248 + dependencies: 1249 + callsites: 3.1.0 1250 + 1251 + path-exists@4.0.0: {} 1252 + 1253 + path-key@3.1.1: {} 1254 + 1255 + picocolors@1.1.1: {} 1256 + 1257 + picomatch@2.3.1: {} 1258 + 1259 + postcss@8.5.6: 1260 + dependencies: 1261 + nanoid: 3.3.11 1262 + picocolors: 1.1.1 1263 + source-map-js: 1.2.1 1264 + 1265 + prelude-ls@1.2.1: {} 1266 + 1267 + punycode@2.3.1: {} 1268 + 1269 + resolve-from@4.0.0: {} 1270 + 1271 + rollup@4.46.2: 1272 + dependencies: 1273 + '@types/estree': 1.0.8 1274 + optionalDependencies: 1275 + '@rollup/rollup-android-arm-eabi': 4.46.2 1276 + '@rollup/rollup-android-arm64': 4.46.2 1277 + '@rollup/rollup-darwin-arm64': 4.46.2 1278 + '@rollup/rollup-darwin-x64': 4.46.2 1279 + '@rollup/rollup-freebsd-arm64': 4.46.2 1280 + '@rollup/rollup-freebsd-x64': 4.46.2 1281 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 1282 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 1283 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 1284 + '@rollup/rollup-linux-arm64-musl': 4.46.2 1285 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 1286 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 1287 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 1288 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 1289 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 1290 + '@rollup/rollup-linux-x64-gnu': 4.46.2 1291 + '@rollup/rollup-linux-x64-musl': 4.46.2 1292 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 1293 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 1294 + '@rollup/rollup-win32-x64-msvc': 4.46.2 1295 + fsevents: 2.3.3 1296 + 1297 + shebang-command@2.0.0: 1298 + dependencies: 1299 + shebang-regex: 3.0.0 1300 + 1301 + shebang-regex@3.0.0: {} 1302 + 1303 + source-map-js@1.2.1: {} 1304 + 1305 + strip-json-comments@3.1.1: {} 1306 + 1307 + supports-color@7.2.0: 1308 + dependencies: 1309 + has-flag: 4.0.0 1310 + 1311 + to-regex-range@5.0.1: 1312 + dependencies: 1313 + is-number: 7.0.0 1314 + 1315 + type-check@0.4.0: 1316 + dependencies: 1317 + prelude-ls: 1.2.1 1318 + 1319 + uri-js@4.4.1: 1320 + dependencies: 1321 + punycode: 2.3.1 1322 + 1323 + vite-plugin-dom@1.0.4(vite@5.4.19): 1324 + dependencies: 1325 + htmlparser2: 9.1.0 1326 + vite: 5.4.19 1327 + 1328 + vite-plugin-singlefile@2.3.0(rollup@4.46.2)(vite@5.4.19): 1329 + dependencies: 1330 + micromatch: 4.0.8 1331 + rollup: 4.46.2 1332 + vite: 5.4.19 1333 + 1334 + vite@5.4.19: 1335 + dependencies: 1336 + esbuild: 0.21.5 1337 + postcss: 8.5.6 1338 + rollup: '@rollup/wasm-node@4.46.2' 1339 + optionalDependencies: 1340 + fsevents: 2.3.3 1341 + 1342 + which@2.0.2: 1343 + dependencies: 1344 + isexe: 2.0.0 1345 + 1346 + word-wrap@1.2.5: {} 1347 + 1348 + yocto-queue@0.1.0: {}
+7 -5
release.sh
··· 1 1 #!/bin/sh 2 2 set -e 3 3 FILES=" 4 - asn1.js oids.js defs.js base64.js hex.js int10.js dom.js rfcdef.js test.js tags.js 5 - context.js index.css index-dark.css index.js index.html favicon.svg index-local.html 6 - README.md LICENSE 4 + asn1.js oids.js defs.js base64.js hex.js int10.js dom.js context.js theme.js 5 + rfcdef.js test.js tags.js 6 + index.html index.css index.js index-local.html 7 + favicon.svg tree-icon-light.svg tree-icon-dark.svg 8 + README.md LICENSE CHANGELOG.md 7 9 updateOID.sh check.sh 8 - examples/* 10 + examples 9 11 " 10 12 mtn automate tags 'it.lapo.asn1js{,.*}' | \ 11 13 awk '/^revision/ { print substr($2, 2, length($2) - 2)}' | \ ··· 28 30 type gsha256sum >/dev/null 2>/dev/null && SHA256=gsha256sum || SHA256=sha256sum 29 31 pnpm build 30 32 cp dist/index.html index-local.html 31 - $SHA256 -t $FILES | gpg --clearsign > sha256sums.asc 33 + $SHA256 -t $FILES examples/* | gpg --clearsign > sha256sums.asc 32 34 7z a -tzip -mx=9 asn1js.zip $FILES sha256sums.asc 33 35 rsync -Pvrtz asn1js.zip $FILES lapo.it:www/asn1js/
+1503 -3
rfcdef.js
··· 1 - // content parsed from ASN.1 definitions as found in the following RFCs: 5280 5208 3369 3161 2986 4211 4210 8017 1 + // content parsed from ASN.1 definitions as found in the following RFCs: 5280 5208 3369 3161 2986 4211 4210 8017 4511 2 2 // Copyright (C) The IETF Trust (2008) 3 3 // as far as I can tell this file is allowed under the following clause: 4 4 // It is acceptable under the current IETF rules (RFC 5378) to modify extracted code if necessary. ··· 1983 1983 "CountryName": { 1984 1984 "name": "CountryName", 1985 1985 "type": { 1986 - "name": "[1]", 1986 + "name": "Application 1", 1987 1987 "type": "tag", 1988 1988 "class": "APPLICATION", 1989 1989 "explicit": true, ··· 2015 2015 "AdministrationDomainName": { 2016 2016 "name": "AdministrationDomainName", 2017 2017 "type": { 2018 - "name": "[2]", 2018 + "name": "Application 2", 2019 2019 "type": "tag", 2020 2020 "class": "APPLICATION", 2021 2021 "explicit": true, ··· 10369 10369 "type": { 10370 10370 "name": "AlgorithmIdentifier", 10371 10371 "type": "defined" 10372 + } 10373 + } 10374 + } 10375 + }, 10376 + "1.3.6.1.1.18": { 10377 + "name": "Lightweight-Directory-Access-Protocol-V3", 10378 + "oid": "1.3.6.1.1.18", 10379 + "source": "rfc4511.txt", 10380 + "tagDefault": "IMPLICIT", 10381 + "values": { 10382 + "maxInt": { 10383 + "name": "maxInt", 10384 + "type": { 10385 + "name": "INTEGER", 10386 + "type": "builtin" 10387 + }, 10388 + "value": 2147483647 10389 + } 10390 + }, 10391 + "types": { 10392 + "LDAPMessage": { 10393 + "name": "LDAPMessage", 10394 + "type": { 10395 + "name": "SEQUENCE", 10396 + "type": "builtin", 10397 + "content": [ 10398 + { 10399 + "id": "messageID", 10400 + "name": "MessageID", 10401 + "type": "defined" 10402 + }, 10403 + { 10404 + "id": "protocolOp", 10405 + "name": "CHOICE", 10406 + "type": "builtin", 10407 + "content": [ 10408 + { 10409 + "id": "bindRequest", 10410 + "name": "BindRequest", 10411 + "type": "defined" 10412 + }, 10413 + { 10414 + "id": "bindResponse", 10415 + "name": "BindResponse", 10416 + "type": "defined" 10417 + }, 10418 + { 10419 + "id": "unbindRequest", 10420 + "name": "UnbindRequest", 10421 + "type": "defined" 10422 + }, 10423 + { 10424 + "id": "searchRequest", 10425 + "name": "SearchRequest", 10426 + "type": "defined" 10427 + }, 10428 + { 10429 + "id": "searchResEntry", 10430 + "name": "SearchResultEntry", 10431 + "type": "defined" 10432 + }, 10433 + { 10434 + "id": "searchResDone", 10435 + "name": "SearchResultDone", 10436 + "type": "defined" 10437 + }, 10438 + { 10439 + "id": "searchResRef", 10440 + "name": "SearchResultReference", 10441 + "type": "defined" 10442 + }, 10443 + { 10444 + "id": "modifyRequest", 10445 + "name": "ModifyRequest", 10446 + "type": "defined" 10447 + }, 10448 + { 10449 + "id": "modifyResponse", 10450 + "name": "ModifyResponse", 10451 + "type": "defined" 10452 + }, 10453 + { 10454 + "id": "addRequest", 10455 + "name": "AddRequest", 10456 + "type": "defined" 10457 + }, 10458 + { 10459 + "id": "addResponse", 10460 + "name": "AddResponse", 10461 + "type": "defined" 10462 + }, 10463 + { 10464 + "id": "delRequest", 10465 + "name": "DelRequest", 10466 + "type": "defined" 10467 + }, 10468 + { 10469 + "id": "delResponse", 10470 + "name": "DelResponse", 10471 + "type": "defined" 10472 + }, 10473 + { 10474 + "id": "modDNRequest", 10475 + "name": "ModifyDNRequest", 10476 + "type": "defined" 10477 + }, 10478 + { 10479 + "id": "modDNResponse", 10480 + "name": "ModifyDNResponse", 10481 + "type": "defined" 10482 + }, 10483 + { 10484 + "id": "compareRequest", 10485 + "name": "CompareRequest", 10486 + "type": "defined" 10487 + }, 10488 + { 10489 + "id": "compareResponse", 10490 + "name": "CompareResponse", 10491 + "type": "defined" 10492 + }, 10493 + { 10494 + "id": "abandonRequest", 10495 + "name": "AbandonRequest", 10496 + "type": "defined" 10497 + }, 10498 + { 10499 + "id": "extendedReq", 10500 + "name": "ExtendedRequest", 10501 + "type": "defined" 10502 + }, 10503 + { 10504 + "id": "extendedResp", 10505 + "name": "ExtendedResponse", 10506 + "type": "defined" 10507 + }, 10508 + { 10509 + "id": "intermediateResponse", 10510 + "name": "IntermediateResponse", 10511 + "type": "defined" 10512 + } 10513 + ] 10514 + }, 10515 + { 10516 + "id": "controls", 10517 + "name": "[0]", 10518 + "type": "tag", 10519 + "class": "CONTEXT", 10520 + "explicit": false, 10521 + "content": [ 10522 + { 10523 + "name": "", 10524 + "type": { 10525 + "name": "Controls", 10526 + "type": "defined" 10527 + } 10528 + } 10529 + ], 10530 + "optional": true 10531 + } 10532 + ] 10533 + } 10534 + }, 10535 + "MessageID": { 10536 + "name": "MessageID", 10537 + "type": { 10538 + "name": "INTEGER", 10539 + "type": "builtin", 10540 + "range": [ 10541 + 0, 10542 + "maxInt" 10543 + ] 10544 + } 10545 + }, 10546 + "LDAPString": { 10547 + "name": "LDAPString", 10548 + "type": { 10549 + "name": "OCTET STRING", 10550 + "type": "builtin" 10551 + } 10552 + }, 10553 + "LDAPOID": { 10554 + "name": "LDAPOID", 10555 + "type": { 10556 + "name": "OCTET STRING", 10557 + "type": "builtin" 10558 + } 10559 + }, 10560 + "LDAPDN": { 10561 + "name": "LDAPDN", 10562 + "type": { 10563 + "name": "LDAPString", 10564 + "type": "defined" 10565 + } 10566 + }, 10567 + "RelativeLDAPDN": { 10568 + "name": "RelativeLDAPDN", 10569 + "type": { 10570 + "name": "LDAPString", 10571 + "type": "defined" 10572 + } 10573 + }, 10574 + "AttributeDescription": { 10575 + "name": "AttributeDescription", 10576 + "type": { 10577 + "name": "LDAPString", 10578 + "type": "defined" 10579 + } 10580 + }, 10581 + "AttributeValue": { 10582 + "name": "AttributeValue", 10583 + "type": { 10584 + "name": "OCTET STRING", 10585 + "type": "builtin" 10586 + } 10587 + }, 10588 + "AttributeValueAssertion": { 10589 + "name": "AttributeValueAssertion", 10590 + "type": { 10591 + "name": "SEQUENCE", 10592 + "type": "builtin", 10593 + "content": [ 10594 + { 10595 + "id": "attributeDesc", 10596 + "name": "AttributeDescription", 10597 + "type": "defined" 10598 + }, 10599 + { 10600 + "id": "assertionValue", 10601 + "name": "AssertionValue", 10602 + "type": "defined" 10603 + } 10604 + ] 10605 + } 10606 + }, 10607 + "AssertionValue": { 10608 + "name": "AssertionValue", 10609 + "type": { 10610 + "name": "OCTET STRING", 10611 + "type": "builtin" 10612 + } 10613 + }, 10614 + "PartialAttribute": { 10615 + "name": "PartialAttribute", 10616 + "type": { 10617 + "name": "SEQUENCE", 10618 + "type": "builtin", 10619 + "content": [ 10620 + { 10621 + "id": "type", 10622 + "name": "AttributeDescription", 10623 + "type": "defined" 10624 + }, 10625 + { 10626 + "id": "vals", 10627 + "name": "SET", 10628 + "type": "builtin", 10629 + "typeOf": 1, 10630 + "size": [ 10631 + 1, 10632 + "MAX" 10633 + ], 10634 + "content": [ 10635 + { 10636 + "name": "AttributeValue", 10637 + "type": "defined" 10638 + } 10639 + ] 10640 + } 10641 + ] 10642 + } 10643 + }, 10644 + "MatchingRuleId": { 10645 + "name": "MatchingRuleId", 10646 + "type": { 10647 + "name": "LDAPString", 10648 + "type": "defined" 10649 + } 10650 + }, 10651 + "LDAPResult": { 10652 + "name": "LDAPResult", 10653 + "type": { 10654 + "name": "SEQUENCE", 10655 + "type": "builtin", 10656 + "content": [ 10657 + { 10658 + "id": "resultCode", 10659 + "name": "ENUMERATED", 10660 + "type": "builtin", 10661 + "content": { 10662 + "success": 0, 10663 + "operationsError": 1, 10664 + "protocolError": 2, 10665 + "timeLimitExceeded": 3, 10666 + "sizeLimitExceeded": 4, 10667 + "compareFalse": 5, 10668 + "compareTrue": 6, 10669 + "authMethodNotSupported": 7, 10670 + "strongerAuthRequired": 8, 10671 + "referral": 10, 10672 + "adminLimitExceeded": 11, 10673 + "unavailableCriticalExtension": 12, 10674 + "confidentialityRequired": 13, 10675 + "saslBindInProgress": 14, 10676 + "noSuchAttribute": 16, 10677 + "undefinedAttributeType": 17, 10678 + "inappropriateMatching": 18, 10679 + "constraintViolation": 19, 10680 + "attributeOrValueExists": 20, 10681 + "invalidAttributeSyntax": 21, 10682 + "noSuchObject": 32, 10683 + "aliasProblem": 33, 10684 + "invalidDNSyntax": 34, 10685 + "aliasDereferencingProblem": 36, 10686 + "inappropriateAuthentication": 48, 10687 + "invalidCredentials": 49, 10688 + "insufficientAccessRights": 50, 10689 + "busy": 51, 10690 + "unavailable": 52, 10691 + "unwillingToPerform": 53, 10692 + "loopDetect": 54, 10693 + "namingViolation": 64, 10694 + "objectClassViolation": 65, 10695 + "notAllowedOnNonLeaf": 66, 10696 + "notAllowedOnRDN": 67, 10697 + "entryAlreadyExists": 68, 10698 + "objectClassModsProhibited": 69, 10699 + "affectsMultipleDSAs": 71, 10700 + "other": 80 10701 + } 10702 + }, 10703 + { 10704 + "id": "matchedDN", 10705 + "name": "LDAPDN", 10706 + "type": "defined" 10707 + }, 10708 + { 10709 + "id": "diagnosticMessage", 10710 + "name": "LDAPString", 10711 + "type": "defined" 10712 + }, 10713 + { 10714 + "id": "referral", 10715 + "name": "[3]", 10716 + "type": "tag", 10717 + "class": "CONTEXT", 10718 + "explicit": false, 10719 + "content": [ 10720 + { 10721 + "name": "", 10722 + "type": { 10723 + "name": "Referral", 10724 + "type": "defined" 10725 + } 10726 + } 10727 + ], 10728 + "optional": true 10729 + } 10730 + ] 10731 + } 10732 + }, 10733 + "Referral": { 10734 + "name": "Referral", 10735 + "type": { 10736 + "name": "SEQUENCE", 10737 + "type": "builtin", 10738 + "typeOf": 1, 10739 + "size": [ 10740 + 1, 10741 + "MAX" 10742 + ], 10743 + "content": [ 10744 + { 10745 + "name": "URI", 10746 + "type": "defined" 10747 + } 10748 + ] 10749 + } 10750 + }, 10751 + "URI": { 10752 + "name": "URI", 10753 + "type": { 10754 + "name": "LDAPString", 10755 + "type": "defined" 10756 + } 10757 + }, 10758 + "Controls": { 10759 + "name": "Controls", 10760 + "type": { 10761 + "name": "SEQUENCE", 10762 + "type": "builtin", 10763 + "typeOf": 1, 10764 + "content": [ 10765 + { 10766 + "name": "Control", 10767 + "type": "defined" 10768 + } 10769 + ] 10770 + } 10771 + }, 10772 + "Control": { 10773 + "name": "Control", 10774 + "type": { 10775 + "name": "SEQUENCE", 10776 + "type": "builtin", 10777 + "content": [ 10778 + { 10779 + "id": "controlType", 10780 + "name": "LDAPOID", 10781 + "type": "defined" 10782 + }, 10783 + { 10784 + "id": "criticality", 10785 + "name": "BOOLEAN", 10786 + "type": "builtin", 10787 + "default": false 10788 + }, 10789 + { 10790 + "id": "controlValue", 10791 + "name": "OCTET STRING", 10792 + "type": "builtin", 10793 + "optional": true 10794 + } 10795 + ] 10796 + } 10797 + }, 10798 + "BindRequest": { 10799 + "name": "BindRequest", 10800 + "type": { 10801 + "name": "Application 0", 10802 + "type": "tag", 10803 + "class": "APPLICATION", 10804 + "explicit": false, 10805 + "content": [ 10806 + { 10807 + "name": "", 10808 + "type": { 10809 + "name": "SEQUENCE", 10810 + "type": "builtin", 10811 + "content": [ 10812 + { 10813 + "id": "version", 10814 + "name": "INTEGER", 10815 + "type": "builtin", 10816 + "range": [ 10817 + 1, 10818 + 127 10819 + ] 10820 + }, 10821 + { 10822 + "id": "name", 10823 + "name": "LDAPDN", 10824 + "type": "defined" 10825 + }, 10826 + { 10827 + "id": "authentication", 10828 + "name": "AuthenticationChoice", 10829 + "type": "defined" 10830 + } 10831 + ] 10832 + } 10833 + } 10834 + ] 10835 + } 10836 + }, 10837 + "AuthenticationChoice": { 10838 + "name": "AuthenticationChoice", 10839 + "type": { 10840 + "name": "CHOICE", 10841 + "type": "builtin", 10842 + "content": [ 10843 + { 10844 + "id": "simple", 10845 + "name": "[0]", 10846 + "type": "tag", 10847 + "class": "CONTEXT", 10848 + "explicit": false, 10849 + "content": [ 10850 + { 10851 + "name": "", 10852 + "type": { 10853 + "name": "OCTET STRING", 10854 + "type": "builtin" 10855 + } 10856 + } 10857 + ] 10858 + }, 10859 + { 10860 + "id": "sasl", 10861 + "name": "[3]", 10862 + "type": "tag", 10863 + "class": "CONTEXT", 10864 + "explicit": false, 10865 + "content": [ 10866 + { 10867 + "name": "", 10868 + "type": { 10869 + "name": "SaslCredentials", 10870 + "type": "defined" 10871 + } 10872 + } 10873 + ] 10874 + } 10875 + ] 10876 + } 10877 + }, 10878 + "SaslCredentials": { 10879 + "name": "SaslCredentials", 10880 + "type": { 10881 + "name": "SEQUENCE", 10882 + "type": "builtin", 10883 + "content": [ 10884 + { 10885 + "id": "mechanism", 10886 + "name": "LDAPString", 10887 + "type": "defined" 10888 + }, 10889 + { 10890 + "id": "credentials", 10891 + "name": "OCTET STRING", 10892 + "type": "builtin", 10893 + "optional": true 10894 + } 10895 + ] 10896 + } 10897 + }, 10898 + "BindResponse": { 10899 + "name": "BindResponse", 10900 + "type": { 10901 + "name": "ANY", 10902 + "type": "builtin" 10903 + } 10904 + }, 10905 + "UnbindRequest": { 10906 + "name": "UnbindRequest", 10907 + "type": { 10908 + "name": "Application 2", 10909 + "type": "tag", 10910 + "class": "APPLICATION", 10911 + "explicit": false, 10912 + "content": [ 10913 + { 10914 + "name": "", 10915 + "type": { 10916 + "name": "NULL", 10917 + "type": "builtin" 10918 + } 10919 + } 10920 + ] 10921 + } 10922 + }, 10923 + "SearchRequest": { 10924 + "name": "SearchRequest", 10925 + "type": { 10926 + "name": "Application 3", 10927 + "type": "tag", 10928 + "class": "APPLICATION", 10929 + "explicit": false, 10930 + "content": [ 10931 + { 10932 + "name": "", 10933 + "type": { 10934 + "name": "SEQUENCE", 10935 + "type": "builtin", 10936 + "content": [ 10937 + { 10938 + "id": "baseObject", 10939 + "name": "LDAPDN", 10940 + "type": "defined" 10941 + }, 10942 + { 10943 + "id": "scope", 10944 + "name": "ENUMERATED", 10945 + "type": "builtin", 10946 + "content": { 10947 + "baseObject": 0, 10948 + "singleLevel": 1, 10949 + "wholeSubtree": 2 10950 + } 10951 + }, 10952 + { 10953 + "id": "derefAliases", 10954 + "name": "ENUMERATED", 10955 + "type": "builtin", 10956 + "content": { 10957 + "neverDerefAliases": 0, 10958 + "derefInSearching": 1, 10959 + "derefFindingBaseObj": 2, 10960 + "derefAlways": 3 10961 + } 10962 + }, 10963 + { 10964 + "id": "sizeLimit", 10965 + "name": "INTEGER", 10966 + "type": "builtin", 10967 + "range": [ 10968 + 0, 10969 + "maxInt" 10970 + ] 10971 + }, 10972 + { 10973 + "id": "timeLimit", 10974 + "name": "INTEGER", 10975 + "type": "builtin", 10976 + "range": [ 10977 + 0, 10978 + "maxInt" 10979 + ] 10980 + }, 10981 + { 10982 + "id": "typesOnly", 10983 + "name": "BOOLEAN", 10984 + "type": "builtin" 10985 + }, 10986 + { 10987 + "id": "filter", 10988 + "name": "Filter", 10989 + "type": "defined" 10990 + }, 10991 + { 10992 + "id": "attributes", 10993 + "name": "AttributeSelection", 10994 + "type": "defined" 10995 + } 10996 + ] 10997 + } 10998 + } 10999 + ] 11000 + } 11001 + }, 11002 + "AttributeSelection": { 11003 + "name": "AttributeSelection", 11004 + "type": { 11005 + "name": "SEQUENCE", 11006 + "type": "builtin", 11007 + "typeOf": 1, 11008 + "content": [ 11009 + { 11010 + "name": "LDAPString", 11011 + "type": "defined" 11012 + } 11013 + ] 11014 + } 11015 + }, 11016 + "Filter": { 11017 + "name": "Filter", 11018 + "type": { 11019 + "name": "CHOICE", 11020 + "type": "builtin", 11021 + "content": [ 11022 + { 11023 + "id": "and", 11024 + "name": "[0]", 11025 + "type": "tag", 11026 + "class": "CONTEXT", 11027 + "explicit": false, 11028 + "content": [ 11029 + { 11030 + "name": "", 11031 + "type": { 11032 + "name": "SET", 11033 + "type": "builtin", 11034 + "typeOf": 1, 11035 + "size": [ 11036 + 1, 11037 + "MAX" 11038 + ], 11039 + "content": [ 11040 + { 11041 + "name": "Filter", 11042 + "type": "defined" 11043 + } 11044 + ] 11045 + } 11046 + } 11047 + ] 11048 + }, 11049 + { 11050 + "id": "or", 11051 + "name": "[1]", 11052 + "type": "tag", 11053 + "class": "CONTEXT", 11054 + "explicit": false, 11055 + "content": [ 11056 + { 11057 + "name": "", 11058 + "type": { 11059 + "name": "SET", 11060 + "type": "builtin", 11061 + "typeOf": 1, 11062 + "size": [ 11063 + 1, 11064 + "MAX" 11065 + ], 11066 + "content": [ 11067 + { 11068 + "name": "Filter", 11069 + "type": "defined" 11070 + } 11071 + ] 11072 + } 11073 + } 11074 + ] 11075 + }, 11076 + { 11077 + "id": "not", 11078 + "name": "[2]", 11079 + "type": "tag", 11080 + "class": "CONTEXT", 11081 + "explicit": false, 11082 + "content": [ 11083 + { 11084 + "name": "", 11085 + "type": { 11086 + "name": "Filter", 11087 + "type": "defined" 11088 + } 11089 + } 11090 + ] 11091 + }, 11092 + { 11093 + "id": "equalityMatch", 11094 + "name": "[3]", 11095 + "type": "tag", 11096 + "class": "CONTEXT", 11097 + "explicit": false, 11098 + "content": [ 11099 + { 11100 + "name": "", 11101 + "type": { 11102 + "name": "AttributeValueAssertion", 11103 + "type": "defined" 11104 + } 11105 + } 11106 + ] 11107 + }, 11108 + { 11109 + "id": "substrings", 11110 + "name": "[4]", 11111 + "type": "tag", 11112 + "class": "CONTEXT", 11113 + "explicit": false, 11114 + "content": [ 11115 + { 11116 + "name": "", 11117 + "type": { 11118 + "name": "SubstringFilter", 11119 + "type": "defined" 11120 + } 11121 + } 11122 + ] 11123 + }, 11124 + { 11125 + "id": "greaterOrEqual", 11126 + "name": "[5]", 11127 + "type": "tag", 11128 + "class": "CONTEXT", 11129 + "explicit": false, 11130 + "content": [ 11131 + { 11132 + "name": "", 11133 + "type": { 11134 + "name": "AttributeValueAssertion", 11135 + "type": "defined" 11136 + } 11137 + } 11138 + ] 11139 + }, 11140 + { 11141 + "id": "lessOrEqual", 11142 + "name": "[6]", 11143 + "type": "tag", 11144 + "class": "CONTEXT", 11145 + "explicit": false, 11146 + "content": [ 11147 + { 11148 + "name": "", 11149 + "type": { 11150 + "name": "AttributeValueAssertion", 11151 + "type": "defined" 11152 + } 11153 + } 11154 + ] 11155 + }, 11156 + { 11157 + "id": "present", 11158 + "name": "[7]", 11159 + "type": "tag", 11160 + "class": "CONTEXT", 11161 + "explicit": false, 11162 + "content": [ 11163 + { 11164 + "name": "", 11165 + "type": { 11166 + "name": "AttributeDescription", 11167 + "type": "defined" 11168 + } 11169 + } 11170 + ] 11171 + }, 11172 + { 11173 + "id": "approxMatch", 11174 + "name": "[8]", 11175 + "type": "tag", 11176 + "class": "CONTEXT", 11177 + "explicit": false, 11178 + "content": [ 11179 + { 11180 + "name": "", 11181 + "type": { 11182 + "name": "AttributeValueAssertion", 11183 + "type": "defined" 11184 + } 11185 + } 11186 + ] 11187 + }, 11188 + { 11189 + "id": "extensibleMatch", 11190 + "name": "[9]", 11191 + "type": "tag", 11192 + "class": "CONTEXT", 11193 + "explicit": false, 11194 + "content": [ 11195 + { 11196 + "name": "", 11197 + "type": { 11198 + "name": "MatchingRuleAssertion", 11199 + "type": "defined" 11200 + } 11201 + } 11202 + ] 11203 + } 11204 + ] 11205 + } 11206 + }, 11207 + "SubstringFilter": { 11208 + "name": "SubstringFilter", 11209 + "type": { 11210 + "name": "SEQUENCE", 11211 + "type": "builtin", 11212 + "content": [ 11213 + { 11214 + "id": "type", 11215 + "name": "AttributeDescription", 11216 + "type": "defined" 11217 + }, 11218 + { 11219 + "id": "substrings", 11220 + "name": "SEQUENCE", 11221 + "type": "builtin", 11222 + "typeOf": 1, 11223 + "size": [ 11224 + 1, 11225 + "MAX" 11226 + ], 11227 + "content": [ 11228 + { 11229 + "name": "CHOICE", 11230 + "type": "builtin", 11231 + "content": [ 11232 + { 11233 + "id": "initial", 11234 + "name": "[0]", 11235 + "type": "tag", 11236 + "class": "CONTEXT", 11237 + "explicit": false, 11238 + "content": [ 11239 + { 11240 + "name": "", 11241 + "type": { 11242 + "name": "AssertionValue", 11243 + "type": "defined" 11244 + } 11245 + } 11246 + ] 11247 + }, 11248 + { 11249 + "id": "any", 11250 + "name": "[1]", 11251 + "type": "tag", 11252 + "class": "CONTEXT", 11253 + "explicit": false, 11254 + "content": [ 11255 + { 11256 + "name": "", 11257 + "type": { 11258 + "name": "AssertionValue", 11259 + "type": "defined" 11260 + } 11261 + } 11262 + ] 11263 + }, 11264 + { 11265 + "id": "final", 11266 + "name": "[2]", 11267 + "type": "tag", 11268 + "class": "CONTEXT", 11269 + "explicit": false, 11270 + "content": [ 11271 + { 11272 + "name": "", 11273 + "type": { 11274 + "name": "AssertionValue", 11275 + "type": "defined" 11276 + } 11277 + } 11278 + ] 11279 + } 11280 + ] 11281 + } 11282 + ] 11283 + } 11284 + ] 11285 + } 11286 + }, 11287 + "MatchingRuleAssertion": { 11288 + "name": "MatchingRuleAssertion", 11289 + "type": { 11290 + "name": "SEQUENCE", 11291 + "type": "builtin", 11292 + "content": [ 11293 + { 11294 + "id": "matchingRule", 11295 + "name": "[1]", 11296 + "type": "tag", 11297 + "class": "CONTEXT", 11298 + "explicit": false, 11299 + "content": [ 11300 + { 11301 + "name": "", 11302 + "type": { 11303 + "name": "MatchingRuleId", 11304 + "type": "defined" 11305 + } 11306 + } 11307 + ], 11308 + "optional": true 11309 + }, 11310 + { 11311 + "id": "type", 11312 + "name": "[2]", 11313 + "type": "tag", 11314 + "class": "CONTEXT", 11315 + "explicit": false, 11316 + "content": [ 11317 + { 11318 + "name": "", 11319 + "type": { 11320 + "name": "AttributeDescription", 11321 + "type": "defined" 11322 + } 11323 + } 11324 + ], 11325 + "optional": true 11326 + }, 11327 + { 11328 + "id": "matchValue", 11329 + "name": "[3]", 11330 + "type": "tag", 11331 + "class": "CONTEXT", 11332 + "explicit": false, 11333 + "content": [ 11334 + { 11335 + "name": "", 11336 + "type": { 11337 + "name": "AssertionValue", 11338 + "type": "defined" 11339 + } 11340 + } 11341 + ] 11342 + }, 11343 + { 11344 + "id": "dnAttributes", 11345 + "name": "[4]", 11346 + "type": "tag", 11347 + "class": "CONTEXT", 11348 + "explicit": false, 11349 + "content": [ 11350 + { 11351 + "name": "", 11352 + "type": { 11353 + "name": "BOOLEAN", 11354 + "type": "builtin" 11355 + } 11356 + } 11357 + ], 11358 + "default": false 11359 + } 11360 + ] 11361 + } 11362 + }, 11363 + "SearchResultEntry": { 11364 + "name": "SearchResultEntry", 11365 + "type": { 11366 + "name": "Application 4", 11367 + "type": "tag", 11368 + "class": "APPLICATION", 11369 + "explicit": false, 11370 + "content": [ 11371 + { 11372 + "name": "", 11373 + "type": { 11374 + "name": "SEQUENCE", 11375 + "type": "builtin", 11376 + "content": [ 11377 + { 11378 + "id": "objectName", 11379 + "name": "LDAPDN", 11380 + "type": "defined" 11381 + }, 11382 + { 11383 + "id": "attributes", 11384 + "name": "PartialAttributeList", 11385 + "type": "defined" 11386 + } 11387 + ] 11388 + } 11389 + } 11390 + ] 11391 + } 11392 + }, 11393 + "PartialAttributeList": { 11394 + "name": "PartialAttributeList", 11395 + "type": { 11396 + "name": "SEQUENCE", 11397 + "type": "builtin", 11398 + "typeOf": 1, 11399 + "content": [ 11400 + { 11401 + "name": "PartialAttribute", 11402 + "type": "defined" 11403 + } 11404 + ] 11405 + } 11406 + }, 11407 + "SearchResultReference": { 11408 + "name": "SearchResultReference", 11409 + "type": { 11410 + "name": "Application 19", 11411 + "type": "tag", 11412 + "class": "APPLICATION", 11413 + "explicit": false, 11414 + "content": [ 11415 + { 11416 + "name": "", 11417 + "type": { 11418 + "name": "SEQUENCE", 11419 + "type": "builtin", 11420 + "typeOf": 1, 11421 + "size": [ 11422 + 1, 11423 + "MAX" 11424 + ], 11425 + "content": [ 11426 + { 11427 + "name": "URI", 11428 + "type": "defined" 11429 + } 11430 + ] 11431 + } 11432 + } 11433 + ] 11434 + } 11435 + }, 11436 + "SearchResultDone": { 11437 + "name": "SearchResultDone", 11438 + "type": { 11439 + "name": "Application 5", 11440 + "type": "tag", 11441 + "class": "APPLICATION", 11442 + "explicit": false, 11443 + "content": [ 11444 + { 11445 + "name": "", 11446 + "type": { 11447 + "name": "LDAPResult", 11448 + "type": "defined" 11449 + } 11450 + } 11451 + ] 11452 + } 11453 + }, 11454 + "ModifyRequest": { 11455 + "name": "ModifyRequest", 11456 + "type": { 11457 + "name": "Application 6", 11458 + "type": "tag", 11459 + "class": "APPLICATION", 11460 + "explicit": false, 11461 + "content": [ 11462 + { 11463 + "name": "", 11464 + "type": { 11465 + "name": "SEQUENCE", 11466 + "type": "builtin", 11467 + "content": [ 11468 + { 11469 + "id": "object", 11470 + "name": "LDAPDN", 11471 + "type": "defined" 11472 + }, 11473 + { 11474 + "id": "changes", 11475 + "name": "SEQUENCE", 11476 + "type": "builtin", 11477 + "typeOf": 1, 11478 + "content": [ 11479 + { 11480 + "name": "SEQUENCE", 11481 + "type": "builtin", 11482 + "content": [ 11483 + { 11484 + "id": "operation", 11485 + "name": "ENUMERATED", 11486 + "type": "builtin", 11487 + "content": { 11488 + "add": 0, 11489 + "delete": 1, 11490 + "replace": 2 11491 + } 11492 + }, 11493 + { 11494 + "id": "modification", 11495 + "name": "PartialAttribute", 11496 + "type": "defined" 11497 + } 11498 + ] 11499 + } 11500 + ] 11501 + } 11502 + ] 11503 + } 11504 + } 11505 + ] 11506 + } 11507 + }, 11508 + "ModifyResponse": { 11509 + "name": "ModifyResponse", 11510 + "type": { 11511 + "name": "Application 7", 11512 + "type": "tag", 11513 + "class": "APPLICATION", 11514 + "explicit": false, 11515 + "content": [ 11516 + { 11517 + "name": "", 11518 + "type": { 11519 + "name": "LDAPResult", 11520 + "type": "defined" 11521 + } 11522 + } 11523 + ] 11524 + } 11525 + }, 11526 + "AddRequest": { 11527 + "name": "AddRequest", 11528 + "type": { 11529 + "name": "Application 8", 11530 + "type": "tag", 11531 + "class": "APPLICATION", 11532 + "explicit": false, 11533 + "content": [ 11534 + { 11535 + "name": "", 11536 + "type": { 11537 + "name": "SEQUENCE", 11538 + "type": "builtin", 11539 + "content": [ 11540 + { 11541 + "id": "entry", 11542 + "name": "LDAPDN", 11543 + "type": "defined" 11544 + }, 11545 + { 11546 + "id": "attributes", 11547 + "name": "AttributeList", 11548 + "type": "defined" 11549 + } 11550 + ] 11551 + } 11552 + } 11553 + ] 11554 + } 11555 + }, 11556 + "AttributeList": { 11557 + "name": "AttributeList", 11558 + "type": { 11559 + "name": "SEQUENCE", 11560 + "type": "builtin", 11561 + "typeOf": 1, 11562 + "content": [ 11563 + { 11564 + "name": "Attribute", 11565 + "type": "defined" 11566 + } 11567 + ] 11568 + } 11569 + }, 11570 + "AddResponse": { 11571 + "name": "AddResponse", 11572 + "type": { 11573 + "name": "Application 9", 11574 + "type": "tag", 11575 + "class": "APPLICATION", 11576 + "explicit": false, 11577 + "content": [ 11578 + { 11579 + "name": "", 11580 + "type": { 11581 + "name": "LDAPResult", 11582 + "type": "defined" 11583 + } 11584 + } 11585 + ] 11586 + } 11587 + }, 11588 + "DelRequest": { 11589 + "name": "DelRequest", 11590 + "type": { 11591 + "name": "Application 10", 11592 + "type": "tag", 11593 + "class": "APPLICATION", 11594 + "explicit": false, 11595 + "content": [ 11596 + { 11597 + "name": "", 11598 + "type": { 11599 + "name": "LDAPDN", 11600 + "type": "defined" 11601 + } 11602 + } 11603 + ] 11604 + } 11605 + }, 11606 + "DelResponse": { 11607 + "name": "DelResponse", 11608 + "type": { 11609 + "name": "Application 11", 11610 + "type": "tag", 11611 + "class": "APPLICATION", 11612 + "explicit": false, 11613 + "content": [ 11614 + { 11615 + "name": "", 11616 + "type": { 11617 + "name": "LDAPResult", 11618 + "type": "defined" 11619 + } 11620 + } 11621 + ] 11622 + } 11623 + }, 11624 + "ModifyDNRequest": { 11625 + "name": "ModifyDNRequest", 11626 + "type": { 11627 + "name": "Application 12", 11628 + "type": "tag", 11629 + "class": "APPLICATION", 11630 + "explicit": false, 11631 + "content": [ 11632 + { 11633 + "name": "", 11634 + "type": { 11635 + "name": "SEQUENCE", 11636 + "type": "builtin", 11637 + "content": [ 11638 + { 11639 + "id": "entry", 11640 + "name": "LDAPDN", 11641 + "type": "defined" 11642 + }, 11643 + { 11644 + "id": "newrdn", 11645 + "name": "RelativeLDAPDN", 11646 + "type": "defined" 11647 + }, 11648 + { 11649 + "id": "deleteoldrdn", 11650 + "name": "BOOLEAN", 11651 + "type": "builtin" 11652 + }, 11653 + { 11654 + "id": "newSuperior", 11655 + "name": "[0]", 11656 + "type": "tag", 11657 + "class": "CONTEXT", 11658 + "explicit": false, 11659 + "content": [ 11660 + { 11661 + "name": "", 11662 + "type": { 11663 + "name": "LDAPDN", 11664 + "type": "defined" 11665 + } 11666 + } 11667 + ], 11668 + "optional": true 11669 + } 11670 + ] 11671 + } 11672 + } 11673 + ] 11674 + } 11675 + }, 11676 + "ModifyDNResponse": { 11677 + "name": "ModifyDNResponse", 11678 + "type": { 11679 + "name": "Application 13", 11680 + "type": "tag", 11681 + "class": "APPLICATION", 11682 + "explicit": false, 11683 + "content": [ 11684 + { 11685 + "name": "", 11686 + "type": { 11687 + "name": "LDAPResult", 11688 + "type": "defined" 11689 + } 11690 + } 11691 + ] 11692 + } 11693 + }, 11694 + "CompareRequest": { 11695 + "name": "CompareRequest", 11696 + "type": { 11697 + "name": "Application 14", 11698 + "type": "tag", 11699 + "class": "APPLICATION", 11700 + "explicit": false, 11701 + "content": [ 11702 + { 11703 + "name": "", 11704 + "type": { 11705 + "name": "SEQUENCE", 11706 + "type": "builtin", 11707 + "content": [ 11708 + { 11709 + "id": "entry", 11710 + "name": "LDAPDN", 11711 + "type": "defined" 11712 + }, 11713 + { 11714 + "id": "ava", 11715 + "name": "AttributeValueAssertion", 11716 + "type": "defined" 11717 + } 11718 + ] 11719 + } 11720 + } 11721 + ] 11722 + } 11723 + }, 11724 + "CompareResponse": { 11725 + "name": "CompareResponse", 11726 + "type": { 11727 + "name": "Application 15", 11728 + "type": "tag", 11729 + "class": "APPLICATION", 11730 + "explicit": false, 11731 + "content": [ 11732 + { 11733 + "name": "", 11734 + "type": { 11735 + "name": "LDAPResult", 11736 + "type": "defined" 11737 + } 11738 + } 11739 + ] 11740 + } 11741 + }, 11742 + "AbandonRequest": { 11743 + "name": "AbandonRequest", 11744 + "type": { 11745 + "name": "Application 16", 11746 + "type": "tag", 11747 + "class": "APPLICATION", 11748 + "explicit": false, 11749 + "content": [ 11750 + { 11751 + "name": "", 11752 + "type": { 11753 + "name": "MessageID", 11754 + "type": "defined" 11755 + } 11756 + } 11757 + ] 11758 + } 11759 + }, 11760 + "ExtendedRequest": { 11761 + "name": "ExtendedRequest", 11762 + "type": { 11763 + "name": "Application 23", 11764 + "type": "tag", 11765 + "class": "APPLICATION", 11766 + "explicit": false, 11767 + "content": [ 11768 + { 11769 + "name": "", 11770 + "type": { 11771 + "name": "SEQUENCE", 11772 + "type": "builtin", 11773 + "content": [ 11774 + { 11775 + "id": "requestName", 11776 + "name": "[0]", 11777 + "type": "tag", 11778 + "class": "CONTEXT", 11779 + "explicit": false, 11780 + "content": [ 11781 + { 11782 + "name": "", 11783 + "type": { 11784 + "name": "LDAPOID", 11785 + "type": "defined" 11786 + } 11787 + } 11788 + ] 11789 + }, 11790 + { 11791 + "id": "requestValue", 11792 + "name": "[1]", 11793 + "type": "tag", 11794 + "class": "CONTEXT", 11795 + "explicit": false, 11796 + "content": [ 11797 + { 11798 + "name": "", 11799 + "type": { 11800 + "name": "OCTET STRING", 11801 + "type": "builtin" 11802 + } 11803 + } 11804 + ], 11805 + "optional": true 11806 + } 11807 + ] 11808 + } 11809 + } 11810 + ] 11811 + } 11812 + }, 11813 + "ExtendedResponse": { 11814 + "name": "ExtendedResponse", 11815 + "type": { 11816 + "name": "ANY", 11817 + "type": "builtin" 11818 + } 11819 + }, 11820 + "IntermediateResponse": { 11821 + "name": "IntermediateResponse", 11822 + "type": { 11823 + "name": "Application 25", 11824 + "type": "tag", 11825 + "class": "APPLICATION", 11826 + "explicit": false, 11827 + "content": [ 11828 + { 11829 + "name": "", 11830 + "type": { 11831 + "name": "SEQUENCE", 11832 + "type": "builtin", 11833 + "content": [ 11834 + { 11835 + "id": "responseName", 11836 + "name": "[0]", 11837 + "type": "tag", 11838 + "class": "CONTEXT", 11839 + "explicit": false, 11840 + "content": [ 11841 + { 11842 + "name": "", 11843 + "type": { 11844 + "name": "LDAPOID", 11845 + "type": "defined" 11846 + } 11847 + } 11848 + ], 11849 + "optional": true 11850 + }, 11851 + { 11852 + "id": "responseValue", 11853 + "name": "[1]", 11854 + "type": "tag", 11855 + "class": "CONTEXT", 11856 + "explicit": false, 11857 + "content": [ 11858 + { 11859 + "name": "", 11860 + "type": { 11861 + "name": "OCTET STRING", 11862 + "type": "builtin" 11863 + } 11864 + } 11865 + ], 11866 + "optional": true 11867 + } 11868 + ] 11869 + } 11870 + } 11871 + ] 10372 11872 } 10373 11873 } 10374 11874 }
+3
tags.js
··· 1 1 export const tags = { 2 + "2.1.0": "2025-08-03", 3 + "2.0.6": "2025-07-28", 4 + "2.0.5": "2025-04-12", 2 5 "2.0.4": "2024-05-08", 3 6 "2.0.3": "2024-05-06", 4 7 "2.0.2": "2024-04-20",
+178 -37
test.js
··· 1 1 #!/usr/bin/env node 2 2 3 - import { ASN1 } from './asn1.js'; 3 + import * as fs from 'fs'; // 'node:fs' doesn't work on NodeJS 14.5.0 4 + import { ASN1, Stream } from './asn1.js'; 5 + import { Defs } from './defs.js'; 4 6 import { Hex } from './hex.js'; 7 + import { Base64 } from './base64.js'; 8 + import { Int10 } from './int10.js'; 9 + import { createPatch } from 'diff'; 5 10 6 - const 7 - all = (process.argv[2] == 'all'); 11 + const all = (process.argv[2] == 'all'); 12 + 13 + /** @type {Array<Tests>} */ 14 + const tests = []; 15 + 16 + const stats = { 17 + run: 0, 18 + error: 0, 19 + }; 20 + 21 + function diff(str1, str2) { 22 + let s = createPatch('test', str1, str2, null, null, { context: 2 }); 23 + s = s.slice(s.indexOf('@@'), -1); 24 + s = s.replace(/^@@.*/mg, '\x1B[34m$&\x1B[39m'); 25 + s = s.replace(/^-.*/mg, '\x1B[31m$&\x1B[39m'); 26 + s = s.replace(/^\+.*/mg, '\x1B[32m$&\x1B[39m'); 27 + return s; 28 + } 8 29 9 - const tests = [ 30 + /** 31 + * A class for managing and executing tests. 32 + */ 33 + class Tests { 34 + /** 35 + * The title of the test suite. 36 + * @type {string} 37 + */ 38 + title; 39 + 40 + /** 41 + * An array to store test data. 42 + * @type {Array<unknown>} 43 + */ 44 + data; 45 + 46 + /** 47 + * Checks a row of test data. 48 + * @param {Function} t - How to test a row of data. 49 + */ 50 + checkRow; 51 + 52 + /** 53 + * Constructs a new Tests instance. 54 + * @param {string} title - The title of the test suite. 55 + * @param {Function} checkRow - A function to check each row of data. 56 + * @param {Array<unknown>} data - The test data to be processed. 57 + */ 58 + constructor(title, checkRow, data) { 59 + this.title = title; 60 + this.checkRow = checkRow; 61 + this.data = data; 62 + } 63 + 64 + /** 65 + * Executes the tests and checks their results for all rows. 66 + */ 67 + checkAll() { 68 + if (all) console.log('\x1B[1m\x1B[34m' + this.title + '\x1B[39m\x1B[22m'); 69 + for (const t of this.data) 70 + this.checkRow(t); 71 + } 72 + 73 + /** 74 + * Prints the result of a test, indicating if it passed or failed. 75 + * @param {unknown} result The actual result of the test. 76 + * @param {unknown} expected The expected result of the test. 77 + * @param {string} comment A comment describing the test. 78 + */ 79 + checkResult(result, expected, comment) { 80 + ++stats.run; 81 + if (!result || result == expected) { 82 + if (all) console.log('\x1B[1m\x1B[32mOK \x1B[39m\x1B[22m ' + comment); 83 + } else { 84 + ++stats.error; 85 + console.log('\x1B[1m\x1B[31mERR\x1B[39m\x1B[22m ' + comment); 86 + if (result.length > 100) { 87 + console.log(' \x1B[1m\x1B[34mDIF\x1B[39m\x1B[22m ' + diff(result, expected.toString()).replace(/\n/g, '\n ')); 88 + } else { 89 + console.log(' \x1B[1m\x1B[34mEXP\x1B[39m\x1B[22m ' + expected.toString().replace(/\n/g, '\n ')); 90 + console.log(' \x1B[1m\x1B[33mGOT\x1B[39m\x1B[22m ' + result.replace(/\n/g, '\n ')); 91 + } 92 + } 93 + } 94 + } 95 + 96 + tests.push(new Tests('ASN.1', function (t) { 97 + const input = t[0], 98 + expected = t[1], 99 + comment = t[2]; 100 + let result; 101 + try { 102 + let node = ASN1.decode(Hex.decode(input)); 103 + if (typeof expected == 'function') 104 + result = expected(node); 105 + else 106 + result = node.content(); 107 + //TODO: check structure, not only first level content 108 + } catch (e) { 109 + result = 'Exception:\n' + e; 110 + } 111 + if (expected instanceof RegExp) 112 + result = expected.test(result) ? null : 'does not match'; 113 + this.checkResult(result, expected, comment); 114 + }, [ 10 115 // RSA Laboratories technical notes from https://luca.ntop.org/Teaching/Appunti/asn1.html 11 116 ['0304066E5DC0', '(18 bit)\n011011100101110111', 'ntop, bit string: DER encoding'], 12 117 ['0304066E5DE0', '(18 bit)\n011011100101110111', 'ntop, bit string: padded with "100000"'], ··· 88 193 ['181331393835313130363231303632372E332B3134', '1985-11-06 21:06:27.3 UTC+14:00', 'UTC offset +13 and +14'], // GitHub issue #54 89 194 ['032100171E83C1B251803F86DD01E9CFA886BE89A7316D8372649AC2231EC669F81A84', n => { if (n.sub != null) return 'Should not decode content: ' + n.sub[0].content(); }, 'Key that resembles an UTCTime'], // GitHub issue #79 90 195 ['171E83C1B251803F86DD01E9CFA886BE89A7316D8372649AC2231EC669F81A84', /^Exception:\nError: Unrecognized time: /, 'Invalid UTCTime'], // GitHub issue #79 91 - ]; 196 + ])); 92 197 93 - let 94 - run = 0, 95 - expErr = 0, 96 - error = 0; 97 - tests.forEach(function (t) { 98 - const input = t[0], 99 - expected = t[1], 100 - comment = t[2]; 101 - let result; 102 - try { 103 - let node = ASN1.decode(Hex.decode(input)); 104 - if (typeof expected == 'function') 105 - result = expected(node); 106 - else 107 - result = node.content(); 108 - //TODO: check structure, not only first level content 109 - } catch (e) { 110 - result = 'Exception:\n' + e; 198 + tests.push(new Tests('Dump of examples', function () { 199 + const examples = fs.readdirSync('examples/').filter(f => f.endsWith('.dump')); 200 + for (const example of examples) { 201 + const filename = example.slice(0, -5); // Remove '.dump' suffix 202 + const expected = fs.readFileSync('examples/' + example, 'utf8'); 203 + let data = fs.readFileSync('examples/' + filename); 204 + data = Base64.unarmor(data); 205 + let node = ASN1.decode(data); 206 + const types = Defs.commonTypes 207 + .map(type => { 208 + const stats = Defs.match(node, type); 209 + return { type, match: stats.recognized / stats.total }; 210 + }) 211 + .sort((a, b) => b.match - a.match); 212 + Defs.match(node, types[0].type); 213 + let result = node.toPrettyString(); 214 + this.checkResult(result, expected, 'Dump of examples/' + filename); 111 215 } 112 - if (expected instanceof RegExp) 113 - result = expected.test(result) ? null : 'does not match'; 114 - ++run; 115 - if (!result || result == expected) { 116 - if (all) console.log('\x1B[1m\x1B[32mOK \x1B[39m\x1B[22m ' + comment); 117 - } else { 118 - ++error; 119 - console.log('\x1B[1m\x1B[31mERR\x1B[39m\x1B[22m ' + comment); 120 - console.log(' \x1B[1m\x1B[34mEXP\x1B[39m\x1B[22m ' + expected.toString().replace(/\n/g, '\n ')); 121 - console.log(' \x1B[1m\x1B[33mGOT\x1B[39m\x1B[22m ' + result.replace(/\n/g, '\n ')); 122 - } 123 - }); 124 - console.log(run + ' tested, ' + expErr + ' expected, ' + error + ' errors.'); 125 - process.exit(error ? 1 : 0); 216 + }, [ 217 + [0], 218 + ])); 219 + 220 + tests.push(new Tests('Base64', function (t) { 221 + let bin = Base64.decode(t); 222 + let url = new Stream(bin, 0).b64Dump(0, bin.length); 223 + // check base64url encoding 224 + this.checkResult(url, t.replace(/\n/g, '').replace(/=*$/g, ''), 'Base64url: ' + bin.length + ' bytes'); 225 + // check conversion from base64url to base64 226 + let pretty = Base64.pretty(url); 227 + this.checkResult(pretty, t, 'Base64pretty: ' + bin.length + ' bytes'); 228 + let std = new Stream(bin, 0).b64Dump(0, bin.length, 'std'); 229 + // check direct base64 encoding 230 + this.checkResult(std, t.replace(/\n/g, ''), 'Base64: ' + bin.length + ' bytes'); 231 + }, [ 232 + 'AA==', 233 + 'ABA=', 234 + 'ABCD', 235 + 'ABCDEA==', 236 + 'ABCDEFE=', 237 + 'ABCDEFGH', 238 + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQR\nSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456w==', 239 + ])); 240 + 241 + tests.push(new Tests('Int10', function (t) { 242 + this.row = (0|this.row) + 1; 243 + this.num = this.num || new Int10(); 244 + this.num.mulAdd(t[0], t[1]); 245 + this.checkResult(this.num.toString(), t[2], 'Int10 row ' + this.row); 246 + }, [ 247 + [0, 1000000000, '1000000000'], 248 + [256, 23, '256000000023'], 249 + [256, 23, '65536000005911'], 250 + [256, 23, '16777216001513239'], 251 + [256, 23, '4294967296387389207'], 252 + [256, 23, '1099511627875171637015'], 253 + [256, 23, '281474976736043939075863'], 254 + [253, 1, '71213169114219116586193340'], 255 + [253, 1, '18016931785897436496306915021'], 256 + [253, 1, '4558283741832051433565649500314'], 257 + [253, 1, '1153245786683509012692109323579443'], 258 + [253, 1, '291771184030927780211103658865599080'], 259 + [1, 0, '291771184030927780211103658865599080'], 260 + ])); 261 + 262 + for (const t of tests) 263 + t.checkAll(); 264 + 265 + console.log(stats.run + ' tested, ' + stats.error + ' errors.'); 266 + process.exit(stats.error ? 1 : 0);
+1 -1
testDefs.js
··· 11 11 try { 12 12 try { // try PEM first 13 13 content = Base64.unarmor(content); 14 - } catch (e) { // try DER/BER then 14 + } catch (ignore) { // try DER/BER then 15 15 } 16 16 let result = ASN1.decode(content); 17 17 content = null;
+1
tree-icon-dark.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="28" height="14"><circle cx="6.903" cy="7.102" r="5.165" style="fill:#000;fill-opacity:1;stroke:#555;stroke-width:1.03676;stroke-dasharray:none;stroke-opacity:1"/><circle cx="21.133" cy="7.029" r="5.165" style="fill:#000;fill-opacity:1;stroke:#555;stroke-width:1.03676;stroke-dasharray:none;stroke-opacity:1"/><path d="M17.908 7.071h6.783" style="opacity:1;fill:none;fill-opacity:1;stroke:#555;stroke-width:1.03676;stroke-dasharray:none;stroke-opacity:1"/><g style="fill:none;fill-opacity:1;stroke:#555;stroke-width:.518375;stroke-dasharray:none;stroke-opacity:1"><path d="M5.231 9.992h9.466" style="opacity:.992268;fill:none;fill-opacity:1;stroke:#555;stroke-width:1.44663;stroke-dasharray:none;stroke-opacity:1" transform="translate(-.289 -.083)scale(.71667)"/><path d="M10.006 5.242v9.465" style="opacity:1;fill:none;fill-opacity:1;stroke:#555;stroke-width:1.44663;stroke-dasharray:none;stroke-opacity:1" transform="translate(-.289 -.083)scale(.71667)"/></g></svg>
+1
tree-icon-light.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="28" height="14"><circle cx="6.936" cy="7.247" r="5.165" style="fill:silver;fill-opacity:1;stroke:#999;stroke-width:1.03676;stroke-dasharray:none;stroke-opacity:1"/><circle cx="21.166" cy="7.174" r="5.165" style="fill:silver;fill-opacity:1;stroke:#999;stroke-width:1.03676;stroke-dasharray:none;stroke-opacity:1"/><path d="M17.94 7.216h6.784" style="fill:none;fill-opacity:1;stroke:#999;stroke-width:1.03676;stroke-dasharray:none;stroke-opacity:1"/><g style="fill:none;fill-opacity:1;stroke:#999;stroke-width:.518375;stroke-dasharray:none;stroke-opacity:1"><path d="M5.231 9.992h9.466" style="opacity:.992268;fill:none;fill-opacity:1;stroke:#999;stroke-width:1.44663;stroke-dasharray:none;stroke-opacity:1" transform="translate(-.256 .062)scale(.71667)"/><path d="M10.006 5.242v9.465" style="opacity:1;fill:none;fill-opacity:1;stroke:#999;stroke-width:1.44663;stroke-dasharray:none;stroke-opacity:1" transform="translate(-.256 .062)scale(.71667)"/></g></svg>
+1 -1
updateRFC.sh
··· 1 1 #/bin/sh 2 - RFCs="5280 5208 3369 3161 2986 4211 4210 8017" 2 + RFCs="5280 5208 3369 3161 2986 4211 4210 8017 4511" 3 3 downloadRFC() { 4 4 URL="https://www.ietf.org/rfc/rfc$1.txt" 5 5 if [ -x /usr/bin/fetch ]; then