{"version":3,"sources":["../ts/modules/utilities/binary.ts"],"names":["isBitSet","v","num","b","getBitCount","characters","v1","v2","bitCount","Math","log","isFinite","floor","round","Error","exports","getBits","str","charset","c","retval","length","indexOf","let","j","push","getString","bits","i","charAt","join","encodeHex","bytes","upperCase","Array","from","reduce","prev","curr","string_1","padLeft","datum","charCodeAt","valueOf","toString","decodeHex","len","parseInt","substring"],"mappings":"gGAOA,SAAgBA,SAAUC,EAAWC,KAC9BC,IAAI,GAAKD,IACf,OAASD,EAAIE,MAAQA,GACtB,CAEA,SAAgBC,YAAaC,YAC5B,IAXoBC,GAAYC,GAW1BC,WAAWC,KAAKC,IAAKL,UAAU,EAAKI,KAAKC,IAAK,CAAC,EACrD,GAAKC,SAAUH,UAAQ,IAZHF,GAYsBE,WAZVD,GAYoBE,KAAKG,MAAOJ,UAAQ,EAVjEF,GADO,MACSC,KAAsBA,IAAhBD,GADf,KAcd,OAAOG,KAAKI,MAAOL,UAAQ,EAF1B,MAAM,IAAIM,MAAO,4BAA4B,CAG/C,C,yKAXAC,QAAAf,SAAAA,SAKAe,QAAAX,YAAAA,YAQAW,QAAAC,QAAA,SAAyBC,IAAaC,SACrC,IAGSC,EAHHC,OAAS,GACdZ,SAAWJ,YAAac,QAAQG,MAAM,EAEvC,IAASF,KAAKF,IAAM,CACnB,IAAMf,IAAMgB,QAAQI,QAASH,CAAC,EAC9B,GAAIjB,IAAM,EAAI,MAAM,IAAIY,MAAO,sBAAsBK,CAAG,EAExD,IAAKI,IAAIC,EAAIhB,SAAW,EAAQ,GAALgB,EAAQ,EAAEA,EACpCJ,OAAOK,KAAMzB,SAAUE,IAAKsB,CAAC,CAAE,C,CAIjC,OAAOJ,MACR,EAEAL,QAAAW,UAAA,SAA2BC,KAAsBT,SAChD,IAAME,OAAS,GACdZ,SAAWJ,YAAac,QAAQG,MAAM,EAEvC,IAAKE,IAAIK,EAAI,EAAGA,EAAID,KAAKN,OAAQO,GAAKpB,SAAW,CAChDe,IAAIrB,IAAM,EACV,IAAKqB,IAAIC,EAAI,EAAGA,EAAIhB,SAAU,EAAEgB,EAC/BtB,MAAa,EACTyB,KAAMC,EAAIJ,KAAMtB,KAAO,GAG5B,GAAIA,KAAOgB,QAAQG,OAAS,MAAM,IAAIP,MAAO,iBAAiBZ,GAAK,EACnEkB,OAAOK,KAAMP,QAAQW,OAAQ3B,GAAG,CAAE,C,CAGnC,OAAOkB,OAAOU,KAAM,EAAE,CACvB,EAEAf,QAAAgB,UAAA,SAA2BC,MAAoCC,UAAY,CAAA,GAC1E,OAAOC,MAAMC,KAAMH,KAAK,EAAGI,OAAQ,CAAEC,KAAMC,QAAUD,OAAAA,MAAO,EAAAE,SAAAC,UAavC,UAAjB,OADaC,KAZ6DH,MAavCG,KAAMC,WAAY,CAAC,EAC9CD,KAAME,QAAO,GAd4DC,SAAU,EAAE,EAAIX,UAAY,cAAgB,eAAe,EAAI,EAAG,GAAG,CAAA,EAAI,EAAE,CACjK,EAEAlB,QAAA8B,UAAA,SAA2B5B,KAC1B,IAAM6B,IAAM7B,IAAII,OACfD,OAAS,GACV,IAAKG,IAAIK,EAAI,EAAGA,EAAIkB,IAAKlB,GAAK,EAC7BR,OAAOK,KAAMsB,SAAU9B,IAAI+B,UAAWpB,EAAGA,EAAI,CAAC,EAAI,EAAE,CAAE,EAEvD,OAAOR,MACR","file":"binary.js","sourcesContent":["import { padLeft } from 'utilities/string';\r\n\r\nfunction fuzzyEqual( v1: number, v2: number ) {\r\n\tvar epsilon = .000001;\r\n\treturn v1 - epsilon <= v2 && v1 + epsilon >= v2;\r\n}\r\n\r\nexport function isBitSet( v: number, num: number ) {\r\n\tconst b = 1 << num;\r\n\treturn ( v & b ) === b;\r\n}\r\n\r\nexport function getBitCount( characters: number ) {\r\n\tconst bitCount = Math.log( characters ) / Math.log( 2 );\r\n\tif( !isFinite( bitCount ) || !fuzzyEqual( bitCount, Math.floor( bitCount ) ) ) {\r\n\t\tthrow new Error( 'Invalid length for charset' );\r\n\t}\r\n\treturn Math.round( bitCount );\r\n}\r\n\r\nexport function getBits( str: string, charset: string ) {\r\n\tconst retval = [],\r\n\t\tbitCount = getBitCount( charset.length );\r\n\r\n\tfor( let c of str ) {\r\n\t\tconst num = charset.indexOf( c );\r\n\t\tif( num < 0 ) throw new Error( `Invalid character: ${c}` );\r\n\r\n\t\tfor( let j = bitCount - 1; j >= 0; --j ) {\r\n\t\t\tretval.push( isBitSet( num, j ) );\r\n\t\t}\r\n\t}\r\n\r\n\treturn retval;\r\n}\r\n\r\nexport function getString( bits: Array<boolean>, charset: string ) {\r\n\tconst retval = [],\r\n\t\tbitCount = getBitCount( charset.length );\r\n\r\n\tfor( let i = 0; i < bits.length; i += bitCount ) {\r\n\t\tlet num = 0;\r\n\t\tfor( let j = 0; j < bitCount; ++j ) {\r\n\t\t\tnum = num << 1;\r\n\t\t\tif( bits[ i + j ] ) num += 1;\r\n\t\t}\r\n\r\n\t\tif( num >= charset.length ) throw new Error( `Out of range: ${num}` );\r\n\t\tretval.push( charset.charAt( num ) );\r\n\t}\r\n\r\n\treturn retval.join( '' );\r\n}\r\n\r\nexport function encodeHex( bytes: string|Array<string|number>, upperCase = false ) {\r\n\treturn Array.from( bytes ).reduce( ( prev, curr ) => prev + padLeft( getByte( curr ).toString( 16 )[ upperCase ? 'toUpperCase' : 'toLowerCase' ](), 2, '0' ), '' );\r\n}\r\n\r\nexport function decodeHex( str: string ) {\r\n\tconst len = str.length,\r\n\t\tretval = [];\r\n\tfor( let i = 0; i < len; i += 2 ) {\r\n\t\tretval.push( parseInt( str.substring( i, i + 2 ), 16 ) );\r\n\t}\r\n\treturn retval;\r\n}\r\n\r\nfunction getByte( datum: number|string ) {\r\n\tif( typeof datum === 'string' ) return datum.charCodeAt( 0 );\r\n\telse return datum.valueOf();\r\n}\r\n"]}