@zbsearch/plugin-vector-quantizer 0.0.0-stage → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +674 -0
- package/README.md +96 -2
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.global.js +2 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/wasm-binary.d.ts +2 -0
- package/dist/wasm.d.ts +37 -0
- package/package.json +54 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/wasm-binary.ts","../src/wasm.ts","../src/index.ts"],"sourcesContent":["// This file is generated by scripts/build-wasm.mjs. Do not edit it by hand.\n//\n// Compiled from ./rust (GPL-3.0-only), which vendors the product quantizer of vector_quantizer 0.0.3\n// (https://github.com/oramasearch/vector_quantizer, commit cfdec78a061bd13bc60130dd4c2ced3f64338dcf).\n// Built with rustc 1.97.0 (2d8144b78 2026-07-07). Size: 61256 bytes. SHA-256: 070fca4f51f42450d80a4f2fe75d7e21a16fe2540157319896b233d580140afd\n\nexport const WASM_SHA256 = '070fca4f51f42450d80a4f2fe75d7e21a16fe2540157319896b233d580140afd'\n\nexport const WASM_BASE64 =\n 'AGFzbQEAAAABZw9gAn9/AGADf39/AX9gAn9/AX9gA39/fwBgAX8AYAV/f39/fwBgBn9/f39/fwBgAX8Bf2AEf39/fwBgAAF/YAR/' +\n 'f39/AX9gB39/f39/f38Bf2AFf39/f38Bf2AAAGAGf39/f39/AX8DjgGMAQAAAwQEBAIABQYHBAAIAwAAAgICAgICAQIBBwkJAAIH' +\n 'CgQKCwwHAgMKAg0IBAoCAgICAgIFAwQABAQEBAQEBAYFAAACAgcNAwQKAAAEAgAAAAcAAAAAAgAAAAICAQIAAAABAwQDAAgADQMC' +\n 'AgEBAwMCCgMBAQcADgIMAQECBAQCBAIDBQICBAICAgEBBAUBcAEwMAUDAQARBgkBfwFBgIDAAAsHwQENBm1lbW9yeQIACHZxX2Fs' +\n 'bG9jABoMdnFfZXJyb3JfbGVuABsMdnFfZXJyb3JfcHRyABwHdnFfZnJlZQAdD3ZxX3BxX2NvZGV3b3JkcwAeE3ZxX3BxX2NvZGV3' +\n 'b3Jkc19sZW4AHwx2cV9wcV9kZWNvZGUAIAp2cV9wcV9kcm9wACEMdnFfcHFfZW5jb2RlACIJdnFfcHFfZml0ACMUdnFfcHFfZnJv' +\n 'bV9jb2Rld29yZHMAJAt2cV9wcV93aWR0aAAlCToBAEEBCy8GFBMRiAEyEgUXFhkVLzAuQV1VVGA4XFthWllXWDlWX15TUmNsa21q' +\n 'fH+BAXCEAXOHAYsBCse5A4wByQkDBX8BfQt/I4CAgIAAQRBrIgIkgICAgAACQAJAAkACQAJAAkACQAJAAkACQCAAKAIEIgMgASgC' +\n 'BCIERg0AIAIgAzYCDAJAAkAgA0EASA0AIARBAUYNAQsgAUEEaiACQQxqEIGAgIAAAAsgASgCACEBIAAoAgAhBQJAIANBAkkNACAA' +\n 'KAIIIQYgA0EDcSEAIAEqAgAhB0EAIQEgA0EESQ0DIAZBAnQhBCAGQQN0IQggBkEEdCEJIAZBDGwhCiADQfz///8HcSELQQAhASAF' +\n 'IQMDQCADIAc4AgAgAyAEaiAHOAIAIAMgCGogBzgCACADIApqIAc4AgAgAyAJaiEDIAsgAUEEaiIBRw0ADAMLCyADRQ0JIAUgASoC' +\n 'ADgCAAwJCyABKAIIIQwgACgCCCENAkACQCADQQJJIgQNACANIAxGDQAgACgCACEKDAELIANBAEchCCAAKAIAIQoCQCAEDQAgDUF/' +\n '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' +\n 'CyACIAk3ArABIAIgGTcCqAEgAiA6NgKkASACIDg2AqABIAIgODYCnAEgAiA5NgKYASACIBI2AtABIAIgJjYCzAEgAiAQNgLIASAC' +\n 'IDE2AsQBIAIgEzYCwAFBACEBIAJBADYCvAEgAiACQfgAajYCuAEgAkEYaiACQbgBahCQgICAAEEEIR9BACEFAkACQAJAAkACQAJA' +\n 'IAIoAhhBAUcNACACKALAASACKAK8AWtBAWoiAUF/IAEbIgFBBCABQQRLGyIXQQJ0IQZBACEFIAFB/////wNLDQEgBkH8////B0sN' +\n 'ASACKAIcIQEQqoCAgABBBCEFIAZBBBCmgICAACIHRQ0BIAcgATYCAEEBIQEgAkEBNgLcASACIAc2AtgBIAIgFzYC1AEgAiACKALQ' +\n 'ATYC+AEgAiACKQLIATcD8AEgAiACKQLAATcD6AEgAiACKQK4ATcD4AEgAkEQaiACQeABahCQgICAAAJAIAIoAhBBAUcNACACKAIU' +\n 'IQVBASEBQQQhBgNAAkAgASACKALUAUcNACACQdQBaiABIAIoAugBIAIoAuQBa0EBaiIHQX8gBxtBBEEEEIiAgIAAIAIoAtgBIQcL' +\n 'IAcgBmogBTYCACACIAFBAWoiATYC3AEgBkEEaiEGIAJBCGogAkHgAWoQkICAgAAgAigCDCEFIAIoAghBAXENAAsLIAIoAtgBIR8g' +\n 'AigC1AEhBQsCQCAWRQ0AIBQgFkECdEEEEKeAgIAAC0EAIQYCQCAjDQACQAJAICINAEEEITtBACE8DAELEKqAgIAAQQQhBiAiQQQQ' +\n 'qYCAgAAiO0UNASALITwLAkAgCkF/TA0AQQAhBgJAICENABCqgICAAEEEIQYgIEEEEKmAgIAAIhdFDQBBACEGAkAgNg0AAkACQCAu' +\n 'DQBBBCE9QQAhPgwBCxCqgICAAEEEIQYgCyE+IC5BBBCmgICAACI9RQ0BCyA9IQYCQAJAIAtBAkkNACAqIRYgPSEGA0AQqoCAgAAg' +\n 'IEEEEKaAgIAAIgdFDQICQCAgRQ0AIAcgFyAg/AoAAAsgBkEUakEBNgIAIAZBEGogCjYCACAGQQxqIAc2AgAgBkEIaiAKNgIAIAZB' +\n 'BGogCjYCACAGIAc2AgAgBkEYaiEGIBZBf2oiFg0ACwsgBkEBNgIUIAYgCjYCECAGIBc2AgwgBiAKNgIIIAYgCjYCBCAGIBc2AgAC' +\n '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' +\n 'BiAHQQhqIQcgFyAWQX5qIhZHDQALIBRFDQFBACAWayEBCyAYIAFBAnQiAWogRSABaioCACA6IAFqKgIAkzgCAAsgTkUNAwJAAkAC' +\n 'QCBDDgIGAQALIExBAUcNAQsgQUEBRg0EIFMgQ0YNBAtDAAAAACFVIE8NBCAZQoCAgIAQVA0EIBlC/////w+DUA0EIExBAnQhByBM' +\n 'QQN0IRYgTEEEdCEXIFNBAnQhHCBMQQxsIRQgQ0F8cSEVIENBA3EhG0MAAAAAIVVBACEdA0ACQAJAAkAgR0EDTw0AQQAhBgwBC0EA' +\n 'IQYgGCEBA0AgASAUaioCAIsiXCABIBZqKgIAiyJdIAEgB2oqAgCLIl4gASoCAIsiXyBVIFUgVVwbIlUgVSBfIF8gX1wbIl8gVSBf' +\n 'XhsiVSBVIFVcGyJVIFUgXiBeIF5cGyJeIFUgXl4bIlUgVSBVXBsiVSBVIF0gXSBdXBsiXSBVIF1eGyJVIFUgVVwbIlUgVSBcIFwg' +\n 'XFwbIlwgVSBcXhshVSABIBdqIQEgFSAGQQRqIgZHDQALIBtFDQELIBggByAGbGohASAbIQYDQCABKgIAiyJcIFUgVSBVXBsiVSBV' +\n 'IFwgXCBcXBsiXCBVIFxeGyFVIAEgB2ohASAGQX9qIgYNAAsLIBggHGohGCAdQQFqIh0gQUcNAAwFCwsgFiABEOWAgIAAAAtBwIvA' +\n 'gABBygBBnIzAgAAQtYCAgAAAC0GcjcCAAEErQciNwIAAEO6AgIAAAAsCQCBDIEFsDQBDAAAAACFVDAELIFBBA3EhBgJAAkAgUEF/' +\n 'akEDTw0AQwAAAAAhVUEAIQEMAQtBACEBQQAgUEH8////AXFrIQdDAAAAACFVA0AgGEEMaioCAIsiXCAYQQhqKgIAiyJdIBhBBGoq' +\n 'AgCLIl4gGCoCAIsiXyBVIFUgVVwbIlUgVSBfIF8gX1wbIl8gVSBfXhsiVSBVIFVcGyJVIFUgXiBeIF5cGyJeIFUgXl4bIlUgVSBV' +\n 'XBsiVSBVIF0gXSBdXBsiXSBVIF1eGyJVIFUgVVwbIlUgVSBcIFwgXFwbIlwgVSBcXhshVSAYQRBqIRggByABQXxqIgFHDQALIAZF' +\n 'DQFBACABayEBCyBXIFpBAnQgAUECdGogW0ECdGtqIQEDQCABKgIAiyJcIFUgVSBVXBsiVSBVIFwgXCBcXBsiXCBVIFxeGyFVIAFB' +\n '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' +\n 'mAEhIgJAICBBAkkNACABQQFHIAynIiNBAUdyRQ0AAkAgAkECSQ0AIARBAUcgDEIgiCIMQgFSckUNACAEQQJ0IQMgDKciJEECdCEI' +\n 'ICRBA3QhBiAEQQN0IQUgJEEEdCElICNBAnQhJiAkQQxsISMgBEEEdCEkIAFBAnQhJyAEQQxsISggAkF8cSEpIAJBA3EhKkEAISsg' +\n 'AkF/akEDSSEsA0BBACEBAkACQCAsDQBBACEBICIhBCAAIQIDQCACIAQqAgA4AgAgAiADaiAEIAhqKgIAOAIAIAIgBWogBCAGaioC' +\n 'ADgCACACIChqIAQgI2oqAgA4AgAgBCAlaiEEIAIgJGohAiApIAFBBGoiAUcNAAsgKkUNAQsgACADIAFsaiEEICIgCCABbGohAiAq' +\n 'IQEDQCAEIAIqAgA4AgAgBCADaiEEIAIgCGohAiABQX9qIgENAAsLICIgJmohIiAAICdqIQAgK0EBaiIrICBHDQAMBgsLIAJFDQQg' +\n 'AUECdCEFICNBAnQhJSACQQNxIQZBACEIQQAgAkF8cWshAyACQX9qQQNJISMDQEEAIQQCQAJAICMNAEEAIQEgACEEICIhAgNAIAQg' +\n 'AioCADgCACAEQQRqIAJBBGoqAgA4AgAgBEEIaiACQQhqKgIAOAIAIARBDGogAkEMaioCADgCACAEQRBqIQQgAkEQaiECIAMgAUF8' +\n 'aiIBRw0ACyAGRQ0BQQAgAWshBAsgBEECdCEEIAYhAgNAIAAgBGogIiAEaioCADgCACAEQQRqIQQgAkF/aiICDQALCyAAIAVqIQAg' +\n 'IiAlaiEiIAhBAWoiCCAgRw0ADAULCyAgRQ0DAkAgAkECSQ0AIARBAUcgDEIgiCIMQgFSckUNACAIIAYgBEECdCIramohLSAIIARB' +\n 'A3QgBmpqIS4gCCAEQQxsIAZqaiEvIAynIgFBBHQhAyAEQQR0IQggAkF8cSEmIAJBA3EhMCAiIAFBAnQiKmohMSAiIAFBA3RqITIg' +\n 'IiABQQxsaiEzQQAhBCACQX9qQQNJITQgACEnICIhLEEAITUDQEEAISkCQAJAIDQNAEEAISkgACECICIhASAxIQYgLSEFIDIhJSAu' +\n 'ISMgMyEkIC8hKANAIAIgBGogASAEaioCADgCACAFIARqIAYgBGoqAgA4AgAgIyAEaiAlIARqKgIAOAIAICggBGogJCAEaioCADgC' +\n 'ACACIAhqIQIgASADaiEBIAYgA2ohBiAFIAhqIQUgJSADaiElICMgCGohIyAkIANqISQgKCAIaiEoICYgKUEEaiIpRw0ACyAwRQ0B' +\n 'CyAnICsgKWxqIQIgLCAqIClsaiEBIDAhBgNAIAIgASoCADgCACACICtqIQIgASAqaiEBIAZBf2oiBg0ACwsgJ0EEaiEnICxBBGoh' +\n 'LCAEQQRqIQQgNUEBaiI1ICBHDQAMBQsLIAJFDQMgAkEDcSEkQQAhJUEAIAJBfHFrIQggAkF/akEDSSEoIAAhBiAiIQVBACEjA0BB' +\n 'ACEEAkACQCAoDQBBACEDICUhBANAIAAgBGoiAiAiIARqIgEqAgA4AgAgAkEEaiABQQRqKgIAOAIAIAJBCGogAUEIaioCADgCACAC' +\n 'QQxqIAFBDGoqAgA4AgAgBEEQaiEEIAggA0F8aiIDRw0ACyAkRQ0BQQAgA2shBAsgBiAEQQJ0IgJqIQQgBSACaiECICQhAQNAIAQg' +\n 'AioCADgCACAEQQRqIQQgAkEEaiECIAFBf2oiAQ0ACwsgBkEEaiEGIAVBBGohBSAlQQRqISUgI0EBaiIjICBHDQAMBAsLIAcoAqQB' +\n 'IQUCQCAgQQJJIiUNACAFIAFHDQILIAcoAqgBISMCQCACQQJJDQAgIyAERw0CCwJAAkAgAkEAICAbIAFHDQAgBCAgQQBHIAJBAEdx' +\n 'Rg0BCwJAIAIgICABIAFBH3UiA3MgA2sgBCAEQR91IgNzIANrSiIDGyIkQQFGDQAgBCABIAMbIiggKEEfdSIocyAoa0EBRw0DCyAg' +\n 'IAIgAxtBAUYNACABIAQgAxsiAyADQR91IgNzIANrICRHDQILIAAgAUEfdSAgQX9qIAFscUEAICBBAUsbQQJ0IiJqIARBH3UgAkF/' +\n 'aiAEbHFBACACQQFLG0ECdCIpaiIDRQ0BAkACQCAFIAcoAqABIiRBACAHKAKcASIoG0cNACAjIChBAEcgJEEAR3FGDQELAkAgJCAo' +\n 'IAUgBUEfdSIrcyArayAjICNBH3UiK3MgK2tKIisbIipBAUYNACAjIAUgKxsiJiAmQR91IiZzICZrQQFHDQMLICggJCArG0EBRg0A' +\n 'IAUgIyArGyIrICtBH3UiK3MgK2sgKkcNAgsgBygCmAEiKyAFQR91IChBf2ogBWxBACAoQQFLG3FBAnQiKmogI0EfdSAkQX9qICNs' +\n 'QQAgJEEBSxtxQQJ0IiNqIgVFDQEgJCAobCIEIAIgIGwiAiAEIAJJGyICRQ0CIAJBA3EhAUEAIQQCQCACQQRJDQBBACEEQQAgAkF8' +\n 'cWshAgNAIAMgBSoCADgCACADQQRqIAVBBGoqAgA4AgAgA0EIaiAFQQhqKgIAOAIAIANBDGogBUEMaioCADgCACAFQRBqIQUgA0EQ' +\n 'aiEDIAIgBEF8aiIERw0ACyABRQ0DQQAgBGshBAsgKyAjICpqIARBAnQiAmpqIQQgCCApICJqIAZqIAJqaiECA0AgAiAEKgIAOAIA' +\n 'IAJBBGohAiAEQQRqIQQgAUF/aiIBDQAMAwsLQdiNwIAAQR1BqI7AgAAQ7oCAgAAACyAHKQKkASEMIAcoApgBISICQCAlDQAgAUEB' +\n 'RyAMpyIjQQFHckUNAAJAIAJBAkkNACAEQQFHIAxCIIgiDEIBUnJFDQAgBEECdCEDIAynIiRBAnQhCCAkQQN0IQYgBEEDdCEFICRB' +\n 'BHQhJSAjQQJ0ISYgJEEMbCEjIARBBHQhJCABQQJ0IScgBEEMbCEoIAJBfHEhKSACQQNxISpBACErIAJBf2pBA0khLANAQQAhAQJA' +\n 'AkAgLA0AQQAhASAiIQQgACECA0AgAiAEKgIAOAIAIAIgA2ogBCAIaioCADgCACACIAVqIAQgBmoqAgA4AgAgAiAoaiAEICNqKgIA' +\n 'OAIAIAQgJWohBCACICRqIQIgKSABQQRqIgFHDQALICpFDQELIAAgAyABbGohBCAiIAggAWxqIQIgKiEBA0AgBCACKgIAOAIAIAQg' +\n 'A2ohBCACIAhqIQIgAUF/aiIBDQALCyAiICZqISIgACAnaiEAICtBAWoiKyAgRw0ADAMLCyACRQ0BIAFBAnQhBSAjQQJ0ISUgAkED' +\n 'cSEGQQAhCEEAIAJBfHFrIQMgAkF/akEDSSEjA0BBACEEAkACQCAjDQBBACEBIAAhBCAiIQIDQCAEIAIqAgA4AgAgBEEEaiACQQRq' +\n 'KgIAOAIAIARBCGogAkEIaioCADgCACAEQQxqIAJBDGoqAgA4AgAgBEEQaiEEIAJBEGohAiADIAFBfGoiAUcNAAsgBkUNAUEAIAFr' +\n 'IQQLIARBAnQhBCAGIQIDQCAAIARqICIgBGoqAgA4AgAgBEEEaiEEIAJBf2oiAg0ACwsgACAFaiEAICIgJWohIiAIQQFqIgggIEcN' +\n 'AAwCCwsgIEUNAAJAIAJBAkkNACAEQQFHIAxCIIgiDEIBUnJFDQAgCCAGIARBAnQiK2pqIS0gCCAEQQN0IAZqaiEuIAggBEEMbCAG' +\n 'amohLyAMpyIBQQR0IQMgBEEEdCEIIAJBfHEhJiACQQNxITAgIiABQQJ0IipqITEgIiABQQN0aiEyICIgAUEMbGohM0EAIQQgAkF/' +\n 'akEDSSE0IAAhJyAiISxBACE1A0BBACEpAkACQCA0DQBBACEpIAAhAiAiIQEgMSEGIC0hBSAyISUgLiEjIDMhJCAvISgDQCACIARq' +\n 'IAEgBGoqAgA4AgAgBSAEaiAGIARqKgIAOAIAICMgBGogJSAEaioCADgCACAoIARqICQgBGoqAgA4AgAgAiAIaiECIAEgA2ohASAG' +\n 'IANqIQYgBSAIaiEFICUgA2ohJSAjIAhqISMgJCADaiEkICggCGohKCAmIClBBGoiKUcNAAsgMEUNAQsgJyArIClsaiECICwgKiAp' +\n 'bGohASAwIQYDQCACIAEqAgA4AgAgAiAraiECIAEgKmohASAGQX9qIgYNAAsLICdBBGohJyAsQQRqISwgBEEEaiEEIDVBAWoiNSAg' +\n 'Rw0ADAILCyACRQ0AIAJBA3EhJEEAISVBACACQXxxayEIIAJBf2pBA0khKCAAIQYgIiEFQQAhIwNAQQAhBAJAAkAgKA0AQQAhAyAl' +\n 'IQQDQCAAIARqIgIgIiAEaiIBKgIAOAIAIAJBBGogAUEEaioCADgCACACQQhqIAFBCGoqAgA4AgAgAkEMaiABQQxqKgIAOAIAIARB' +\n 'EGohBCAIIANBfGoiA0cNAAsgJEUNAUEAIANrIQQLIAYgBEECdCICaiEEIAUgAmohAiAkIQEDQCAEIAIqAgA4AgAgBEEEaiEEIAJB' +\n 'BGohAiABQX9qIgENAAsLIAZBBGohBiAFQQRqIQUgJUEEaiElICNBAWoiIyAgRw0ACwsCQCAHKAKUASIERQ0AIB8gBEECdEEEEKeA' +\n 'gIAACyAeQSRqIQQgHUFcaiECIBwgFkcNAAwNCwtBuI/AgAAQ/oCAgAAAC0GIksCAAEE3IAdB7wJqQfiRwIAAQcCSwIAAEIOBgIAA' +\n 'AAtB2JDAgAAQ/YCAgAAAC0EEQZABEOWAgIAAAAsgASAEEOWAgIAAAAtBwIvAgABBygBBjIzAgAAQtYCAgAAACyAEIANByI/AgAAQ' +\n '8oCAgAAAC0EBIANByI/AgAAQ8oCAgAAAC0G4j8CAABD+gICAAAALQYiSwIAAQTcgB0HvAmpB+JHAgABBwJLAgAAQg4GAgAAAC0G4' +\n 'j8CAABD+gICAAAALQYiSwIAAQTcgB0HvAmpB+JHAgABBwJLAgAAQg4GAgAAACwJAIBYgHEYNACAdQSRuIQQDQAJAIB5BCGooAgAi' +\n 'AkUNACAeQQRqQgA3AgAgHigCACACQQJ0QQQQp4CAgAALIB5BJGohHiAEQX9qIgQNAAsLIBVFDQAgFCAVQSRsQQQQp4CAgAALAkAg' +\n 'BygCVCIERQ0AIAcoAlwiAkUNACAHQgA3AlggBCACQQJ0QQQQp4CAgAALIAcgEzYCeCAHIBE2AnQgByANNgJwIAcgCjYCbCAHIAs2' +\n 'AmggByAJNgJkIAcgEjYCYCAHIBA2AlwgByAONgJYIAcgDzYCVAsgB0GMAWogB0E4akHIAPwKAAAgB0GMAWoQioCAgAAhBCAHKAIM' +\n 'IgJFDQEgBygCBCACQQJ0QQQQp4CAgAAMAQtBfyEEIAcoAgwiAkUNACAHKAIEIAJBAnRBBBCngICAAAsgB0HwAmokgICAgAAgBAve' +\n 'CQMFfwF+AX8jgICAgABBgAFrIgUkgICAgAAgAiABbCADbCIGQQJ0IQdBACEIAkACQCAGQf////8DSw0AIAdB/P///wdLDQACQAJA' +\n 'IAcNAEEEIQlBACEIDAELEKqAgIAAQQQhCCAHQQQQpoCAgAAiCUUNASAGIQgLIAZFDQEgB0UNASAJIAAgB/wKAAAMAQsgCCAHEOWA' +\n 'gIAAAAsgAUEBIAFBAUsbIQcCQAJAAkACQAJAAkACQAJAAkAgAkUNACAHrSACrX4iCkIgiKcNASAKpyEHCwJAIANFDQAgB60gA61+' +\n 'IgpCIIinDQEgCqchBwsgB0EASA0AIAJBAEchByAFQQhqIQAgAkUNAyABRQ0DIAEgBEsNASAFQQxqIAEgBBCOgICAACAFKQIMIQog' +\n 'BSgCFCEAIAUgAUUgAkVyIgdBf3MgA0EAR3E2AkwgBUEAIAMgBxsiBzYCSCAFIAMgAmwiCzYCRCAFIAM2AkAgBSACNgI8IAUgATYC' +\n 'OCAFIAkgB0EfdSAHQQEgAmtscUEAIAJBAUsbQQJ0aiALQQAgARsiB0EfdSAHQQEgAWtscUEAIAFBAUsbQQJ0ajYCNCAFIAg2AjAg' +\n 'BSAGNgIsIAUgCTYCKCAFIAI2AiQgBSABNgIgIAUgADYCHCAFIAo3AhQgBSAENgIQIAVBATYCDCAFQQBBAUECIAJBgYAESRsgAkGB' +\n 'AkkbOgBQIAVBDGoQioCAgAAhBwwFCwJAIAhFDQAgCSAIQQJ0QQQQp4CAgAALIAVBBjoAVCAFQQA2AnggBUKAgICAEDcCcCAFQeCR' +\n 'wIAANgIQIAVCoICAgAY3AhQgBSAFQfAAajYCDAJAIAVB1ABqIAVBDGoQsYCAgABFDQBBiJLAgABBNyAFQf8AakH4kcCAAEHAksCA' +\n 'ABCDgYCAAAALIAUgBSgCeDYCaCAFIAUpAnA3A2ACQEEALQDooMCAAEEBRg0AQQAQhICAgAALQQAhAUEAKALYoMCAAA0BQX8hB0EA' +\n 'QX82AtigwIAAAkBBACgC3KDAgAAiAkUNAEEAKALgoMCAACACQQEQp4CAgABBACgC2KDAgABBAWohAQtBACAFKAJoNgLkoMCAAEEA' +\n 'IAUpA2A3AtygwIAAQQAgATYC2KDAgAAMBAsgBSABNgIIIAVBBGohAEEFIQcMAgtBuI/AgAAQ/oCAgAAAC0EAIQQLIAAgBDYCAAJA' +\n 'IAhFDQAgCSAIQQJ0QQQQp4CAgAALIAUgBzYCVCAFIAUoAgg2AlggBSAFKAIENgJcIAVBADYCeCAFQoCAgIAQNwJwIAVB4JHAgAA2' +\n 'AhAgBUKggICABjcCFCAFIAVB8ABqNgIMIAVB1ABqIAVBDGoQmICAgAANASAFIAUoAng2AmggBSAFKQJwNwNgAkBBAC0A6KDAgABB' +\n 'AUYNAEEAEISAgIAAC0EAIQFBACgC2KDAgAANAkF/IQdBAEF/NgLYoMCAAAJAQQAoAtygwIAAIgJFDQBBACgC4KDAgAAgAkEBEKeA' +\n 'gIAAQQAoAtigwIAAQQFqIQELQQAgBSgCaDYC5KDAgABBACAFKQNgNwLcoMCAAEEAIAE2AtigwIAACyAFQYABaiSAgICAACAHDwtB' +\n 'iJLAgABBNyAFQf8AakH4kcCAAEHAksCAABCDgYCAAAALQbiPwIAAEP6AgIAAAAukAwEDfyOAgICAAEEgayIBJICAgIAAIAEgADYC' +\n 'CAJAQQAtAPygwIAAQQFGDQBBABCDgICAAAsCQAJAQQAoAuygwIAAIgJB/////wdPDQBBACACQQFqNgLsoMCAAAJAAkAgAEEAKAL4' +\n 'oMCAAE8NAEEAKAL0oMCAACAAQcgAbGoiACgCAEF/Rg0AIABBNGooAgAhAyAAQRxqKAIAIQBBACACNgLsoMCAACADQQAgABshAAwB' +\n 'C0EAIAI2AuygwIAAIAFBhYCAgACtQiCGIAFBCGqthDcDGCABQQxqQYGCwIAAIAFBGGoQ6YCAgAACQEEALQDooMCAAEEBRg0AQQAQ' +\n 'hICAgAALQQAhAkEAKALYoMCAAA0CQX8hAEEAQX82AtigwIAAAkBBACgC3KDAgAAiA0UNAEEAKALgoMCAACADQQEQp4CAgABBACgC' +\n '2KDAgABBAWohAgtBACABKAIUNgLkoMCAAEEAIAEpAgw3AtygwIAAQQAgAjYC2KDAgAALIAFBIGokgICAgAAgAA8LQYiOwIAAEICB' +\n 'gIAAAAtBuI/AgAAQ/oCAgAAACw0AIAAgARDDgICAAA8LDwAgACABIAIQx4CAgAAPCxEAIAAgASACIAMQyYCAgAAPCw0AIAAgARDN' +\n 'gICAAA8LAwAPC5MBAAJAIANB/////wNLDQAgA0ECdCIDQfz///8HSw0AAkACQCABRQ0AIAIgAUECdEEEIAMQqICAgAAhAQwBCxCq' +\n 'gICAACADQQQQpoCAgAAhAQsCQCABDQAgACADNgIIIABBBDYCBCAAQQE2AgAPCyAAIAM2AgggACABNgIEIABBADYCAA8LIABBADYC' +\n 'BCAAQQE2AgALewEDfyOAgICAAEEQayIBJICAgIAAIAFBBGogACgCACICIAAoAgQgAkEBdCICQQQgAkEESxsiAhCrgICAAAJAIAEo' +\n 'AgRBAUcNACABKAIIIAEoAgwQ5YCAgAAACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJICAgIAAC5ECAQR/AkACQAJAAkAgAigC' +\n 'CCIEQR91IAAoAgAiBXEgBGoiBCAFSw0AIAIoAgQgBSACKAIAGyIGQR91IAVxIAZqIgYgBUsNASACKAIMIgVFDQIgASgCACEDAkAg' +\n 'BiAEIAYgBEsbIgYgBGsiAg0AQQAhBAwECwJAIAVBAEgNACADIARsIQQMBAsgAyAGQX9qbCEEDAMLQciVwIAAQSMgAxDugICAAAAL' +\n 'QeuVwIAAQSEgAxDugICAAAALQYyWwIAAQRsgAxDugICAAAALAkAgBSAFQR91IgZzIAZrIgZBAUYNACACIAZuIgcgAiAHIAZsa0EA' +\n 'R2ohAgsgACACNgIAIAFBACADIAVsIAJBAkkbNgIAIAQLogEBAn8jgICAgABBIGsiAiSAgICAACACIAAoAgAtAAAiAEF/akH/AXFB' +\n 'AnQiAygCnJjAgAA2AgggAiADKAKEmMCAADYCBCACIAA6AA8gAkGNgICAAK1CIIYgAkEEaq2ENwMYIAJBjoCAgACtQiCGIAJBD2qt' +\n 'hDcDECABKAIAIAEoAgRB0oLAgAAgAkEQahDxgICAACEBIAJBIGokgICAgAAgAQsUACAAKAIAIAAoAgQgARCKgYCAAAsrACABIAAt' +\n 'AABBf2pB/wFxQQJ0IgAoAsyYwIAAIAAoArSYwIAAEPuAgIAAC58BAQJ/I4CAgIAAQSBrIgIkgICAgAAgAiAALQAAIgBBf2pB/wFx' +\n 'QQJ0IgMoApyYwIAANgIIIAIgAygChJjAgAA2AgQgAiAAOgAPIAJBjYCAgACtQiCGIAJBBGqthDcDGCACQY6AgIAArUIghiACQQ9q' +\n 'rYQ3AxAgASgCACABKAIEQdKCwIAAIAJBEGoQ8YCAgAAhASACQSBqJICAgIAAIAELXAEBfyOAgICAAEEQayICJICAgIAAIAIgADYC' +\n 'BCACQY+AgIAArUIghiACQQRqrYQ3AwggASgCACABKAIEQeKCwIAAIAJBCGoQ8YCAgAAhASACQRBqJICAgIAAIAELCQAQxoCAgAAA' +\n 'C60BAQF/I4CAgIAAQRBrIgUkgICAgAACQCACIAFqIgEgAk8NAEEAQQAQ5YCAgAAACyAFQQRqIAAoAgAiAiAAKAIEIAEgAkEBdCIC' +\n 'IAEgAksbIgJBCEEEIARBAUYbIgEgAiABSxsiAiADIAQQv4CAgAACQCAFKAIEQQFHDQAgBSgCCCAFKAIMEOWAgIAAAAsgBSgCCCEE' +\n 'IAAgAjYCACAAIAQ2AgQgBUEQaiSAgICAAAs2AQF/I4CAgIAAQRBrIgMkgICAgAAgAyACNgIMIAMgATYCCCADIAA2AgQgA0EEahC2' +\n 'gICAAAALCwAgABC6gICAAAALGwACQCAAQX9qQX5PDQAgASAAQQEQp4CAgAALCyABAX8CQCAAKAIAIgFFDQAgACgCBCABQQEQp4CA' +\n 'gAALCyIBAX8CQCAAKAIAIgFBAUgNACAAKAIEIAFBARCngICAAAsLOgEBfyOAgICAAEEQayIBJICAgIAAIAEgACkCADcCCCABQQhq' +\n 'QeSYwIAAIAAoAghBAUEAEMCAgIAAAAsLACAAELyAgIAAAAssACAAKAIAIAAoAgRBACgCiKHAgAAiAEGQgICAACAAGxGAgICAAICA' +\n 'gIAAAAsLACAAEL6AgIAAAAuWAQEDfyOAgICAAEEQayIBJICAgIAAAkAgACgCACICKAIEIgNBAXFFDQAgAigCACECIAEgA0EBdjYC' +\n 'BCABIAI2AgAgAUGYmcCAACAAKAIEIAAoAggiAC0ACCAALQAJEMCAgIAAAAsgAUF/NgIAIAEgADYCDCABQbSZwIAAIAAoAgQgACgC' +\n 'CCIALQAIIAAtAAkQwICAgAAAC7YBAgJ/AX5BASEGQQQhBwJAAkAgBa0gA61+IghCIIinRQ0AQQAhAwwBCwJAIAinIgNBgICAgHgg' +\n 'BGtNDQBBACEDDAELAkACQAJAAkAgAUUNACACIAUgAWwgBCADEKiAgIAAIQcMAQsCQCADDQAgBCEHDAILEKqAgIAAIAMgBBCmgICA' +\n 'ACEHCyAHDQAgACAENgIEDAELIAAgBzYCBEEAIQYLQQghBwsgACAHaiADNgIAIAAgBjYCAAvSAgEDfyOAgICAAEEgayIFJICAgIAA' +\n 'AkACQAJAAkACQAJAAkACQEEBENGAgIAAQf8BcQ4DBAEAAQtBACgCjKHAgAAiBkF/TA0DIAZBAWoiByAGSA0EQQAgBzYCjKHAgABB' +\n 'ACgCkKHAgABFDQEgBUEIaiAAIAEoAhQRgICAgACAgICAACAFIAQ6AB0gBSADOgAcIAUgAjYCGCAFIAUpAwg3AhBBACgCkKHAgAAg' +\n 'BUEQakEAKAKUocCAACgCFBGAgICAAICAgIAADAILIAUgACABKAIYEYCAgIAAgICAgAAAC0F/IAUQt4CAgAALQQBBACgCjKHAgAAi' +\n 'BUF/ajYCjKHAgAAgBUEATA0CQQBBADoAhKHAgAAgAw0DCwALQfCawIAAQRxBjJvAgAAQgoGAgAAAC0G8m8CAAEHNAEHkm8CAABDv' +\n 'gICAAAALIAAgARDCgICAAAALDQBBAEEBOgDgpMCAAAsOACAAIAEQs4CAgAAaAAsfAAJAIAFBCUkNACABIAAQxICAgAAPCyAAEMWA' +\n 'gIAAC/sCAQV/QQAhAgJAIAFBzf97IABBECAAQRBLGyIAa08NACAAQRAgAUELakF4cSABQQtJGyIDakEMahDFgICAACIBRQ0AIAFB' +\n 'eGohAgJAAkAgAEF/aiIEIAFxDQAgAiEADAELIAFBfGoiBSgCACIGQXhxIAQgAWpBACAAa3FBeGoiAUEAIAAgASACa0EQSxtqIgAg' +\n 'AmsiAWshBAJAIAZBA3FFDQAgACAEIAAoAgRBAXFyQQJyNgIEIAAgBGoiBCAEKAIEQQFyNgIEIAUgASAFKAIAQQFxckECcjYCACAC' +\n 'IAFqIgQgBCgCBEEBcjYCBCACIAEQy4CAgAAMAQsgAigCACECIAAgBDYCBCAAIAIgAWo2AgALAkAgACgCBCIBQQNxRQ0AIAFBeHEi' +\n 'AiADQRBqTQ0AIAAgAyABQQFxckECcjYCBCAAIANqIgEgAiADayIDQQNyNgIEIAAgAmoiAiACKAIEQQFyNgIEIAEgAxDLgICAAAsg' +\n 'AEEIaiECCyACC+snAgl/AX4jgICAgABBEGsiASSAgICAAAJAAkACQAJAIABB9QFJDQACQCAAQcz/e00NAEEAIQAMBAsgAEELaiIC' +\n 'QXhxIQNBACgCuKTAgAAiBEUNAkEfIQUgAEH1//8HTw0BIANBJiACQQh2ZyIAa3ZBAXEgAEEBdGtBPmohBQwBCwJAAkACQAJAAkAC' +\n 'QEEAKAK0pMCAACIGQRAgAEELakH4A3EgAEELSRsiA0EDdiICdiIAQQNxRQ0AIABBf3NBAXEgAmoiB0EDdCIDQayiwIAAaiIAIANB' +\n 'tKLAgABqKAIAIgIoAggiCEYNASAIIAA2AgwgACAINgIIDAILIANBACgCvKTAgABNDQYgAA0CQQAoArikwIAAIgBFDQYgAGhBAnRB' +\n 'nKHAgABqKAIAIggoAgRBeHEgA2shAiAIIQYDQAJAIAgoAhAiAA0AIAgoAhQiAA0AIAYoAhghBQJAAkACQCAGKAIMIgAgBkcNACAG' +\n 'QRRBECAGKAIUIgAbaigCACIIDQFBACEADAILIAYoAggiCCAANgIMIAAgCDYCCAwBCyAGQRRqIAZBEGogABshBwNAIAchCSAIIgBB' +\n 'FGogAEEQaiAAKAIUIggbIQcgAEEUQRAgCBtqKAIAIggNAAsgCUEANgIACyAFRQ0GAkACQCAGIAYoAhxBAnRBnKHAgABqIggoAgBG' +\n 'DQACQCAFKAIQIAZGDQAgBSAANgIUIAANAgwJCyAFIAA2AhAgAA0BDAgLIAggADYCACAARQ0GCyAAIAU2AhgCQCAGKAIQIghFDQAg' +\n 'ACAINgIQIAggADYCGAsgBigCFCIIRQ0GIAAgCDYCFCAIIAA2AhgMBgsgACgCBEF4cSADayIIIAIgCCACSSIIGyECIAAgBiAIGyEG' +\n 'IAAhCAwACwtBACAGQX4gB3dxNgK0pMCAAAsgAkEIaiEAIAIgA0EDcjYCBCACIANqIgMgAygCBEEBcjYCBAwFCwJAAkAgACACdEEC' +\n 'IAJ0IgBBACAAa3JxaCIJQQN0IgJBrKLAgABqIgggAkG0osCAAGooAgAiACgCCCIHRg0AIAcgCDYCDCAIIAc2AggMAQtBACAGQX4g' +\n 'CXdxNgK0pMCAAAsgACADQQNyNgIEIAAgA2oiBiACIANrIghBAXI2AgQgACACaiAINgIAAkBBACgCvKTAgAAiAkUNAEEAKALEpMCA' +\n 'ACEDAkACQEEAKAK0pMCAACIHQQEgAkEDdnQiCXENAEEAIAcgCXI2ArSkwIAAIAJBeHFBrKLAgABqIgIhBwwBCyACQXhxIgJBrKLA' +\n 'gABqIQcgAkG0osCAAGooAgAhAgsgByADNgIIIAIgAzYCDCADIAc2AgwgAyACNgIICyAAQQhqIQBBACAGNgLEpMCAAEEAIAg2Aryk' +\n 'wIAADAQLQQBBACgCuKTAgABBfiAGKAIcd3E2ArikwIAACwJAAkACQCACQRBJDQAgBiADQQNyNgIEIAYgA2oiCCACQQFyNgIEIAgg' +\n 'AmogAjYCAEEAKAK8pMCAACIHRQ0BQQAoAsSkwIAAIQACQAJAQQAoArSkwIAAIglBASAHQQN2dCIFcQ0AQQAgCSAFcjYCtKTAgAAg' +\n 'B0F4cUGsosCAAGoiByEJDAELIAdBeHEiB0GsosCAAGohCSAHQbSiwIAAaigCACEHCyAJIAA2AgggByAANgIMIAAgCTYCDCAAIAc2' +\n 'AggMAQsgBiACIANqIgBBA3I2AgQgBiAAaiIAIAAoAgRBAXI2AgQMAQtBACAINgLEpMCAAEEAIAI2ArykwIAACyAGQQhqIgBFDQEM' +\n 'AgtBACADayECAkACQAJAAkAgBUECdEGcocCAAGooAgAiBg0AQQAhCEEAIQAMAQtBACEIIANBAEEZIAVBAXZrIAVBH0YbdCEHQQAh' +\n 'AANAAkAgBiIGKAIEQXhxIgkgA0kNACAJIANrIgkgAk8NACAGIQggCSECIAkNAEEAIQIgBiEAIAYhCAwDCyAGKAIUIgkgACAJIAYg' +\n 'B0EddkEEcWooAhAiBkcbIAAgCRshACAHQQF0IQcgBg0ACwsCQCAAIAhyDQBBACEIQQIgBXQiAEEAIABrciAEcSIARQ0DIABoQQJ0' +\n 'QZyhwIAAaigCACEACyAARQ0BCwNAIAAoAgRBeHEiBiADayIHIAIgByACSSIJGyEFIAYgA0khByAAIAggCRshCQJAIAAoAhAiBg0A' +\n 'IAAoAhQhBgsgAiAFIAcbIQIgCCAJIAcbIQggBiEAIAYNAAsLIAhFDQACQEEAKAK8pMCAACIAIANJDQAgAiAAIANrTw0BCyAIKAIY' +\n 'IQUCQAJAAkAgCCgCDCIAIAhHDQAgCEEUQRAgCCgCFCIAG2ooAgAiBg0BQQAhAAwCCyAIKAIIIgYgADYCDCAAIAY2AggMAQsgCEEU' +\n 'aiAIQRBqIAAbIQcDQCAHIQkgBiIAQRRqIABBEGogACgCFCIGGyEHIABBFEEQIAYbaigCACIGDQALIAlBADYCAAsCQCAFRQ0AAkAC' +\n 'QAJAIAggCCgCHEECdEGcocCAAGoiBigCAEYNAAJAIAUoAhAgCEYNACAFIAA2AhQgAA0CDAQLIAUgADYCECAADQEMAwsgBiAANgIA' +\n 'IABFDQELIAAgBTYCGAJAIAgoAhAiBkUNACAAIAY2AhAgBiAANgIYCyAIKAIUIgZFDQEgACAGNgIUIAYgADYCGAwBC0EAQQAoArik' +\n 'wIAAQX4gCCgCHHdxNgK4pMCAAAsCQAJAIAJBEEkNACAIIANBA3I2AgQgCCADaiIAIAJBAXI2AgQgACACaiACNgIAAkAgAkGAAkkN' +\n 'ACAAIAIQ0ICAgAAMAgsCQAJAQQAoArSkwIAAIgZBASACQQN2dCIHcQ0AQQAgBiAHcjYCtKTAgAAgAkH4AXFBrKLAgABqIgIhBgwB' +\n 'CyACQfgBcSICQayiwIAAaiEGIAJBtKLAgABqKAIAIQILIAYgADYCCCACIAA2AgwgACAGNgIMIAAgAjYCCAwBCyAIIAIgA2oiAEED' +\n 'cjYCBCAIIABqIgAgACgCBEEBcjYCBAsgCEEIaiIADQELAkACQAJAAkACQAJAQQAoArykwIAAIgAgA08NAAJAQQAoAsCkwIAAIgAg' +\n 'A0sNACABQQRqQeCkwIAAIANBr4AEakGAgHxxEOKAgIAAAkAgASgCBCIGDQBBACEADAgLIAEoAgwhBUEAQQAoAsykwIAAIAEoAggi' +\n 'CWoiADYCzKTAgABBACAAQQAoAtCkwIAAIgIgACACSxs2AtCkwIAAAkACQAJAQQAoAsikwIAAIgJFDQBBnKLAgAAhAANAIAYgACgC' +\n 'ACIIIAAoAgQiB2pGDQIgACgCCCIADQAMAwsLAkACQEEAKALYpMCAACIARQ0AIAYgAE8NAQtBACAGNgLYpMCAAAtBAEH/HzYC3KTA' +\n 'gABBACAFNgKoosCAAEEAIAk2AqCiwIAAQQAgBjYCnKLAgABBAEGsosCAADYCuKLAgABBAEG0osCAADYCwKLAgABBAEGsosCAADYC' +\n 'tKLAgABBAEG8osCAADYCyKLAgABBAEG0osCAADYCvKLAgABBAEHEosCAADYC0KLAgABBAEG8osCAADYCxKLAgABBAEHMosCAADYC' +\n '2KLAgABBAEHEosCAADYCzKLAgABBAEHUosCAADYC4KLAgABBAEHMosCAADYC1KLAgABBAEHcosCAADYC6KLAgABBAEHUosCAADYC' +\n '3KLAgABBAEHkosCAADYC8KLAgABBAEHcosCAADYC5KLAgABBAEHsosCAADYC+KLAgABBAEHkosCAADYC7KLAgABBAEHsosCAADYC' +\n '9KLAgABBAEH0osCAADYCgKPAgABBAEH0osCAADYC/KLAgABBAEH8osCAADYCiKPAgABBAEH8osCAADYChKPAgABBAEGEo8CAADYC' +\n 'kKPAgABBAEGEo8CAADYCjKPAgABBAEGMo8CAADYCmKPAgABBAEGMo8CAADYClKPAgABBAEGUo8CAADYCoKPAgABBAEGUo8CAADYC' +\n 'nKPAgABBAEGco8CAADYCqKPAgABBAEGco8CAADYCpKPAgABBAEGko8CAADYCsKPAgABBAEGko8CAADYCrKPAgABBAEGso8CAADYC' +\n 'uKPAgABBAEG0o8CAADYCwKPAgABBAEGso8CAADYCtKPAgABBAEG8o8CAADYCyKPAgABBAEG0o8CAADYCvKPAgABBAEHEo8CAADYC' +\n '0KPAgABBAEG8o8CAADYCxKPAgABBAEHMo8CAADYC2KPAgABBAEHEo8CAADYCzKPAgABBAEHUo8CAADYC4KPAgABBAEHMo8CAADYC' +\n '1KPAgABBAEHco8CAADYC6KPAgABBAEHUo8CAADYC3KPAgABBAEHko8CAADYC8KPAgABBAEHco8CAADYC5KPAgABBAEHso8CAADYC' +\n '+KPAgABBAEHko8CAADYC7KPAgABBAEH0o8CAADYCgKTAgABBAEHso8CAADYC9KPAgABBAEH8o8CAADYCiKTAgABBAEH0o8CAADYC' +\n '/KPAgABBAEGEpMCAADYCkKTAgABBAEH8o8CAADYChKTAgABBAEGMpMCAADYCmKTAgABBAEGEpMCAADYCjKTAgABBAEGUpMCAADYC' +\n 'oKTAgABBAEGMpMCAADYClKTAgABBAEGcpMCAADYCqKTAgABBAEGUpMCAADYCnKTAgABBAEGkpMCAADYCsKTAgABBAEGcpMCAADYC' +\n 'pKTAgABBACAGQQ9qQXhxIgBBeGoiAjYCyKTAgABBAEGkpMCAADYCrKTAgABBACAGIABrIAlBWGoiAGpBCGoiCDYCwKTAgAAgAiAI' +\n 'QQFyNgIEIAYgAGpBKDYCBEEAQYCAgAE2AtSkwIAADAgLIAIgBk8NACAIIAJLDQAgACgCDCIIQQFxDQAgCEEBdiAFRg0DC0EAQQAo' +\n 'AtikwIAAIgAgBiAAIAZJGzYC2KTAgAAgBiAJaiEIQZyiwIAAIQACQAJAAkADQCAAKAIAIgcgCEYNASAAKAIIIgANAAwCCwsgACgC' +\n 'DCIIQQFxDQAgCEEBdiAFRg0BC0GcosCAACEAAkADQAJAIAAoAgAiCCACSw0AIAIgCCAAKAIEaiIISQ0CCyAAKAIIIQAMAAsLQQAg' +\n 'BkEPakF4cSIAQXhqIgc2AsikwIAAQQAgBiAAayAJQVhqIgBqQQhqIgQ2AsCkwIAAIAcgBEEBcjYCBCAGIABqQSg2AgRBAEGAgIAB' +\n 'NgLUpMCAACACIAhBYGpBeHFBeGoiACAAIAJBEGpJGyIHQRs2AgRBACkCnKLAgAAhCiAHQRBqQQApAqSiwIAANwIAIAdBCGoiACAK' +\n 'NwIAQQAgBTYCqKLAgABBACAJNgKgosCAAEEAIAY2ApyiwIAAQQAgADYCpKLAgAAgB0EcaiEAA0AgAEEHNgIAIABBBGoiACAISQ0A' +\n 'CyAHIAJGDQcgByAHKAIEQX5xNgIEIAIgByACayIAQQFyNgIEIAcgADYCAAJAIABBgAJJDQAgAiAAENCAgIAADAgLAkACQEEAKAK0' +\n 'pMCAACIIQQEgAEEDdnQiBnENAEEAIAggBnI2ArSkwIAAIABB+AFxQayiwIAAaiIAIQgMAQsgAEH4AXEiAEGsosCAAGohCCAAQbSi' +\n 'wIAAaigCACEACyAIIAI2AgggACACNgIMIAIgCDYCDCACIAA2AggMBwsgACAGNgIAIAAgACgCBCAJajYCBCAGQQ9qQXhxQXhqIggg' +\n 'A0EDcjYCBCAHQQ9qQXhxQXhqIgIgCCADaiIAayEDIAJBACgCyKTAgABGDQMgAkEAKALEpMCAAEYNBAJAIAIoAgQiBkEDcUEBRw0A' +\n 'IAIgBkF4cSIGEMqAgIAAIAYgA2ohAyACIAZqIgIoAgQhBgsgAiAGQX5xNgIEIAAgA0EBcjYCBCAAIANqIAM2AgACQCADQYACSQ0A' +\n 'IAAgAxDQgICAAAwGCwJAAkBBACgCtKTAgAAiAkEBIANBA3Z0IgZxDQBBACACIAZyNgK0pMCAACADQfgBcUGsosCAAGoiAyECDAEL' +\n 'IANB+AFxIgNBrKLAgABqIQIgA0G0osCAAGooAgAhAwsgAiAANgIIIAMgADYCDCAAIAI2AgwgACADNgIIDAULQQAgACADayICNgLA' +\n 'pMCAAEEAQQAoAsikwIAAIgAgA2oiCDYCyKTAgAAgCCACQQFyNgIEIAAgA0EDcjYCBCAAQQhqIQAMBgtBACgCxKTAgAAhAgJAAkAg' +\n 'ACADayIIQQ9LDQBBAEEANgLEpMCAAEEAQQA2ArykwIAAIAIgAEEDcjYCBCACIABqIgAgACgCBEEBcjYCBAwBC0EAIAg2ArykwIAA' +\n 'QQAgAiADaiIGNgLEpMCAACAGIAhBAXI2AgQgAiAAaiAINgIAIAIgA0EDcjYCBAsgAkEIaiEADAULIAAgByAJajYCBEEAQQAoAsik' +\n 'wIAAIgBBD2pBeHEiAkF4aiIINgLIpMCAAEEAIAAgAmtBACgCwKTAgAAgCWoiAmpBCGoiBjYCwKTAgAAgCCAGQQFyNgIEIAAgAmpB' +\n 'KDYCBEEAQYCAgAE2AtSkwIAADAMLQQAgADYCyKTAgABBAEEAKALApMCAACADaiIDNgLApMCAACAAIANBAXI2AgQMAQtBACAANgLE' +\n 'pMCAAEEAQQAoArykwIAAIANqIgM2ArykwIAAIAAgA0EBcjYCBCAAIANqIAM2AgALIAhBCGohAAwBC0EAIQBBACgCwKTAgAAiAiAD' +\n 'TQ0AQQAgAiADayICNgLApMCAAEEAQQAoAsikwIAAIgAgA2oiCDYCyKTAgAAgCCACQQFyNgIEIAAgA0EDcjYCBCAAQQhqIQALIAFB' +\n 'EGokgICAgAAgAAsDAAALcAECfwJAAkAgAEF8aigCACIDQXhxIgRBBEEIIANBA3EiAxsgAWpJDQACQCADRQ0AIAQgAUEnaksNAgsg' +\n 'ABDIgICAAA8LQfCZwIAAQS5BoJrAgAAQ7oCAgAAAC0GwmsCAAEEuQeCawIAAEO6AgIAAAAvmBgEEfyAAQXhqIgEgAEF8aigCACIC' +\n 'QXhxIgBqIQMCQAJAIAJBAXENACACQQJxRQ0BIAEoAgAiAiAAaiEAAkAgASACayIBQQAoAsSkwIAARw0AIAMoAgRBA3FBA0cNAUEA' +\n 'IAA2ArykwIAAIAMgAygCBEF+cTYCBCABIABBAXI2AgQgAyAANgIADwsgASACEMqAgIAACwJAAkACQAJAAkACQAJAAkAgAygCBCIC' +\n 'QQJxDQAgA0EAKALIpMCAAEYNAiADQQAoAsSkwIAARg0DIAMgAkF4cSICEMqAgIAAIAEgAiAAaiIAQQFyNgIEIAEgAGogADYCACAB' +\n 'QQAoAsSkwIAARw0BQQAgADYCvKTAgAAPCyADIAJBfnE2AgQgASAAQQFyNgIEIAEgAGogADYCAAsgAEGAAkkNBCABIAAQ0ICAgABB' +\n 'AEEAKALcpMCAAEF/aiIBNgLcpMCAACABDQZBACgCpKLAgAAiAA0CQf8fIQEMAwtBACABNgLIpMCAAEEAQQAoAsCkwIAAIABqIgA2' +\n 'AsCkwIAAIAEgAEEBcjYCBAJAIAFBACgCxKTAgABHDQBBAEEANgK8pMCAAEEAQQA2AsSkwIAACyAAQQAoAtSkwIAAIgJNDQVBACgC' +\n 'yKTAgAAiAEUNBUEAKALApMCAACIEQSlJDQRBnKLAgAAhAQNAAkAgASgCACIDIABLDQAgACADIAEoAgRqSQ0GCyABKAIIIQEMAAsL' +\n 'QQAgATYCxKTAgABBAEEAKAK8pMCAACAAaiIANgK8pMCAACABIABBAXI2AgQgASAAaiAANgIADwtBACEBA0AgAUEBaiEBIAAoAggi' +\n 'AA0ACyABQf8fIAFB/x9LGyEBC0EAIAE2AtykwIAADwsCQAJAQQAoArSkwIAAIgNBASAAQQN2dCICcQ0AQQAgAyACcjYCtKTAgAAg' +\n 'AEH4AXFBrKLAgABqIgAhAwwBCyAAQfgBcSIAQayiwIAAaiEDIABBtKLAgABqKAIAIQALIAMgATYCCCAAIAE2AgwgASADNgIMIAEg' +\n 'ADYCCA8LAkACQEEAKAKkosCAACIADQBB/x8hAQwBC0EAIQEDQCABQQFqIQEgACgCCCIADQALIAFB/x8gAUH/H0sbIQELQQAgATYC' +\n '3KTAgAAgBCACTQ0AQQBBfzYC1KTAgAALC7UHAQZ/AkACQAJAAkACQAJAAkACQCAAQXxqIgQoAgAiBUF4cSIGQQRBCCAFQQNxIgcb' +\n 'IAFqSQ0AIAFBJ2ohCAJAIAdFDQAgBiAISw0CCwJAAkAgAkEJSQ0AIAIgAxDEgICAACICDQFBAA8LQQAhAiADQcz/e0sNCEEQIANB' +\n 'C2pBeHEgA0ELSRshASAAQXhqIQgCQCAHDQAgAUGAAkkNByAIRQ0HIAYgAU0NByAGIAFrQYCACEsNByAADwsgCCAGaiEHAkACQCAG' +\n 'IAFPDQAgB0EAKALIpMCAAEYNAQJAIAdBACgCxKTAgABGDQAgBygCBCIFQQJxDQkgBUF4cSIJIAZqIgUgAUkNCSAHIAkQyoCAgAAC' +\n 'QCAFIAFrIgdBEEkNACAEIAEgBCgCAEEBcXJBAnI2AgAgCCABaiIBIAdBA3I2AgQgCCAFaiIFIAUoAgRBAXI2AgQgASAHEMuAgIAA' +\n 'DAkLIAQgBSAEKAIAQQFxckECcjYCACAIIAVqIgEgASgCBEEBcjYCBAwIC0EAKAK8pMCAACAGaiIHIAFJDQgCQAJAIAcgAWsiBkEP' +\n 'Sw0AIAQgBUEBcSAHckECcjYCACAIIAdqIgEgASgCBEEBcjYCBEEAIQZBACEBDAELIAQgASAFQQFxckECcjYCACAIIAFqIgEgBkEB' +\n 'cjYCBCAIIAdqIgcgBjYCACAHIAcoAgRBfnE2AgQLQQAgATYCxKTAgABBACAGNgK8pMCAAAwHCyAGIAFrIgZBD00NBiAEIAEgBUEB' +\n 'cXJBAnI2AgAgCCABaiIBIAZBA3I2AgQgByAHKAIEQQFyNgIEIAEgBhDLgICAAAwGC0EAKALApMCAACAGaiIHIAFLDQQMBgsCQCAD' +\n 'IAEgAyABSRsiA0UNACACIAAgA/wKAAALIAQoAgAiA0F4cSIHQQRBCCADQQNxIgMbIAFqSQ0CIANFDQYgByAITQ0GQbCawIAAQS5B' +\n '4JrAgAAQ7oCAgAAAC0HwmcCAAEEuQaCawIAAEO6AgIAAAAtBsJrAgABBLkHgmsCAABDugICAAAALQfCZwIAAQS5BoJrAgAAQ7oCA' +\n 'gAAACyAEIAEgBUEBcXJBAnI2AgAgCCABaiIFIAcgAWsiAUEBcjYCBEEAIAE2AsCkwIAAQQAgBTYCyKTAgAALIAhFDQAgAA8LIAMQ' +\n 'xYCAgAAiAUUNAQJAIANBfEF4IAQoAgAiAkEDcRsgAkF4cWoiAiADIAJJGyIDRQ0AIAEgACAD/AoAAAsgASECCyAAEMiAgIAACyAC' +\n 'C5IDAQR/IAAoAgwhAgJAAkACQAJAIAFBgAJJDQAgACgCGCEDAkACQAJAIAIgAEcNACAAQRRBECAAKAIUIgIbaigCACIBDQFBACEC' +\n 'DAILIAAoAggiASACNgIMIAIgATYCCAwBCyAAQRRqIABBEGogAhshBANAIAQhBSABIgJBFGogAkEQaiACKAIUIgEbIQQgAkEUQRAg' +\n 'ARtqKAIAIgENAAsgBUEANgIACyADRQ0CAkACQCAAIAAoAhxBAnRBnKHAgABqIgEoAgBGDQAgAygCECAARg0BIAMgAjYCFCACDQMM' +\n 'BAsgASACNgIAIAJFDQQMAgsgAyACNgIQIAINAQwCCwJAIAIgACgCCCIERg0AIAQgAjYCDCACIAQ2AggPC0EAQQAoArSkwIAAQX4g' +\n 'AUEDdndxNgK0pMCAAA8LIAIgAzYCGAJAIAAoAhAiAUUNACACIAE2AhAgASACNgIYCyAAKAIUIgFFDQAgAiABNgIUIAEgAjYCGA8L' +\n 'DwtBAEEAKAK4pMCAAEF+IAAoAhx3cTYCuKTAgAALtAQBAn8gACABaiECAkACQAJAIAAoAgQiA0EBcQ0AIANBAnFFDQEgACgCACID' +\n 'IAFqIQECQCAAIANrIgBBACgCxKTAgABHDQAgAigCBEEDcUEDRw0BQQAgATYCvKTAgAAgAiACKAIEQX5xNgIEIAAgAUEBcjYCBCAC' +\n 'IAE2AgAPCyAAIAMQyoCAgAALAkACQAJAIAIoAgQiA0ECcQ0AIAJBACgCyKTAgABGDQIgAkEAKALEpMCAAEYNBCACIANBeHEiAxDK' +\n 'gICAACAAIAMgAWoiAUEBcjYCBCAAIAFqIAE2AgAgAEEAKALEpMCAAEcNAUEAIAE2ArykwIAADwsgAiADQX5xNgIEIAAgAUEBcjYC' +\n 'BCAAIAFqIAE2AgALAkAgAUGAAkkNACAAIAEQ0ICAgAAPCwJAAkBBACgCtKTAgAAiAkEBIAFBA3Z0IgNxDQBBACACIANyNgK0pMCA' +\n 'ACABQfgBcUGsosCAAGoiASECDAELIAFB+AFxIgFBrKLAgABqIQIgAUG0osCAAGooAgAhAQsgAiAANgIIIAEgADYCDCAAIAI2Agwg' +\n 'ACABNgIIDwtBACAANgLIpMCAAEEAQQAoAsCkwIAAIAFqIgE2AsCkwIAAIAAgAUEBcjYCBCAAQQAoAsSkwIAARw0AQQBBADYCvKTA' +\n 'gABBAEEANgLEpMCAAAsPC0EAIAA2AsSkwIAAQQBBACgCvKTAgAAgAWoiATYCvKTAgAAgACABQQFyNgIEIAAgAWogATYCAAs4AgF/' +\n 'AX4jgICAgABBEGsiASSAgICAACAAKQIAIQIgASAANgIMIAEgAjcCBCABQQRqEL2AgIAAAAtNAAJAAkAgAUEJSQ0AIAEgABDEgICA' +\n 'ACEBDAELIAAQxYCAgAAhAQsCQCABRQ0AIAFBfGotAABBA3FFDQAgAEUNACABQQAgAPwLAAsgAQsNACABIAAQz4CAgAAACy8BAX8j' +\n 'gICAgABBEGsiAiSAgICAACACIAE2AgwgAiAANgIIIAJBCGoQu4CAgAAAC84CAQR/QQAhAgJAIAFBCHYiA0UNAEEfIQIgAUGAgIAI' +\n 'Tw0AIAFBJiADZyICa3ZBAXEgAkEBdHJBPnMhAgsgAEIANwIQIAAgAjYCHCACQQJ0QZyhwIAAaiEDAkBBACgCuKTAgABBASACdCIE' +\n 'cQ0AIAMgADYCACAAIAM2AhggACAANgIMIAAgADYCCEEAQQAoArikwIAAIARyNgK4pMCAAA8LAkACQAJAIAMoAgAiBCgCBEF4cSAB' +\n 'Rw0AIAQhAgwBCyABQQBBGSACQQF2ayACQR9GG3QhAwNAIAQgA0EddkEEcWoiBSgCECICRQ0CIANBAXQhAyACIQQgAigCBEF4cSAB' +\n 'Rw0ACwsgAigCCCIDIAA2AgwgAiAANgIIIABBADYCGCAAIAI2AgwgACADNgIIDwsgBUEQaiAANgIAIAAgBDYCGCAAIAA2AgwgACAA' +\n 'NgIIC14BAn9BACEBQQBBACgCmKHAgAAiAkEBajYCmKHAgAACQCACQQBIDQBBASEBQQAtAIShwIAADQBBACAAOgCEocCAAEEAQQAo' +\n 'AoChwIAAQQFqNgKAocCAAEECIQELIAELHgAgAEEAKQLomcCAADcCCCAAQQApAuCZwIAANwIACx4AIABBACkC2JnAgAA3AgggAEEA' +\n 'KQLQmcCAADcCAAshAAJAIAEoAgBFDQAgAEGcm8CAADYCBCAAIAE2AgAPCwALZgECfyABKAIAIQIgAUEANgIAAkACQCACRQ0AIAEo' +\n 'AgQhAxCqgICAAEEIQQQQpoCAgAAiAUUNASABIAM2AgQgASACNgIAIABBnJvAgAA2AgQgACABNgIADwsAC0EEQQgQ54CAgAAAC0QA' +\n 'AkAgACgCAEF/Rg0AIAEgACgCBCAAKAIIEPuAgIAADwsgASgCACABKAIEIAAoAgwoAgAiACgCACAAKAIEEPGAgIAACxQAIABBnJvA' +\n 'gAA2AgQgACABNgIACwwAIAAgASkCADcDAAtUAQJ/IAEoAgQhAiABKAIAIQMQqoCAgAACQEEIQQQQpoCAgAAiAQ0AQQRBCBDngICA' +\n 'AAALIAEgAjYCBCABIAM2AgAgAEGcm8CAADYCBCAAIAE2AgALFAAgASAAKAIAIAAoAgQQ+4CAgAALngIBBn8gACgCCCECAkACQCAB' +\n 'QYABTw0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLAkAgAyAAKAIAIAJrTQ0AIAAgAiADQQFBARC0gICA' +\n 'AAsgACgCBCACaiEEAkACQCABQYABSQ0AIAFBP3FBgH9yIQUgAUEGdiEGAkAgAUGAEE8NACAEIAU6AAEgBCAGQcABcjoAAAwCCyAB' +\n 'QQx2IQcgBkE/cUGAf3IhBgJAIAFB//8DSw0AIAQgBToAAiAEIAY6AAEgBCAHQeABcjoAAAwCCyAEIAU6AAMgBCAGOgACIAQgB0E/' +\n 'cUGAf3I6AAEgBCABQRJ2QXByOgAADAELIAQgAToAAAsgACADIAJqNgIIQQALXgEBfwJAAkACQCACIAAoAgAgACgCCCIDa00NACAA' +\n 'IAMgAkEBQQEQtICAgAAgACgCCCEDDAELIAJFDQELIAJFDQAgACgCBCADaiABIAL8CgAACyAAIAMgAmo2AghBAAsiAQF/AkAgACgC' +\n 'ACICRQ0AIAEgAiAAKAIEEPuAgIAADwsAC6EBAgJ/AX4jgICAgABBIGsiAiSAgICAAAJAIAEoAgBBf0cNACABKAIMIQMgAkEANgIc' +\n 'IAJCgICAgBA3AhQgAkEUakGAmcCAACADKAIAIgMoAgAgAygCBBDxgICAABogAiACKAIcIgM2AhAgAiACKQIUIgQ3AwggASADNgII' +\n 'IAEgBDcCAAsgAEGsm8CAADYCBCAAIAE2AgAgAkEgaiSAgICAAAuFAgICfwF+I4CAgIAAQSBrIgIkgICAgAACQCABKAIAQX9HDQAg' +\n 'ASgCDCEDIAJBADYCGCACQoCAgIAQNwIQIAJBEGpBgJnAgAAgAygCACIDKAIAIAMoAgQQ8YCAgAAaIAIgAigCGCIDNgIIIAIgAikC' +\n 'ECIENwMAIAEgAzYCCCABIAQ3AgALIAEoAgghAyABQQA2AgggASkCACEEIAFCgICAgBA3AgAgAiADNgIYIAIgBDcDEBCqgICAAAJA' +\n 'QQxBBBCmgICAACIBDQBBBEEMEOeAgIAAAAsgASACKAIYNgIIIAEgAikDEDcCACAAQaybwIAANgIEIAAgATYCACACQSBqJICAgIAA' +\n 'CwkAIABBADYCAAsUACAAQYCZwIAAIAEgAhDxgICAAAvAAQECfwJAAkAgAkUNAEEALQDhpMCAACEDQQBBAToA4aTAgABB8KTAgAAh' +\n 'BEGAgMSAAEHwpMCAAE0NACACQYCAxIAAQfCkwIAAa0sNACADQf8BcQ0AQYCAxIAAQfCkwIAAayECDAELQQAhBAJAIAJBEHYgAkH/' +\n '/wNxQQBHaiICQAAiA0F/Rw0AQQAhAgwBCyACQRB0IgJBcGogAiADQRB0IgRBACACa0YbIQILIABBADYCCCAAIAI2AgQgACAENgIA' +\n 'CyABAX8CQCAAKAIAIgFFDQAgACgCBCABQQEQp4CAgAALC58BAQF/I4CAgIAAQRBrIgMkgICAgAACQCACIAFqIgEgAk8NAEEAQQAQ' +\n '5YCAgAAACyADQQRqIAAoAgAiAiAAKAIEIAEgAkEBdCICIAEgAksbIgJBCCACQQhLGyICEOaAgIAAAkAgAygCBEEBRw0AIAMoAggg' +\n 'AygCDBDlgICAAAALIAMoAgghASAAIAI2AgAgACABNgIEIANBEGokgICAgAALHAACQCAARQ0AIAAgARDngICAAAALEOiAgIAAAAuQ' +\n 'AQACQAJAIANBAE4NAEEBIQFBBCECQQAhAwwBCwJAAkACQAJAIAFFDQAgAiABQQEgAxCogICAACEBDAELAkAgAw0AQQEhAQwCCxCq' +\n 'gICAACADQQEQpoCAgAAhAQsgAQ0AQQEhASAAQQE2AgQMAQsgACABNgIEQQAhAQtBCCECCyAAIAJqIAM2AgAgACABNgIACw0AIAEg' +\n 'ABDOgICAAAALFwBB9JvAgABBI0GInMCAABDvgICAAAALpQMBBn8jgICAgABBEGsiAySAgICAAAJAAkACQAJAAkACQAJAIAJBAXFF' +\n 'DQAgAkEBdiEEDAELIAEtAAAiBEUNAUEAIQUgASEGQQAhBwNAIAZBAWohBgJAAkAgBMBBf0oNAAJAIARB/wFxQYABRw0AIAUgBi8A' +\n 'ACIEaiEFIAYgBGpBAmohBgwCCyAGIARBA3FBCHgiCEEFdEGAgICABHEgCEEHdHJBHXZqIARBAXZBAnFqIARBAnZBAnFqIQYgBUUg' +\n 'B3IhBwwBCyAGIARB/wFxIgRqIQYgBSAEaiEFCyAGLQAAIgQNAAtBACEEIAcgBUEQSXENAEEAIQcgBUEBdCIEQQBIDQQLIAQNAQtB' +\n 'ASEGQQAhBAwBCxCqgICAAEEBIQcgBEEBEKaAgIAAIgZFDQELIANBADYCCCADIAY2AgQgAyAENgIAIANBmJzAgAAgASACEPGAgIAA' +\n 'RQ0BQcCcwIAAQdYAIANBD2pBsJzAgABBmJ3AgAAQg4GAgAAACyAHIAQQ5YCAgAAACyAAIAMoAgg2AgggACADKQIANwIAIANBEGok' +\n 'gICAgAALEgAgAUGoncCAAEEFEPuAgIAAC5oCAQZ/IAAoAgghAgJAAkAgAUGAAU8NAEEBIQMMAQsCQCABQYAQTw0AQQIhAwwBC0ED' +\n 'QQQgAUGAgARJGyEDCwJAIAMgACgCACACa00NACAAIAIgAxDkgICAAAsgACgCBCACaiEEAkACQCABQYABSQ0AIAFBP3FBgH9yIQUg' +\n 'AUEGdiEGAkAgAUGAEE8NACAEIAU6AAEgBCAGQcABcjoAAAwCCyABQQx2IQcgBkE/cUGAf3IhBgJAIAFB//8DSw0AIAQgBToAAiAE' +\n 'IAY6AAEgBCAHQeABcjoAAAwCCyAEIAU6AAMgBCAGOgACIAQgB0E/cUGAf3I6AAEgBCABQRJ2QXByOgAADAELIAQgAToAAAsgACAD' +\n 'IAJqNgIIQQALWgEBfwJAAkACQCACIAAoAgAgACgCCCIDa00NACAAIAMgAhDkgICAACAAKAIIIQMMAQsgAkUNAQsgAkUNACAAKAIE' +\n 'IANqIAEgAvwKAAALIAAgAyACajYCCEEACxQAIABBmJzAgAAgASACEPGAgIAACxUAIAAgAUEBdEEBciACEO+AgIAAAAtHAQF/I4CA' +\n 'gIAAQSBrIgMkgICAgAAgAyABNgIQIAMgADYCDCADQQE7ARwgAyACNgIYIAMgA0EMajYCFCADQRRqEMyAgIAAAAsUACABIAAoAgAg' +\n 'ACgCBBD6gICAAAv0BAEIfyOAgICAAEEQayIEJICAgIAAAkACQAJAIANBAXENACACLQAAIgUNAUEAIQUMAgsgACACIANBAXYgASgC' +\n 'DBGBgICAAICAgIAAIQUMAQsgASgCDCEGQQAhBwNAIAJBAWohCAJAAkACQAJAAkAgBcBBf0oNACAFQf8BcSIJQYABRg0BIAlBwAFH' +\n 'DQMgBCABNgIEIAQgADYCACAEQqCAgIAGNwIIIAMgB0EDdGoiBSgCACAEIAUoAgQRgoCAgACAgICAAEUNAkEBIQUMBgsCQCAAIAgg' +\n 'BUH/AXEiBSAGEYGAgIAAgICAgAANACAIIAVqIQIMBAtBASEFDAULAkAgACACQQNqIgUgAi8AASICIAYRgYCAgACAgICAAA0AIAUg' +\n 'AmohAgwDC0EBIQUMBAsgB0EBaiEHIAghAgwBC0GggICABiEKAkAgBUEBcUUNACACQQVqIQggAigAASEKC0EAIQkCQAJAIAVBAnEN' +\n 'AEEAIQsgCCECDAELIAhBAmohAiAILwAAIQsLAkACQCAFQQRxDQAgAiEIDAELIAJBAmohCCACLwAAIQkLAkACQCAFQQhxDQAgCCEC' +\n 'DAELIAhBAmohAiAILwAAIQcLAkAgBUEQcUUNACADIAtB//8DcUEDdGovAQQhCwsCQCAFQSBxRQ0AIAMgCUH//wNxQQN0ai8BBCEJ' +\n 'CyAEIAk7AQ4gBCALOwEMIAQgCjYCCCAEIAE2AgQgBCAANgIAAkAgAyAHQQN0aiIFKAIAIAQgBSgCBBGCgICAAICAgIAARQ0AQQEh' +\n 'BQwDCyAHQQFqIQcLIAItAAAiBQ0AC0EAIQULIARBEGokgICAgAAgBQtfAgF/AX4jgICAgABBIGsiAySAgICAACADIAE2AgwgAyAA' +\n 'NgIIIANBqICAgACtQiCGIgQgA0EIaq2ENwMYIAMgBCADQQxqrYQ3AxBBo4HAgAAgA0EQaiACEO+AgIAAAAvJBAELfyAAKAIEIQMg' +\n 'ACgCACEEIAAoAgghBUEAIQZBACEHQQAhCEEAIQkCQANAIAlBAXENAQJAAkAgAiAISQ0AA0AgASAIaiEJAkACQAJAAkACQAJAIAIg' +\n 'CGsiCkEHSw0AIAIgCEcNASACIQgMBwsgCUEDakF8cSIAIAlGDQEgACAJayEAQQAhCwNAIAkgC2otAABBCkYNBSAAIAtBAWoiC0cN' +\n 'AAsgACAKQXhqIgxLDQMMAgtBACELA0AgCSALai0AAEEKRg0EIAogC0EBaiILRw0ACyACIQgMBQsgCkF4aiEMQQAhAAsDQEGAgoQI' +\n 'IAkgAGoiCygCACINQYqUqNAAc2sgDXJBgIKECCALQQRqKAIAIgtBipSo0ABzayALcnFBgIGChHhxQYCBgoR4Rw0BIABBCGoiACAM' +\n 'TQ0ACwsCQCAKIABHDQAgAiEIDAMLA0ACQCAJIABqLQAAQQpHDQAgACELDAILIAogAEEBaiIARw0ACyACIQgMAgsgCCALaiIAQQFq' +\n 'IQgCQCAAIAJPDQAgCSALai0AAEEKRw0AQQAhCSAIIQogCCEADAMLIAIgCE8NAAsLIAIgB0YNAkEBIQkgByEKIAIhAAsCQAJAIAUt' +\n 'AABFDQAgBEGJoMCAAEEEIAMoAgwRgYCAgACAgICAAA0BCyAAIAdrIQ1BACELAkAgACAHRg0AIAEgAGpBf2otAABBCkYhCwsgASAH' +\n 'aiEAIAUgCzoAACAKIQcgBCAAIA0gAygCDBGBgICAAICAgIAARQ0BCwtBASEGCyAGC8oCAQR/I4CAgIAAQSBrIgMkgICAgABBASEE' +\n 'AkAgAC0ABA0AIAAtAAUhBQJAAkAgACgCACIGLQAKQYABcQ0AQQEhBCAFQQFxRQ0BIAYoAgBBvZ3AgABBAiAGKAIEKAIMEYGAgIAA' +\n 'gICAgABFDQEMAgtBASEEAkAgBUEBcQ0AIAYoAgBBwZ3AgABBASAGKAIEKAIMEYGAgIAAgICAgAANAgtBASEEIANBAToADyADQcSd' +\n 'wIAANgIUIAMgBikCADcCACADIAYpAgg3AhggAyADQQ9qNgIIIAMgAzYCECABIANBEGogAigCDBGCgICAAICAgIAADQEgAygCEEG/' +\n 'ncCAAEECIAMoAhQoAgwRgYCAgACAgICAACEEDAELIAEgBiACKAIMEYKAgIAAgICAgAAhBAsgAEEBOgAFIAAgBDoABCADQSBqJICA' +\n 'gIAAIAALQgEBf0EBIQECQCAALQAEDQAgACgCACIBKAIAQcKdwIAAQQEgASgCBCgCDBGBgICAAICAgIAAIQELIAAgAToABCABCzsB' +\n 'AX8gASgCAEHPn8CAAEEBIAEoAgQoAgwRgYCAgACAgICAACECIABBADoABSAAIAI6AAQgACABNgIAC5kGAgh/AX5BK0F/IAAoAggi' +\n 'BkGAgIABcSIHGyEIIAdBFXZBASABGyAFaiEJAkACQCAGQYCAgARxDQBBACECDAELAkACQCADQRBJDQAgAiADEPiAgIAAIQcMAQsC' +\n 'QCADDQBBACEHDAELIANBA3EhCkEAIQtBACEHAkAgA0EESQ0AIANBDHEhDEEAIQtBACEHA0AgByACIAtqIg0sAABBv39KaiANQQFq' +\n 'LAAAQb9/SmogDUECaiwAAEG/f0pqIA1BA2osAABBv39KaiEHIAwgC0EEaiILRw0ACyAKRQ0BCyACIAtqIQ0DQCAHIA0sAABBv39K' +\n 'aiEHIA1BAWohDSAKQX9qIgoNAAsLIAcgCWohCQsgCEEtIAEbIQwCQAJAIAkgAC8BDCIBTw0AAkACQAJAIAZBgICACHENACABIAlr' +\n 'IQhBACEHQQAhAQJAAkACQCAGQR12QQNxDgQCAAEAAgsgCCEBDAELIAhB/v8DcUEBdiEBCyAGQf///wBxIQkgACgCBCELIAAoAgAh' +\n 'CgNAIAdB//8DcSABQf//A3FPDQJBASENIAdBAWohByAKIAkgCygCEBGCgICAAICAgIAARQ0ADAULCyAAIAApAggiDqdBgICA/3lx' +\n 'QbCAgIACcjYCCEEBIQ0gACgCACIKIAAoAgQiCyAMIAIgAxD5gICAAA0DQQAhByABIAlrQf//A3EhAgNAIAdB//8DcSACTw0CQQEh' +\n 'DSAHQQFqIQcgCkEwIAsoAhARgoCAgACAgICAAEUNAAwECwtBASENIAogCyAMIAIgAxD5gICAAA0CIAogBCAFIAsoAgwRgYCAgACA' +\n 'gICAAA0CQQAhByAIIAFrQf//A3EhAANAIAdB//8DcSICIABJIQ0gAiAATw0DIAdBAWohByAKIAkgCygCEBGCgICAAICAgIAARQ0A' +\n 'DAMLC0EBIQ0gCiAEIAUgCygCDBGBgICAAICAgIAADQEgACAONwIIQQAPC0EBIQ0gACgCACIHIAAoAgQiCiAMIAIgAxD5gICAAA0A' +\n 'IAcgBCAFIAooAgwRgYCAgACAgICAACENCyANC+sGAQh/AkACQCABIABBA2pBfHEiAiAAayIDSQ0AIAEgA2siBEECdiIFRQ0AIARB' +\n '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' +\n 'A3FBAXQvAIeewIAAOwAAIANBfGohAyAAQf+s4gRLDQALCwJAAkAgBUEJSw0AIAUhAAwBCyACQQZqIANBfmoiA2ogBSAFQf//A3FB' +\n '5ABuIgBB5ABsa0H//wNxQQF0LwCHnsCAADsAAAsCQAJAIARFDQAgAEUNAQsgAkEGaiADQX9qIgNqIABBAXQtAIiewIAAOgAACyAB' +\n 'IARBf3NBH3ZBAUEAIAJBBmogA2pBCiADaxD3gICAACEDIAJBEGokgICAgAAgAwt+AQJ/I4CAgIAAQRBrIgIkgICAgAAgACgCACED' +\n 'QQAhAANAIAJBCGogAGpBB2ogA0EPcS0Aj6DAgAA6AAAgAEF/aiEAIANBBHYiAw0ACyABQQFBjaDAgABBAiACQQhqIABqQQhqQQAg' +\n 'AGsQ94CAgAAhACACQRBqJICAgIAAIAALDgAgAiAAIAEQ+oCAgAALFAAgAEHEncCAACABIAIQ8YCAgAALC+EgAQBBgIDAAAvXID1O' +\n 'dW1iZXIgb2YgY2x1c3RlcnMgKGtzKSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMioqMzIgLSAxLiBHb3QgwAA0TnVtYmVyIG9mIHN1' +\n 'YnNwYWNlcyAobSkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4gR290IMAAC0NvZGUgdmFsdWUgwBwgZXhjZWVkcyBudW1iZXIgb2Yg' +\n 'Y2x1c3RlcnMgwAAgaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyDAEiBidXQgdGhlIGluZGV4IGlzIMAAJEVuY29kZWQg' +\n 'dmFsdWVzIGV4Y2VlZCB0aGUgcmFuZ2UgZm9yIMAAFVVua25vd24gbW9kZWwgaGFuZGxlIMAAL25kYXJyYXk6IGNvdWxkIG5vdCBi' +\n 'cm9hZGNhc3QgYXJyYXkgZnJvbSBzaGFwZTogwAUgdG86IMAAC1NoYXBlRXJyb3IvwAI6IMAAL3J1c3RjLzJkODE0NGI3ODgwNTk3' +\n 'YjZlNmQzZGZkNjNhOWE5ZWZhZTNmNTMzZDMvbGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAC9jYXJnby9yZWdpc3RyeS9zcmMvaW5k' +\n 'ZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbmRhcnJheS0wLjE2LjEvc3JjL2ltcGxfY29uc3RydWN0b3JzLnJzAHNyYy92' +\n 'ZW5kb3IvdXRpbHMucnMAL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9uZGFycmF5' +\n 'LTAuMTYuMS9zcmMvaW1wbF9tZXRob2RzLnJzAC9ydXN0Yy8yZDgxNDRiNzg4MDU5N2I2ZTZkM2RmZDYzYTlhOWVmYWUzZjUzM2Qz' +\n 'L2xpYnJhcnkvc3RkL3NyYy9zeXMvdGhyZWFkX2xvY2FsL25vX3RocmVhZHMucnMAL3J1c3RjLzJkODE0NGI3ODgwNTk3YjZlNmQz' +\n 'ZGZkNjNhOWE5ZWZhZTNmNTMzZDMvbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL3J3bG9jay9ub190aHJlYWRzLnJzAHNyYy92ZW5k' +\n 'b3IvcHEucnMAL3J1c3RjLzJkODE0NGI3ODgwNTk3YjZlNmQzZGZkNjNhOWE5ZWZhZTNmNTMzZDMvbGlicmFyeS9hbGxvYy9zcmMv' +\n 'c3RyaW5nLnJzAC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbmRhcnJheS0wLjE2' +\n 'LjEvc3JjL3ppcC9tb2QucnMAL3J1c3RjLzJkODE0NGI3ODgwNTk3YjZlNmQzZGZkNjNhOWE5ZWZhZTNmNTMzZDMvbGlicmFyeS9h' +\n 'bGxvYy9zcmMvcmF3X3ZlYy9tb2QucnMAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuMTMvc3JjL2RsbWFsbG9jLnJzAC9jYXJnby9y' +\n 'ZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbmRhcnJheS0wLjE2LjEvc3JjL2xpYi5ycwAgVGhl' +\n 'IG51bWJlciBvZiB0cmFpbmluZyB2ZWN0b3JzICjAGCkgbXVzdCBiZSBtb3JlIHRoYW4ga3MgKMABKQA+TnVtYmVyIG9mIGNsdXN0' +\n 'ZXJzIGsgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBzYW1wbGVzICjAASkAOU51bWJlciBvZiBzdWJzcGFjZXMgKG0p' +\n 'IGNhbm5vdCBleGNlZWQgdmVjdG9yIGRpbWVuc2lvbnMgKMADID4gwAEpAAAAAAAAAQAAAAEAAAAGAAAAY2FsbGVkIGBSZXN1bHQ6' +\n 'OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQAKAhAAEwAAAC8AAAATAAAAbmRhcnJheTogU2hhcGUgdG9vIGxhcmdlLCBwcm9k' +\n 'dWN0IG9mIG5vbi16ZXJvIGF4aXMgbGVuZ3RocyBvdmVyZmxvd3MgaXNpemUAAK0BEABcAAAASQEAABQAAACtARAAXAAAAEwCAAAY' +\n 'AAAArQEQAFwAAACeAQAAEQAAAAAAAAAEAAAABAAAAAcAAABBdHRlbXB0ZWQgdG8gaW5pdGlhbGl6ZSB0aHJlYWQtbG9jYWwgd2hp' +\n 'bGUgaXQgaXMgYmVpbmcgZHJvcHBlZAAAdgIQAF4AAABrAAAADQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBhcnQuZXF1YWxfZGltKGRp' +\n 'bWVuc2lvbikAkAMQAFIAAAD+AAAABQAAAGFzc2VydGlvbiBmYWlsZWQ6IGluZGV4IDwgZGltAAAAXwQQAE4AAAAPBgAADQAAAKME' +\n 'EAAKAAAALAAAAB0AAAAeAhAAVwAAAC0CAAAWAAAAHgIQAFcAAAA3AgAAFgAAAKMEEAAKAAAAxwAAAD8AAACjBBAACgAAANoAAAAk' +\n 'AAAAowQQAAoAAABMAAAAGwAAAKMEEAAKAAAARwAAABsAAABNb2RlbCBub3QgdHJhaW5lZEJ5dGUgY29kZXMgcmVxdWlyZSBrcyA8' +\n 'PSAyNTYAAACjBBAACgAAAB8AAAAhAAAAowQQAAoAAAAZAAAAHAAAADMDEAAQAAAAcQAAAC8AAAAzAxAAEAAAAHkAAAA4AAAAMwMQ' +\n 'ABAAAAB5AAAAQwAAADMDEAAQAAAA2QAAACwAAAAzAxAAEAAAAJ0AAAAzAAAAMwMQABAAAACdAAAAOgAAAAoCEAATAAAAfQAAABcA' +\n 'AAAKAhAAEwAAAIUAAAAaAAAACgIQABMAAACJAAAALwAAADMDEAAQAAAAcQAAAEYAAAAzAxAAEAAAAIAAAAArAAAAMwMQABAAAACB' +\n 'AAAAKAAAADMDEAAQAAAAgQAAADgAAAAzAxAAEAAAACUAAAAUAAAACgIQABMAAACUAAAAEAAAAAoCEAATAAAAUgAAACMAAAAKAhAA' +\n 'EwAAAFIAAAA7AAAAVThVMTZVMzIIAAAADAAAAAQAAAAJAAAACgAAAAsAAAAAAAAAAAAAAAEAAAAMAAAAYSBEaXNwbGF5IGltcGxl' +\n 'bWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseQBEAxAASwAAAHELAAAOAAAARXJyb3JJbnB1dCB2ZWN0b3Jz' +\n 'IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZGltZW5zaW9uTW9kZWwgbm90IHRyYWluZWQuIENhbGwgZml0KCkgYmVmb3JlIGNhbGxp' +\n 'bmcgdGhpcyBtZXRob2RJbnB1dCB2ZWN0b3JzIGRpbWVuc2lvbnMgc2hvdWxkIG1hdGNoIHRyYWluaW5nIGRpbWVuc2lvbnNFbmNv' +\n 'ZGVkIHZhbHVlcyBleGNlZWQgVTggcmFuZ2VFbmNvZGVkIHZhbHVlcyBleGNlZWQgVTE2IHJhbmdlRGF0YSBtdXN0IGhhdmUgYXQg' +\n 'bGVhc3Qgb25lIHNhbXBsZSBhbmQgb25lIGZlYXR1cmVEYXRhIGNvbnRhaW5zIG5vbi1maW5pdGUgdmFsdWVzIChOYU4gb3IgSW5m' +\n 'KVVuc3VwcG9ydGVkIGluaXRpYWxpemF0aW9uIG1ldGhvZAIAAAADAAAAAwAAANgIEADaCBAA3QgQAGFzc2VydGlvbiBmYWlsZWQ6' +\n 'IHN0YXJ0IDw9IGF4aXNfbGVuYXNzZXJ0aW9uIGZhaWxlZDogZW5kIDw9IGF4aXNfbGVuYXNzZXJ0aW9uIGZhaWxlZDogc3RlcCAh' +\n 'PSAwaW5jb21wYXRpYmxlIHNoYXBlc2luY29tcGF0aWJsZSBtZW1vcnkgbGF5b3V0dGhlIHNoYXBlIGRvZXMgbm90IGZpdCBpbiB0' +\n 'eXBlIGxpbWl0c291dCBvZiBib3VuZHMgaW5kZXhpbmd1bnN1cHBvcnRlZCBvcGVyYXRpb25hcml0aG1ldGljIG92ZXJmbG93SW5j' +\n 'b21wYXRpYmxlU2hhcGVJbmNvbXBhdGlibGVMYXlvdXRSYW5nZUxpbWl0ZWRPdXRPZkJvdW5kc1Vuc3VwcG9ydGVkT3ZlcmZsb3cn' +\n 'CxAAOgsQAFQLEAB5CxAAjwsQAKQLEAATAAAAGgAAACUAAAAWAAAAFQAAABMAAAARAAAAEgAAAAwAAAALAAAACwAAAAgAAAC3CxAA' +\n 'yAsQANoLEADmCxAA8QsQAPwLEAAAAAAACAAAAAQAAAARAAAAEgAAABMAAAAUAAAAFQAAAAwAAAAEAAAAFgAAABcAAAAYAAAAAAAA' +\n 'AAgAAAAEAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAQAAAABAAAAB4AAAAfAAAAIAAAABQAAABc9ulf3AL2ufHBcGzyYcEkSv4MNHFP' +\n '91/fOOR5Jf4cdGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAADQEEAAqAAAAsQQAAAkAAABh' +\n 'c3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAA0BBAAKgAAALcEAAANAAAAcndsb2NrIG92ZXJm' +\n 'bG93ZWQgcmVhZCBsb2Nrc9UCEABdAAAAFQAAACwAAAAAAAAACAAAAAQAAAAhAAAAFQAAAAwAAAAEAAAAIgAAAHJ3bG9jayBoYXMg' +\n 'bm90IGJlZW4gbG9ja2VkIGZvciByZWFkaW5nAADVAhAAXQAAAD4AAAAJAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAADjAxAAUAAAABwA' +\n 'AAAFAAAAIwAAAAwAAAAEAAAAJAAAACUAAAAmAAAAAAAAAAAAAAABAAAAJwAAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRh' +\n 'dGlvbiByZXR1cm5lZCBhbiBlcnJvciB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkaWQgbm90AABkARAASAAAAI8CAAAOAAAA' +\n 'RXJyb3IwMTIzNDU2Nzg5YWJjZGVmLCAsCgpdAAAAAAAMAAAABAAAAC0AAAAuAAAALwAAAGNhbGxlZCBgT3B0aW9uOjp1bndyYXAo' +\n 'KWAgb24gYSBgTm9uZWAgdmFsdWUwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYy' +\n 'NzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0' +\n 'NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OVthdHRl' +\n 'bXB0IHRvIGNhbGN1bGF0ZSB0aGUgcmVtYWluZGVyIHdpdGggYSBkaXZpc29yIG9mIHplcm8gICAgMHgwMTIzNDU2Nzg5QUJDREVG' +\n 'UmVmQ2VsbCBhbHJlYWR5IG11dGFibHkgYm9ycm93ZWRSZWZDZWxsIGFscmVhZHkgYm9ycm93ZWQ='\n","import { base64ToBytes } from 'zbsearch/trees/vector-flat'\nimport { WASM_BASE64 } from './wasm-binary.js'\n\ninterface VectorQuantizerExports {\n memory: WebAssembly.Memory\n vq_alloc(bytes: number): number\n vq_free(ptr: number, bytes: number): void\n vq_error_ptr(): number\n vq_error_len(): number\n vq_pq_fit(data: number, n: number, dim: number, m: number, ks: number, iterations: number, seed: number): number\n vq_pq_from_codewords(codewords: number, m: number, ks: number, width: number, dim: number): number\n vq_pq_codewords_len(handle: number): number\n vq_pq_width(handle: number): number\n vq_pq_codewords(handle: number, out: number): number\n vq_pq_encode(handle: number, data: number, n: number, out: number): number\n vq_pq_decode(handle: number, codes: number, n: number, out: number): number\n vq_pq_drop(handle: number): void\n}\n\nexport interface TrainedCodebook {\n handle: number\n codewords: Float32Array\n width: number\n}\n\n/**\n * Thin wrapper over the WebAssembly build of vector_quantizer's product quantizer. The module has no imports, so it\n * instantiates the same way in browsers, Node.js, Deno, workers and Gecko (Zotero) without bundler configuration.\n */\nexport class VectorQuantizerWasm {\n private readonly exports: VectorQuantizerExports\n private readonly registry: FinalizationRegistry<number> | undefined\n\n constructor(instance: WebAssembly.Instance) {\n this.exports = instance.exports as unknown as VectorQuantizerExports\n this.registry =\n typeof FinalizationRegistry === 'function'\n ? new FinalizationRegistry((handle: number) => this.exports.vq_pq_drop(handle))\n : undefined\n }\n\n /** Frees the model `handle` once `owner` is garbage collected. Returns the token to pass to `release`. */\n track(owner: object, handle: number): object {\n const token = {}\n this.registry?.register(owner, handle, token)\n return token\n }\n\n /** Frees the model `handle` now. */\n release(handle: number, token?: object) {\n if (token) {\n this.registry?.unregister(token)\n }\n this.exports.vq_pq_drop(handle)\n }\n\n private check(result: number): number {\n if (result >= 0) {\n return result\n }\n const ptr = this.exports.vq_error_ptr()\n const len = this.exports.vq_error_len()\n const bytes = new Uint8Array(this.exports.memory.buffer, ptr, len)\n let message = ''\n for (let i = 0; i < bytes.length; i++) {\n message += String.fromCharCode(bytes[i]!)\n }\n throw new Error(`vector_quantizer: ${message}`)\n }\n\n private withBuffer<T>(bytes: number, run: (ptr: number) => T): T {\n const ptr = this.exports.vq_alloc(bytes)\n try {\n return run(ptr)\n } finally {\n this.exports.vq_free(ptr, bytes)\n }\n }\n\n private writeFloats(ptr: number, values: Float32Array) {\n new Float32Array(this.exports.memory.buffer, ptr, values.length).set(values)\n }\n\n private readCodebook(handle: number): TrainedCodebook {\n const length = this.check(this.exports.vq_pq_codewords_len(handle))\n const width = this.check(this.exports.vq_pq_width(handle))\n const codewords = this.withBuffer(length * 4, (out) => {\n this.check(this.exports.vq_pq_codewords(handle, out))\n return new Float32Array(this.exports.memory.buffer, out, length).slice()\n })\n return { handle, codewords, width }\n }\n\n /** Trains a product quantizer on `n` row-major vectors (`data.length === n * dim`). */\n fit(data: Float32Array, n: number, dim: number, m: number, ks: number, iterations: number, seed: number) {\n return this.withBuffer(data.byteLength, (ptr) => {\n this.writeFloats(ptr, data)\n const handle = this.check(this.exports.vq_pq_fit(ptr, n, dim, m, ks, iterations, seed >>> 0))\n return this.readCodebook(handle)\n })\n }\n\n /** Loads a trained codebook of shape (m, ks, width) and returns its model handle. */\n load(codewords: Float32Array, m: number, ks: number, width: number, dim: number): number {\n return this.withBuffer(codewords.byteLength, (ptr) => {\n this.writeFloats(ptr, codewords)\n return this.check(this.exports.vq_pq_from_codewords(ptr, m, ks, width, dim))\n })\n }\n\n /** Encodes `n` row-major vectors into `n * m` byte codes. */\n encode(handle: number, data: Float32Array, n: number, m: number): Uint8Array {\n return this.withBuffer(data.byteLength, (input) =>\n this.withBuffer(n * m, (out) => {\n this.writeFloats(input, data)\n this.check(this.exports.vq_pq_encode(handle, input, n, out))\n return new Uint8Array(this.exports.memory.buffer, out, n * m).slice()\n })\n )\n }\n\n /** Decodes `n * m` byte codes into `n * dim` floats. */\n decode(handle: number, codes: Uint8Array, n: number, dim: number): Float32Array {\n return this.withBuffer(codes.byteLength, (input) =>\n this.withBuffer(n * dim * 4, (out) => {\n new Uint8Array(this.exports.memory.buffer, input, codes.length).set(codes)\n this.check(this.exports.vq_pq_decode(handle, input, n, out))\n return new Float32Array(this.exports.memory.buffer, out, n * dim).slice()\n })\n )\n }\n}\n\nlet wasmBytes: Uint8Array | undefined\nlet shared: VectorQuantizerWasm | undefined\nlet pending: Promise<VectorQuantizerWasm> | undefined\n\nfunction bytes(): Uint8Array {\n wasmBytes ??= base64ToBytes(WASM_BASE64)\n return wasmBytes\n}\n\n/** Compiles and instantiates the WebAssembly module asynchronously (works on every engine's main thread). */\nexport function loadVectorQuantizerWasm(): Promise<VectorQuantizerWasm> {\n if (shared) {\n return Promise.resolve(shared)\n }\n pending ??= (async () => {\n const module = await WebAssembly.compile(bytes() as Uint8Array<ArrayBuffer>)\n const instance = await WebAssembly.instantiate(module, {})\n shared ??= new VectorQuantizerWasm(instance)\n return shared\n })()\n return pending\n}\n\n/**\n * Compiles and instantiates the module synchronously. Fine in Node.js, Deno, workers and privileged Gecko code;\n * browsers may refuse synchronous compilation of large modules on the main thread, so prefer the async loader there.\n */\nexport function loadVectorQuantizerWasmSync(): VectorQuantizerWasm {\n shared ??= new VectorQuantizerWasm(\n new WebAssembly.Instance(new WebAssembly.Module(bytes() as Uint8Array<ArrayBuffer>), {})\n )\n return shared\n}\n","import type { AnyZBSearch, CodeBuffer, VectorBinarySnapshot, VectorQuantizer, VectorQuantizerFactory } from 'zbsearch'\nimport { loadVectorQuantizerWasm, loadVectorQuantizerWasmSync, type VectorQuantizerWasm } from './wasm.js'\n\nexport { loadVectorQuantizerWasm, loadVectorQuantizerWasmSync, VectorQuantizerWasm } from './wasm.js'\n\nexport const PQ_KIND = 'pq'\n\nexport interface PQOptions {\n /** Number of subspaces, i.e. bytes per vector. Defaults to `dim / 8` (8 dimensions per subspace). */\n m?: number\n /** Centroids per subspace, at most 256 (codes are bytes). Defaults to 256. */\n ks?: number\n /** k-means iterations per subspace. Defaults to 12. */\n iterations?: number\n /**\n * Vectors collected before the quantizer is trained. Until then the index keeps them as float32 and searches them\n * exactly. Defaults to `max(4 * ks, 1024)`.\n */\n trainingSize?: number\n /** Upper bound on the vectors used by one fit (evenly sampled). Defaults to `max(trainingSize, 4096)`. */\n maxTrainingSize?: number\n /** Seed of the k-means initialisation, so fits are reproducible. Defaults to 42. */\n seed?: number\n}\n\ninterface ResolvedPQOptions {\n m: number\n ks: number\n iterations: number\n trainingSize: number\n maxTrainingSize: number\n seed: number\n}\n\nfunction resolveOptions(dim: number, options: PQOptions): ResolvedPQOptions {\n const m = options.m ?? Math.max(1, Math.round(dim / 8))\n const ks = options.ks ?? 256\n if (!Number.isInteger(m) || m < 1 || m > dim) {\n throw new Error(`pq: m must be an integer between 1 and the vector size (${dim}), got ${m}.`)\n }\n if (!Number.isInteger(ks) || ks < 2 || ks > 256) {\n throw new Error(`pq: ks must be an integer between 2 and 256, got ${ks}.`)\n }\n const trainingSize = Math.max(options.trainingSize ?? Math.max(4 * ks, 1024), ks)\n return {\n m,\n ks,\n iterations: options.iterations ?? 12,\n trainingSize,\n maxTrainingSize: Math.max(options.maxTrainingSize ?? Math.max(trainingSize, 4096), trainingSize),\n seed: options.seed ?? 42\n }\n}\n\nfunction align4(bytes: number): number {\n return (bytes + 3) & ~3\n}\n\n/**\n * Product quantizer backed by the WebAssembly build of vector_quantizer.\n *\n * Each vector is split into `m` subspaces; every subspace is replaced by the index of its nearest centroid among\n * `ks` (one byte). Queries are scored with asymmetric distance computation: a `m × ks` table of query-centroid dot\n * products is built once per query, then each code is scored with `m` table lookups. The score is divided by the\n * norm of the reconstructed vector, so it estimates the cosine similarity used by zbsearch.\n *\n * Code layout: `m` code bytes, padding to 4 bytes, then the float32 inverse norm of the reconstruction.\n */\nexport class ProductQuantizer implements VectorQuantizer<Float32Array> {\n readonly kind = PQ_KIND\n readonly codeSize: number\n readonly m: number\n readonly ks: number\n readonly iterations: number\n readonly trainingSize: number\n readonly maxTrainingSize: number\n readonly seed: number\n\n private codewords: Float32Array | undefined\n private width = 0\n private handle: number | undefined\n private handleToken: object | undefined\n private readonly offsets: Int32Array\n private readonly normOffset: number\n private codewordNorms: Float32Array | undefined\n\n constructor(\n readonly dim: number,\n options: PQOptions,\n private readonly wasm: VectorQuantizerWasm\n ) {\n const resolved = resolveOptions(dim, options)\n this.m = resolved.m\n this.ks = resolved.ks\n this.iterations = resolved.iterations\n this.trainingSize = resolved.trainingSize\n this.maxTrainingSize = resolved.maxTrainingSize\n this.seed = resolved.seed\n this.normOffset = align4(this.m)\n this.codeSize = this.normOffset + 4\n\n // Same split as vector_quantizer: the first `dim % m` subspaces get one extra dimension.\n this.offsets = new Int32Array(this.m + 1)\n const quotient = Math.floor(dim / this.m)\n const remainder = dim % this.m\n for (let s = 0; s < this.m; s++) {\n this.offsets[s + 1] = this.offsets[s]! + (s < remainder ? quotient + 1 : quotient)\n }\n }\n\n get ready(): boolean {\n return this.codewords !== undefined\n }\n\n /** The trained codebook, shaped (m, ks, width) in row-major order. */\n get codebook(): Float32Array | undefined {\n return this.codewords\n }\n\n private setCodebook(codewords: Float32Array, width: number, handle: number | undefined) {\n if (this.handle !== undefined) {\n this.wasm.release(this.handle, this.handleToken)\n }\n this.codewords = codewords\n this.width = width\n this.handle = handle\n this.handleToken = handle === undefined ? undefined : this.wasm.track(this, handle)\n\n const norms = new Float32Array(this.m * this.ks)\n for (let s = 0; s < this.m; s++) {\n const length = this.offsets[s + 1]! - this.offsets[s]!\n for (let k = 0; k < this.ks; k++) {\n const base = (s * this.ks + k) * width\n let sum = 0\n for (let d = 0; d < length; d++) {\n sum += codewords[base + d]! * codewords[base + d]!\n }\n norms[s * this.ks + k] = sum\n }\n }\n this.codewordNorms = norms\n }\n\n private modelHandle(): number {\n if (!this.codewords) {\n throw new Error('pq: the quantizer has not been trained yet.')\n }\n if (this.handle === undefined) {\n const handle = this.wasm.load(this.codewords, this.m, this.ks, this.width, this.dim)\n this.handle = handle\n this.handleToken = this.wasm.track(this, handle)\n }\n return this.handle\n }\n\n fit(vectors: Float32Array[]): void {\n let sample = vectors\n if (vectors.length > this.maxTrainingSize) {\n const step = vectors.length / this.maxTrainingSize\n sample = Array.from({ length: this.maxTrainingSize }, (_, i) => vectors[Math.floor(i * step)]!)\n }\n if (sample.length < this.ks) {\n throw new Error(`pq: training needs at least ks (${this.ks}) vectors, got ${sample.length}.`)\n }\n\n const data = new Float32Array(sample.length * this.dim)\n sample.forEach((vector, i) => data.set(vector.subarray(0, this.dim), i * this.dim))\n const trained = this.wasm.fit(data, sample.length, this.dim, this.m, this.ks, this.iterations, this.seed)\n this.setCodebook(trained.codewords, trained.width, trained.handle)\n }\n\n encode(vector: Float32Array, codes: CodeBuffer, offset: number): void {\n const encoded = this.wasm.encode(this.modelHandle(), vector.subarray(0, this.dim), 1, this.m)\n codes.u8.set(encoded, offset)\n\n let normSq = 0\n const norms = this.codewordNorms!\n for (let s = 0; s < this.m; s++) {\n normSq += norms[s * this.ks + encoded[s]!]!\n }\n codes.f32[(offset + this.normOffset) >> 2] = normSq > 0 ? 1 / Math.sqrt(normSq) : 0\n }\n\n prepareQuery(query: Float32Array): Float32Array {\n const codewords = this.codewords!\n const table = new Float32Array(this.m * this.ks)\n for (let s = 0; s < this.m; s++) {\n const start = this.offsets[s]!\n const length = this.offsets[s + 1]! - start\n for (let k = 0; k < this.ks; k++) {\n const base = (s * this.ks + k) * this.width\n let sum = 0\n for (let d = 0; d < length; d++) {\n sum += query[start + d]! * codewords[base + d]!\n }\n table[s * this.ks + k] = sum\n }\n }\n return table\n }\n\n score(table: Float32Array, codes: CodeBuffer, offset: number): number {\n const u8 = codes.u8\n const ks = this.ks\n let sum = 0\n for (let s = 0; s < this.m; s++) {\n sum += table[s * ks + u8[offset + s]!]!\n }\n const score = sum * codes.f32[(offset + this.normOffset) >> 2]!\n return score > 1 ? 1 : score < -1 ? -1 : score\n }\n\n decode(codes: CodeBuffer, offset: number, out: Float32Array): void {\n const codewords = this.codewords!\n for (let s = 0; s < this.m; s++) {\n const start = this.offsets[s]!\n const length = this.offsets[s + 1]! - start\n const base = (s * this.ks + codes.u8[offset + s]!) * this.width\n for (let d = 0; d < length; d++) {\n out[start + d] = codewords[base + d]!\n }\n }\n }\n\n toSnapshot(): VectorBinarySnapshot {\n return {\n meta: {\n kind: PQ_KIND,\n dim: this.dim,\n m: this.m,\n ks: this.ks,\n iterations: this.iterations,\n trainingSize: this.trainingSize,\n maxTrainingSize: this.maxTrainingSize,\n seed: this.seed,\n width: this.width\n },\n arrays: this.codewords ? { codewords: this.codewords } : {}\n }\n }\n\n static fromSnapshot(snapshot: VectorBinarySnapshot, wasm: VectorQuantizerWasm): ProductQuantizer {\n const meta = snapshot.meta as Required<PQOptions> & { dim: number; width: number }\n const quantizer = new ProductQuantizer(meta.dim, meta, wasm)\n const codewords = snapshot.arrays.codewords as Float32Array | undefined\n if (codewords) {\n // The model is only loaded into WebAssembly when a new vector has to be encoded.\n quantizer.setCodebook(codewords, meta.width, undefined)\n }\n return quantizer\n }\n}\n\nexport interface PQFactory extends VectorQuantizerFactory {\n readonly kind: typeof PQ_KIND\n readonly options: PQOptions\n create(dim: number): ProductQuantizer\n fromSnapshot(snapshot: VectorBinarySnapshot): ProductQuantizer\n}\n\nfunction createFactory(options: PQOptions, wasm: VectorQuantizerWasm): PQFactory {\n return {\n kind: PQ_KIND,\n options,\n create: (dim) => new ProductQuantizer(dim, options, wasm),\n fromSnapshot: (snapshot) => ProductQuantizer.fromSnapshot(snapshot, wasm)\n }\n}\n\n/**\n * Product quantization for zbsearch vector indexes. Pass the result as `quantization` to `flat()` or `ivf()`.\n *\n * ```js\n * import { flat } from 'zbsearch/trees/vector-flat'\n * import { pq } from '@zbsearch/plugin-vector-quantizer'\n *\n * const db = create({\n * schema: { embedding: 'vector[384]' },\n * indexes: { embedding: flat({ quantization: await pq({ m: 48 }), rescore: 'int8' }) }\n * })\n * ```\n */\nexport async function pq(options: PQOptions = {}): Promise<PQFactory> {\n return createFactory(options, await loadVectorQuantizerWasm())\n}\n\n/** Synchronous variant of `pq()`, for Node.js, Deno, workers and privileged Gecko code. */\nexport function pqSync(options: PQOptions = {}): PQFactory {\n return createFactory(options, loadVectorQuantizerWasmSync())\n}\n\ninterface RefittableIndex {\n refit(sample?: Iterable<Float32Array | number[]>): void\n}\n\n/**\n * Re-trains the quantizer of a vector property and re-encodes every vector, for instance after the data drifted\n * away from the initial training sample. Without `sample`, training uses the rescoring copy when the index keeps\n * one (`rescore: 'float32' | 'int8'`), otherwise the decoded codes.\n */\nexport function refit(db: AnyZBSearch, property: string, sample?: Iterable<Float32Array | number[]>): void {\n const node = db.data.index.vectorIndexes[property]?.node as Partial<RefittableIndex> | undefined\n if (!node) {\n throw new Error(`Unknown vector property \"${property}\".`)\n }\n if (typeof node.refit !== 'function') {\n throw new Error(`The vector index of \"${property}\" is not quantized.`)\n }\n node.refit(sample)\n}\n"],"mappings":"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"}
|
package/dist/wasm.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface TrainedCodebook {
|
|
2
|
+
handle: number;
|
|
3
|
+
codewords: Float32Array;
|
|
4
|
+
width: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Thin wrapper over the WebAssembly build of vector_quantizer's product quantizer. The module has no imports, so it
|
|
8
|
+
* instantiates the same way in browsers, Node.js, Deno, workers and Gecko (Zotero) without bundler configuration.
|
|
9
|
+
*/
|
|
10
|
+
export declare class VectorQuantizerWasm {
|
|
11
|
+
private readonly exports;
|
|
12
|
+
private readonly registry;
|
|
13
|
+
constructor(instance: WebAssembly.Instance);
|
|
14
|
+
/** Frees the model `handle` once `owner` is garbage collected. Returns the token to pass to `release`. */
|
|
15
|
+
track(owner: object, handle: number): object;
|
|
16
|
+
/** Frees the model `handle` now. */
|
|
17
|
+
release(handle: number, token?: object): void;
|
|
18
|
+
private check;
|
|
19
|
+
private withBuffer;
|
|
20
|
+
private writeFloats;
|
|
21
|
+
private readCodebook;
|
|
22
|
+
/** Trains a product quantizer on `n` row-major vectors (`data.length === n * dim`). */
|
|
23
|
+
fit(data: Float32Array, n: number, dim: number, m: number, ks: number, iterations: number, seed: number): TrainedCodebook;
|
|
24
|
+
/** Loads a trained codebook of shape (m, ks, width) and returns its model handle. */
|
|
25
|
+
load(codewords: Float32Array, m: number, ks: number, width: number, dim: number): number;
|
|
26
|
+
/** Encodes `n` row-major vectors into `n * m` byte codes. */
|
|
27
|
+
encode(handle: number, data: Float32Array, n: number, m: number): Uint8Array;
|
|
28
|
+
/** Decodes `n * m` byte codes into `n * dim` floats. */
|
|
29
|
+
decode(handle: number, codes: Uint8Array, n: number, dim: number): Float32Array;
|
|
30
|
+
}
|
|
31
|
+
/** Compiles and instantiates the WebAssembly module asynchronously (works on every engine's main thread). */
|
|
32
|
+
export declare function loadVectorQuantizerWasm(): Promise<VectorQuantizerWasm>;
|
|
33
|
+
/**
|
|
34
|
+
* Compiles and instantiates the module synchronously. Fine in Node.js, Deno, workers and privileged Gecko code;
|
|
35
|
+
* browsers may refuse synchronous compilation of large modules on the main thread, so prefer the async loader there.
|
|
36
|
+
*/
|
|
37
|
+
export declare function loadVectorQuantizerWasmSync(): VectorQuantizerWasm;
|
package/package.json
CHANGED
|
@@ -1,6 +1,57 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zbsearch/plugin-vector-quantizer",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "4.0.4",
|
|
4
|
+
"description": "Product quantization (PQ) for zbsearch vector indexes, powered by a WebAssembly build of vector_quantizer",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"embeddings",
|
|
7
|
+
"product quantization",
|
|
8
|
+
"quantization",
|
|
9
|
+
"vector search",
|
|
10
|
+
"webassembly",
|
|
11
|
+
"zbsearch"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/micheleriva/zbsearch#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/micheleriva/zbsearch/issues"
|
|
16
|
+
},
|
|
17
|
+
"license": "GPL-3.0-only",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/micheleriva/zbsearch.git"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"LICENSE.md"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"require": "./dist/index.cjs",
|
|
33
|
+
"import": "./dist/index.js",
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"browser": "./dist/index.global.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"zbsearch": "4.0.4"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^20.9.0",
|
|
46
|
+
"rolldown": "^1.2.3",
|
|
47
|
+
"typescript": "^7.0.2"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "node ../../scripts/rolldown-build.mjs && tsc -p . --emitDeclarationOnly",
|
|
51
|
+
"build:wasm": "node scripts/build-wasm.mjs",
|
|
52
|
+
"check:wasm": "node scripts/build-wasm.mjs --check",
|
|
53
|
+
"lint": "oxlint --fix --fix-suggestions",
|
|
54
|
+
"test": "vitest run",
|
|
55
|
+
"test:rust": "cargo test --release --locked --manifest-path rust/Cargo.toml"
|
|
56
|
+
}
|
|
6
57
|
}
|