eb42c8ccf4fabbc169ace9e0a58a766b5c2831f22627d7d1ce6fb92c5bcdb6918ab8eef6d4fba5efccd056bdb932bda7f43d168b15e8b9ae4a3eeee16c35a3 88 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548
  1. (function (module, exports) {
  2. 'use strict';
  3. // Utils
  4. function assert (val, msg) {
  5. if (!val) throw new Error(msg || 'Assertion failed');
  6. }
  7. // Could use `inherits` module, but don't want to move from single file
  8. // architecture yet.
  9. function inherits (ctor, superCtor) {
  10. ctor.super_ = superCtor;
  11. var TempCtor = function () {};
  12. TempCtor.prototype = superCtor.prototype;
  13. ctor.prototype = new TempCtor();
  14. ctor.prototype.constructor = ctor;
  15. }
  16. // BN
  17. function BN (number, base, endian) {
  18. if (BN.isBN(number)) {
  19. return number;
  20. }
  21. this.negative = 0;
  22. this.words = null;
  23. this.length = 0;
  24. // Reduction context
  25. this.red = null;
  26. if (number !== null) {
  27. if (base === 'le' || base === 'be') {
  28. endian = base;
  29. base = 10;
  30. }
  31. this._init(number || 0, base || 10, endian || 'be');
  32. }
  33. }
  34. if (typeof module === 'object') {
  35. module.exports = BN;
  36. } else {
  37. exports.BN = BN;
  38. }
  39. BN.BN = BN;
  40. BN.wordSize = 26;
  41. var Buffer;
  42. try {
  43. if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {
  44. Buffer = window.Buffer;
  45. } else {
  46. Buffer = require('buffer').Buffer;
  47. }
  48. } catch (e) {
  49. }
  50. BN.isBN = function isBN (num) {
  51. if (num instanceof BN) {
  52. return true;
  53. }
  54. return num !== null && typeof num === 'object' &&
  55. num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
  56. };
  57. BN.max = function max (left, right) {
  58. if (left.cmp(right) > 0) return left;
  59. return right;
  60. };
  61. BN.min = function min (left, right) {
  62. if (left.cmp(right) < 0) return left;
  63. return right;
  64. };
  65. BN.prototype._init = function init (number, base, endian) {
  66. if (typeof number === 'number') {
  67. return this._initNumber(number, base, endian);
  68. }
  69. if (typeof number === 'object') {
  70. return this._initArray(number, base, endian);
  71. }
  72. if (base === 'hex') {
  73. base = 16;
  74. }
  75. assert(base === (base | 0) && base >= 2 && base <= 36);
  76. number = number.toString().replace(/\s+/g, '');
  77. var start = 0;
  78. if (number[0] === '-') {
  79. start++;
  80. this.negative = 1;
  81. }
  82. if (start < number.length) {
  83. if (base === 16) {
  84. this._parseHex(number, start, endian);
  85. } else {
  86. this._parseBase(number, base, start);
  87. if (endian === 'le') {
  88. this._initArray(this.toArray(), base, endian);
  89. }
  90. }
  91. }
  92. };
  93. BN.prototype._initNumber = function _initNumber (number, base, endian) {
  94. if (number < 0) {
  95. this.negative = 1;
  96. number = -number;
  97. }
  98. if (number < 0x4000000) {
  99. this.words = [number & 0x3ffffff];
  100. this.length = 1;
  101. } else if (number < 0x10000000000000) {
  102. this.words = [
  103. number & 0x3ffffff,
  104. (number / 0x4000000) & 0x3ffffff
  105. ];
  106. this.length = 2;
  107. } else {
  108. assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
  109. this.words = [
  110. number & 0x3ffffff,
  111. (number / 0x4000000) & 0x3ffffff,
  112. 1
  113. ];
  114. this.length = 3;
  115. }
  116. if (endian !== 'le') return;
  117. // Reverse the bytes
  118. this._initArray(this.toArray(), base, endian);
  119. };
  120. BN.prototype._initArray = function _initArray (number, base, endian) {
  121. // Perhaps a Uint8Array
  122. assert(typeof number.length === 'number');
  123. if (number.length <= 0) {
  124. this.words = [0];
  125. this.length = 1;
  126. return this;
  127. }
  128. this.length = Math.ceil(number.length / 3);
  129. this.words = new Array(this.length);
  130. for (var i = 0; i < this.length; i++) {
  131. this.words[i] = 0;
  132. }
  133. var j, w;
  134. var off = 0;
  135. if (endian === 'be') {
  136. for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
  137. w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
  138. this.words[j] |= (w << off) & 0x3ffffff;
  139. this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
  140. off += 24;
  141. if (off >= 26) {
  142. off -= 26;
  143. j++;
  144. }
  145. }
  146. } else if (endian === 'le') {
  147. for (i = 0, j = 0; i < number.length; i += 3) {
  148. w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
  149. this.words[j] |= (w << off) & 0x3ffffff;
  150. this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
  151. off += 24;
  152. if (off >= 26) {
  153. off -= 26;
  154. j++;
  155. }
  156. }
  157. }
  158. return this._strip();
  159. };
  160. function parseHex4Bits (string, index) {
  161. var c = string.charCodeAt(index);
  162. // '0' - '9'
  163. if (c >= 48 && c <= 57) {
  164. return c - 48;
  165. // 'A' - 'F'
  166. } else if (c >= 65 && c <= 70) {
  167. return c - 55;
  168. // 'a' - 'f'
  169. } else if (c >= 97 && c <= 102) {
  170. return c - 87;
  171. } else {
  172. assert(false, 'Invalid character in ' + string);
  173. }
  174. }
  175. function parseHexByte (string, lowerBound, index) {
  176. var r = parseHex4Bits(string, index);
  177. if (index - 1 >= lowerBound) {
  178. r |= parseHex4Bits(string, index - 1) << 4;
  179. }
  180. return r;
  181. }
  182. BN.prototype._parseHex = function _parseHex (number, start, endian) {
  183. // Create possibly bigger array to ensure that it fits the number
  184. this.length = Math.ceil((number.length - start) / 6);
  185. this.words = new Array(this.length);
  186. for (var i = 0; i < this.length; i++) {
  187. this.words[i] = 0;
  188. }
  189. // 24-bits chunks
  190. var off = 0;
  191. var j = 0;
  192. var w;
  193. if (endian === 'be') {
  194. for (i = number.length - 1; i >= start; i -= 2) {
  195. w = parseHexByte(number, start, i) << off;
  196. this.words[j] |= w & 0x3ffffff;
  197. if (off >= 18) {
  198. off -= 18;
  199. j += 1;
  200. this.words[j] |= w >>> 26;
  201. } else {
  202. off += 8;
  203. }
  204. }
  205. } else {
  206. var parseLength = number.length - start;
  207. for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {
  208. w = parseHexByte(number, start, i) << off;
  209. this.words[j] |= w & 0x3ffffff;
  210. if (off >= 18) {
  211. off -= 18;
  212. j += 1;
  213. this.words[j] |= w >>> 26;
  214. } else {
  215. off += 8;
  216. }
  217. }
  218. }
  219. this._strip();
  220. };
  221. function parseBase (str, start, end, mul) {
  222. var r = 0;
  223. var b = 0;
  224. var len = Math.min(str.length, end);
  225. for (var i = start; i < len; i++) {
  226. var c = str.charCodeAt(i) - 48;
  227. r *= mul;
  228. // 'a'
  229. if (c >= 49) {
  230. b = c - 49 + 0xa;
  231. // 'A'
  232. } else if (c >= 17) {
  233. b = c - 17 + 0xa;
  234. // '0' - '9'
  235. } else {
  236. b = c;
  237. }
  238. assert(c >= 0 && b < mul, 'Invalid character');
  239. r += b;
  240. }
  241. return r;
  242. }
  243. BN.prototype._parseBase = function _parseBase (number, base, start) {
  244. // Initialize as zero
  245. this.words = [0];
  246. this.length = 1;
  247. // Find length of limb in base
  248. for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
  249. limbLen++;
  250. }
  251. limbLen--;
  252. limbPow = (limbPow / base) | 0;
  253. var total = number.length - start;
  254. var mod = total % limbLen;
  255. var end = Math.min(total, total - mod) + start;
  256. var word = 0;
  257. for (var i = start; i < end; i += limbLen) {
  258. word = parseBase(number, i, i + limbLen, base);
  259. this.imuln(limbPow);
  260. if (this.words[0] + word < 0x4000000) {
  261. this.words[0] += word;
  262. } else {
  263. this._iaddn(word);
  264. }
  265. }
  266. if (mod !== 0) {
  267. var pow = 1;
  268. word = parseBase(number, i, number.length, base);
  269. for (i = 0; i < mod; i++) {
  270. pow *= base;
  271. }
  272. this.imuln(pow);
  273. if (this.words[0] + word < 0x4000000) {
  274. this.words[0] += word;
  275. } else {
  276. this._iaddn(word);
  277. }
  278. }
  279. this._strip();
  280. };
  281. BN.prototype.copy = function copy (dest) {
  282. dest.words = new Array(this.length);
  283. for (var i = 0; i < this.length; i++) {
  284. dest.words[i] = this.words[i];
  285. }
  286. dest.length = this.length;
  287. dest.negative = this.negative;
  288. dest.red = this.red;
  289. };
  290. function move (dest, src) {
  291. dest.words = src.words;
  292. dest.length = src.length;
  293. dest.negative = src.negative;
  294. dest.red = src.red;
  295. }
  296. BN.prototype._move = function _move (dest) {
  297. move(dest, this);
  298. };
  299. BN.prototype.clone = function clone () {
  300. var r = new BN(null);
  301. this.copy(r);
  302. return r;
  303. };
  304. BN.prototype._expand = function _expand (size) {
  305. while (this.length < size) {
  306. this.words[this.length++] = 0;
  307. }
  308. return this;
  309. };
  310. // Remove leading `0` from `this`
  311. BN.prototype._strip = function strip () {
  312. while (this.length > 1 && this.words[this.length - 1] === 0) {
  313. this.length--;
  314. }
  315. return this._normSign();
  316. };
  317. BN.prototype._normSign = function _normSign () {
  318. // -0 = 0
  319. if (this.length === 1 && this.words[0] === 0) {
  320. this.negative = 0;
  321. }
  322. return this;
  323. };
  324. // Check Symbol.for because not everywhere where Symbol defined
  325. // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility
  326. if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {
  327. try {
  328. BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;
  329. } catch (e) {
  330. BN.prototype.inspect = inspect;
  331. }
  332. } else {
  333. BN.prototype.inspect = inspect;
  334. }
  335. function inspect () {
  336. return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';
  337. }
  338. /*
  339. var zeros = [];
  340. var groupSizes = [];
  341. var groupBases = [];
  342. var s = '';
  343. var i = -1;
  344. while (++i < BN.wordSize) {
  345. zeros[i] = s;
  346. s += '0';
  347. }
  348. groupSizes[0] = 0;
  349. groupSizes[1] = 0;
  350. groupBases[0] = 0;
  351. groupBases[1] = 0;
  352. var base = 2 - 1;
  353. while (++base < 36 + 1) {
  354. var groupSize = 0;
  355. var groupBase = 1;
  356. while (groupBase < (1 << BN.wordSize) / base) {
  357. groupBase *= base;
  358. groupSize += 1;
  359. }
  360. groupSizes[base] = groupSize;
  361. groupBases[base] = groupBase;
  362. }
  363. */
  364. var zeros = [
  365. '',
  366. '0',
  367. '00',
  368. '000',
  369. '0000',
  370. '00000',
  371. '000000',
  372. '0000000',
  373. '00000000',
  374. '000000000',
  375. '0000000000',
  376. '00000000000',
  377. '000000000000',
  378. '0000000000000',
  379. '00000000000000',
  380. '000000000000000',
  381. '0000000000000000',
  382. '00000000000000000',
  383. '000000000000000000',
  384. '0000000000000000000',
  385. '00000000000000000000',
  386. '000000000000000000000',
  387. '0000000000000000000000',
  388. '00000000000000000000000',
  389. '000000000000000000000000',
  390. '0000000000000000000000000'
  391. ];
  392. var groupSizes = [
  393. 0, 0,
  394. 25, 16, 12, 11, 10, 9, 8,
  395. 8, 7, 7, 7, 7, 6, 6,
  396. 6, 6, 6, 6, 6, 5, 5,
  397. 5, 5, 5, 5, 5, 5, 5,
  398. 5, 5, 5, 5, 5, 5, 5
  399. ];
  400. var groupBases = [
  401. 0, 0,
  402. 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
  403. 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
  404. 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
  405. 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
  406. 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
  407. ];
  408. BN.prototype.toString = function toString (base, padding) {
  409. base = base || 10;
  410. padding = padding | 0 || 1;
  411. var out;
  412. if (base === 16 || base === 'hex') {
  413. out = '';
  414. var off = 0;
  415. var carry = 0;
  416. for (var i = 0; i < this.length; i++) {
  417. var w = this.words[i];
  418. var word = (((w << off) | carry) & 0xffffff).toString(16);
  419. carry = (w >>> (24 - off)) & 0xffffff;
  420. off += 2;
  421. if (off >= 26) {
  422. off -= 26;
  423. i--;
  424. }
  425. if (carry !== 0 || i !== this.length - 1) {
  426. out = zeros[6 - word.length] + word + out;
  427. } else {
  428. out = word + out;
  429. }
  430. }
  431. if (carry !== 0) {
  432. out = carry.toString(16) + out;
  433. }
  434. while (out.length % padding !== 0) {
  435. out = '0' + out;
  436. }
  437. if (this.negative !== 0) {
  438. out = '-' + out;
  439. }
  440. return out;
  441. }
  442. if (base === (base | 0) && base >= 2 && base <= 36) {
  443. // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
  444. var groupSize = groupSizes[base];
  445. // var groupBase = Math.pow(base, groupSize);
  446. var groupBase = groupBases[base];
  447. out = '';
  448. var c = this.clone();
  449. c.negative = 0;
  450. while (!c.isZero()) {
  451. var r = c.modrn(groupBase).toString(base);
  452. c = c.idivn(groupBase);
  453. if (!c.isZero()) {
  454. out = zeros[groupSize - r.length] + r + out;
  455. } else {
  456. out = r + out;
  457. }
  458. }
  459. if (this.isZero()) {
  460. out = '0' + out;
  461. }
  462. while (out.length % padding !== 0) {
  463. out = '0' + out;
  464. }
  465. if (this.negative !== 0) {
  466. out = '-' + out;
  467. }
  468. return out;
  469. }
  470. assert(false, 'Base should be between 2 and 36');
  471. };
  472. BN.prototype.toNumber = function toNumber () {
  473. var ret = this.words[0];
  474. if (this.length === 2) {
  475. ret += this.words[1] * 0x4000000;
  476. } else if (this.length === 3 && this.words[2] === 0x01) {
  477. // NOTE: at this stage it is known that the top bit is set
  478. ret += 0x10000000000000 + (this.words[1] * 0x4000000);
  479. } else if (this.length > 2) {
  480. assert(false, 'Number can only safely store up to 53 bits');
  481. }
  482. return (this.negative !== 0) ? -ret : ret;
  483. };
  484. BN.prototype.toJSON = function toJSON () {
  485. return this.toString(16, 2);
  486. };
  487. if (Buffer) {
  488. BN.prototype.toBuffer = function toBuffer (endian, length) {
  489. return this.toArrayLike(Buffer, endian, length);
  490. };
  491. }
  492. BN.prototype.toArray = function toArray (endian, length) {
  493. return this.toArrayLike(Array, endian, length);
  494. };
  495. var allocate = function allocate (ArrayType, size) {
  496. if (ArrayType.allocUnsafe) {
  497. return ArrayType.allocUnsafe(size);
  498. }
  499. return new ArrayType(size);
  500. };
  501. BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
  502. this._strip();
  503. var byteLength = this.byteLength();
  504. var reqLength = length || Math.max(1, byteLength);
  505. assert(byteLength <= reqLength, 'byte array longer than desired length');
  506. assert(reqLength > 0, 'Requested array length <= 0');
  507. var res = allocate(ArrayType, reqLength);
  508. var postfix = endian === 'le' ? 'LE' : 'BE';
  509. this['_toArrayLike' + postfix](res, byteLength);
  510. return res;
  511. };
  512. BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {
  513. var position = 0;
  514. var carry = 0;
  515. for (var i = 0, shift = 0; i < this.length; i++) {
  516. var word = (this.words[i] << shift) | carry;
  517. res[position++] = word & 0xff;
  518. if (position < res.length) {
  519. res[position++] = (word >> 8) & 0xff;
  520. }
  521. if (position < res.length) {
  522. res[position++] = (word >> 16) & 0xff;
  523. }
  524. if (shift === 6) {
  525. if (position < res.length) {
  526. res[position++] = (word >> 24) & 0xff;
  527. }
  528. carry = 0;
  529. shift = 0;
  530. } else {
  531. carry = word >>> 24;
  532. shift += 2;
  533. }
  534. }
  535. if (position < res.length) {
  536. res[position++] = carry;
  537. while (position < res.length) {
  538. res[position++] = 0;
  539. }
  540. }
  541. };
  542. BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {
  543. var position = res.length - 1;
  544. var carry = 0;
  545. for (var i = 0, shift = 0; i < this.length; i++) {
  546. var word = (this.words[i] << shift) | carry;
  547. res[position--] = word & 0xff;
  548. if (position >= 0) {
  549. res[position--] = (word >> 8) & 0xff;
  550. }
  551. if (position >= 0) {
  552. res[position--] = (word >> 16) & 0xff;
  553. }
  554. if (shift === 6) {
  555. if (position >= 0) {
  556. res[position--] = (word >> 24) & 0xff;
  557. }
  558. carry = 0;
  559. shift = 0;
  560. } else {
  561. carry = word >>> 24;
  562. shift += 2;
  563. }
  564. }
  565. if (position >= 0) {
  566. res[position--] = carry;
  567. while (position >= 0) {
  568. res[position--] = 0;
  569. }
  570. }
  571. };
  572. if (Math.clz32) {
  573. BN.prototype._countBits = function _countBits (w) {
  574. return 32 - Math.clz32(w);
  575. };
  576. } else {
  577. BN.prototype._countBits = function _countBits (w) {
  578. var t = w;
  579. var r = 0;
  580. if (t >= 0x1000) {
  581. r += 13;
  582. t >>>= 13;
  583. }
  584. if (t >= 0x40) {
  585. r += 7;
  586. t >>>= 7;
  587. }
  588. if (t >= 0x8) {
  589. r += 4;
  590. t >>>= 4;
  591. }
  592. if (t >= 0x02) {
  593. r += 2;
  594. t >>>= 2;
  595. }
  596. return r + t;
  597. };
  598. }
  599. BN.prototype._zeroBits = function _zeroBits (w) {
  600. // Short-cut
  601. if (w === 0) return 26;
  602. var t = w;
  603. var r = 0;
  604. if ((t & 0x1fff) === 0) {
  605. r += 13;
  606. t >>>= 13;
  607. }
  608. if ((t & 0x7f) === 0) {
  609. r += 7;
  610. t >>>= 7;
  611. }
  612. if ((t & 0xf) === 0) {
  613. r += 4;
  614. t >>>= 4;
  615. }
  616. if ((t & 0x3) === 0) {
  617. r += 2;
  618. t >>>= 2;
  619. }
  620. if ((t & 0x1) === 0) {
  621. r++;
  622. }
  623. return r;
  624. };
  625. // Return number of used bits in a BN
  626. BN.prototype.bitLength = function bitLength () {
  627. var w = this.words[this.length - 1];
  628. var hi = this._countBits(w);
  629. return (this.length - 1) * 26 + hi;
  630. };
  631. function toBitArray (num) {
  632. var w = new Array(num.bitLength());
  633. for (var bit = 0; bit < w.length; bit++) {
  634. var off = (bit / 26) | 0;
  635. var wbit = bit % 26;
  636. w[bit] = (num.words[off] >>> wbit) & 0x01;
  637. }
  638. return w;
  639. }
  640. // Number of trailing zero bits
  641. BN.prototype.zeroBits = function zeroBits () {
  642. if (this.isZero()) return 0;
  643. var r = 0;
  644. for (var i = 0; i < this.length; i++) {
  645. var b = this._zeroBits(this.words[i]);
  646. r += b;
  647. if (b !== 26) break;
  648. }
  649. return r;
  650. };
  651. BN.prototype.byteLength = function byteLength () {
  652. return Math.ceil(this.bitLength() / 8);
  653. };
  654. BN.prototype.toTwos = function toTwos (width) {
  655. if (this.negative !== 0) {
  656. return this.abs().inotn(width).iaddn(1);
  657. }
  658. return this.clone();
  659. };
  660. BN.prototype.fromTwos = function fromTwos (width) {
  661. if (this.testn(width - 1)) {
  662. return this.notn(width).iaddn(1).ineg();
  663. }
  664. return this.clone();
  665. };
  666. BN.prototype.isNeg = function isNeg () {
  667. return this.negative !== 0;
  668. };
  669. // Return negative clone of `this`
  670. BN.prototype.neg = function neg () {
  671. return this.clone().ineg();
  672. };
  673. BN.prototype.ineg = function ineg () {
  674. if (!this.isZero()) {
  675. this.negative ^= 1;
  676. }
  677. return this;
  678. };
  679. // Or `num` with `this` in-place
  680. BN.prototype.iuor = function iuor (num) {
  681. while (this.length < num.length) {
  682. this.words[this.length++] = 0;
  683. }
  684. for (var i = 0; i < num.length; i++) {
  685. this.words[i] = this.words[i] | num.words[i];
  686. }
  687. return this._strip();
  688. };
  689. BN.prototype.ior = function ior (num) {
  690. assert((this.negative | num.negative) === 0);
  691. return this.iuor(num);
  692. };
  693. // Or `num` with `this`
  694. BN.prototype.or = function or (num) {
  695. if (this.length > num.length) return this.clone().ior(num);
  696. return num.clone().ior(this);
  697. };
  698. BN.prototype.uor = function uor (num) {
  699. if (this.length > num.length) return this.clone().iuor(num);
  700. return num.clone().iuor(this);
  701. };
  702. // And `num` with `this` in-place
  703. BN.prototype.iuand = function iuand (num) {
  704. // b = min-length(num, this)
  705. var b;
  706. if (this.length > num.length) {
  707. b = num;
  708. } else {
  709. b = this;
  710. }
  711. for (var i = 0; i < b.length; i++) {
  712. this.words[i] = this.words[i] & num.words[i];
  713. }
  714. this.length = b.length;
  715. return this._strip();
  716. };
  717. BN.prototype.iand = function iand (num) {
  718. assert((this.negative | num.negative) === 0);
  719. return this.iuand(num);
  720. };
  721. // And `num` with `this`
  722. BN.prototype.and = function and (num) {
  723. if (this.length > num.length) return this.clone().iand(num);
  724. return num.clone().iand(this);
  725. };
  726. BN.prototype.uand = function uand (num) {
  727. if (this.length > num.length) return this.clone().iuand(num);
  728. return num.clone().iuand(this);
  729. };
  730. // Xor `num` with `this` in-place
  731. BN.prototype.iuxor = function iuxor (num) {
  732. // a.length > b.length
  733. var a;
  734. var b;
  735. if (this.length > num.length) {
  736. a = this;
  737. b = num;
  738. } else {
  739. a = num;
  740. b = this;
  741. }
  742. for (var i = 0; i < b.length; i++) {
  743. this.words[i] = a.words[i] ^ b.words[i];
  744. }
  745. if (this !== a) {
  746. for (; i < a.length; i++) {
  747. this.words[i] = a.words[i];
  748. }
  749. }
  750. this.length = a.length;
  751. return this._strip();
  752. };
  753. BN.prototype.ixor = function ixor (num) {
  754. assert((this.negative | num.negative) === 0);
  755. return this.iuxor(num);
  756. };
  757. // Xor `num` with `this`
  758. BN.prototype.xor = function xor (num) {
  759. if (this.length > num.length) return this.clone().ixor(num);
  760. return num.clone().ixor(this);
  761. };
  762. BN.prototype.uxor = function uxor (num) {
  763. if (this.length > num.length) return this.clone().iuxor(num);
  764. return num.clone().iuxor(this);
  765. };
  766. // Not ``this`` with ``width`` bitwidth
  767. BN.prototype.inotn = function inotn (width) {
  768. assert(typeof width === 'number' && width >= 0);
  769. var bytesNeeded = Math.ceil(width / 26) | 0;
  770. var bitsLeft = width % 26;
  771. // Extend the buffer with leading zeroes
  772. this._expand(bytesNeeded);
  773. if (bitsLeft > 0) {
  774. bytesNeeded--;
  775. }
  776. // Handle complete words
  777. for (var i = 0; i < bytesNeeded; i++) {
  778. this.words[i] = ~this.words[i] & 0x3ffffff;
  779. }
  780. // Handle the residue
  781. if (bitsLeft > 0) {
  782. this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
  783. }
  784. // And remove leading zeroes
  785. return this._strip();
  786. };
  787. BN.prototype.notn = function notn (width) {
  788. return this.clone().inotn(width);
  789. };
  790. // Set `bit` of `this`
  791. BN.prototype.setn = function setn (bit, val) {
  792. assert(typeof bit === 'number' && bit >= 0);
  793. var off = (bit / 26) | 0;
  794. var wbit = bit % 26;
  795. this._expand(off + 1);
  796. if (val) {
  797. this.words[off] = this.words[off] | (1 << wbit);
  798. } else {
  799. this.words[off] = this.words[off] & ~(1 << wbit);
  800. }
  801. return this._strip();
  802. };
  803. // Add `num` to `this` in-place
  804. BN.prototype.iadd = function iadd (num) {
  805. var r;
  806. // negative + positive
  807. if (this.negative !== 0 && num.negative === 0) {
  808. this.negative = 0;
  809. r = this.isub(num);
  810. this.negative ^= 1;
  811. return this._normSign();
  812. // positive + negative
  813. } else if (this.negative === 0 && num.negative !== 0) {
  814. num.negative = 0;
  815. r = this.isub(num);
  816. num.negative = 1;
  817. return r._normSign();
  818. }
  819. // a.length > b.length
  820. var a, b;
  821. if (this.length > num.length) {
  822. a = this;
  823. b = num;
  824. } else {
  825. a = num;
  826. b = this;
  827. }
  828. var carry = 0;
  829. for (var i = 0; i < b.length; i++) {
  830. r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
  831. this.words[i] = r & 0x3ffffff;
  832. carry = r >>> 26;
  833. }
  834. for (; carry !== 0 && i < a.length; i++) {
  835. r = (a.words[i] | 0) + carry;
  836. this.words[i] = r & 0x3ffffff;
  837. carry = r >>> 26;
  838. }
  839. this.length = a.length;
  840. if (carry !== 0) {
  841. this.words[this.length] = carry;
  842. this.length++;
  843. // Copy the rest of the words
  844. } else if (a !== this) {
  845. for (; i < a.length; i++) {
  846. this.words[i] = a.words[i];
  847. }
  848. }
  849. return this;
  850. };
  851. // Add `num` to `this`
  852. BN.prototype.add = function add (num) {
  853. var res;
  854. if (num.negative !== 0 && this.negative === 0) {
  855. num.negative = 0;
  856. res = this.sub(num);
  857. num.negative ^= 1;
  858. return res;
  859. } else if (num.negative === 0 && this.negative !== 0) {
  860. this.negative = 0;
  861. res = num.sub(this);
  862. this.negative = 1;
  863. return res;
  864. }
  865. if (this.length > num.length) return this.clone().iadd(num);
  866. return num.clone().iadd(this);
  867. };
  868. // Subtract `num` from `this` in-place
  869. BN.prototype.isub = function isub (num) {
  870. // this - (-num) = this + num
  871. if (num.negative !== 0) {
  872. num.negative = 0;
  873. var r = this.iadd(num);
  874. num.negative = 1;
  875. return r._normSign();
  876. // -this - num = -(this + num)
  877. } else if (this.negative !== 0) {
  878. this.negative = 0;
  879. this.iadd(num);
  880. this.negative = 1;
  881. return this._normSign();
  882. }
  883. // At this point both numbers are positive
  884. var cmp = this.cmp(num);
  885. // Optimization - zeroify
  886. if (cmp === 0) {
  887. this.negative = 0;
  888. this.length = 1;
  889. this.words[0] = 0;
  890. return this;
  891. }
  892. // a > b
  893. var a, b;
  894. if (cmp > 0) {
  895. a = this;
  896. b = num;
  897. } else {
  898. a = num;
  899. b = this;
  900. }
  901. var carry = 0;
  902. for (var i = 0; i < b.length; i++) {
  903. r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
  904. carry = r >> 26;
  905. this.words[i] = r & 0x3ffffff;
  906. }
  907. for (; carry !== 0 && i < a.length; i++) {
  908. r = (a.words[i] | 0) + carry;
  909. carry = r >> 26;
  910. this.words[i] = r & 0x3ffffff;
  911. }
  912. // Copy rest of the words
  913. if (carry === 0 && i < a.length && a !== this) {
  914. for (; i < a.length; i++) {
  915. this.words[i] = a.words[i];
  916. }
  917. }
  918. this.length = Math.max(this.length, i);
  919. if (a !== this) {
  920. this.negative = 1;
  921. }
  922. return this._strip();
  923. };
  924. // Subtract `num` from `this`
  925. BN.prototype.sub = function sub (num) {
  926. return this.clone().isub(num);
  927. };
  928. function smallMulTo (self, num, out) {
  929. out.negative = num.negative ^ self.negative;
  930. var len = (self.length + num.length) | 0;
  931. out.length = len;
  932. len = (len - 1) | 0;
  933. // Peel one iteration (compiler can't do it, because of code complexity)
  934. var a = self.words[0] | 0;
  935. var b = num.words[0] | 0;
  936. var r = a * b;
  937. var lo = r & 0x3ffffff;
  938. var carry = (r / 0x4000000) | 0;
  939. out.words[0] = lo;
  940. for (var k = 1; k < len; k++) {
  941. // Sum all words with the same `i + j = k` and accumulate `ncarry`,
  942. // note that ncarry could be >= 0x3ffffff
  943. var ncarry = carry >>> 26;
  944. var rword = carry & 0x3ffffff;
  945. var maxJ = Math.min(k, num.length - 1);
  946. for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
  947. var i = (k - j) | 0;
  948. a = self.words[i] | 0;
  949. b = num.words[j] | 0;
  950. r = a * b + rword;
  951. ncarry += (r / 0x4000000) | 0;
  952. rword = r & 0x3ffffff;
  953. }
  954. out.words[k] = rword | 0;
  955. carry = ncarry | 0;
  956. }
  957. if (carry !== 0) {
  958. out.words[k] = carry | 0;
  959. } else {
  960. out.length--;
  961. }
  962. return out._strip();
  963. }
  964. // TODO(indutny): it may be reasonable to omit it for users who don't need
  965. // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
  966. // multiplication (like elliptic secp256k1).
  967. var comb10MulTo = function comb10MulTo (self, num, out) {
  968. var a = self.words;
  969. var b = num.words;
  970. var o = out.words;
  971. var c = 0;
  972. var lo;
  973. var mid;
  974. var hi;
  975. var a0 = a[0] | 0;
  976. var al0 = a0 & 0x1fff;
  977. var ah0 = a0 >>> 13;
  978. var a1 = a[1] | 0;
  979. var al1 = a1 & 0x1fff;
  980. var ah1 = a1 >>> 13;
  981. var a2 = a[2] | 0;
  982. var al2 = a2 & 0x1fff;
  983. var ah2 = a2 >>> 13;
  984. var a3 = a[3] | 0;
  985. var al3 = a3 & 0x1fff;
  986. var ah3 = a3 >>> 13;
  987. var a4 = a[4] | 0;
  988. var al4 = a4 & 0x1fff;
  989. var ah4 = a4 >>> 13;
  990. var a5 = a[5] | 0;
  991. var al5 = a5 & 0x1fff;
  992. var ah5 = a5 >>> 13;
  993. var a6 = a[6] | 0;
  994. var al6 = a6 & 0x1fff;
  995. var ah6 = a6 >>> 13;
  996. var a7 = a[7] | 0;
  997. var al7 = a7 & 0x1fff;
  998. var ah7 = a7 >>> 13;
  999. var a8 = a[8] | 0;
  1000. var al8 = a8 & 0x1fff;
  1001. var ah8 = a8 >>> 13;
  1002. var a9 = a[9] | 0;
  1003. var al9 = a9 & 0x1fff;
  1004. var ah9 = a9 >>> 13;
  1005. var b0 = b[0] | 0;
  1006. var bl0 = b0 & 0x1fff;
  1007. var bh0 = b0 >>> 13;
  1008. var b1 = b[1] | 0;
  1009. var bl1 = b1 & 0x1fff;
  1010. var bh1 = b1 >>> 13;
  1011. var b2 = b[2] | 0;
  1012. var bl2 = b2 & 0x1fff;
  1013. var bh2 = b2 >>> 13;
  1014. var b3 = b[3] | 0;
  1015. var bl3 = b3 & 0x1fff;
  1016. var bh3 = b3 >>> 13;
  1017. var b4 = b[4] | 0;
  1018. var bl4 = b4 & 0x1fff;
  1019. var bh4 = b4 >>> 13;
  1020. var b5 = b[5] | 0;
  1021. var bl5 = b5 & 0x1fff;
  1022. var bh5 = b5 >>> 13;
  1023. var b6 = b[6] | 0;
  1024. var bl6 = b6 & 0x1fff;
  1025. var bh6 = b6 >>> 13;
  1026. var b7 = b[7] | 0;
  1027. var bl7 = b7 & 0x1fff;
  1028. var bh7 = b7 >>> 13;
  1029. var b8 = b[8] | 0;
  1030. var bl8 = b8 & 0x1fff;
  1031. var bh8 = b8 >>> 13;
  1032. var b9 = b[9] | 0;
  1033. var bl9 = b9 & 0x1fff;
  1034. var bh9 = b9 >>> 13;
  1035. out.negative = self.negative ^ num.negative;
  1036. out.length = 19;
  1037. /* k = 0 */
  1038. lo = Math.imul(al0, bl0);
  1039. mid = Math.imul(al0, bh0);
  1040. mid = (mid + Math.imul(ah0, bl0)) | 0;
  1041. hi = Math.imul(ah0, bh0);
  1042. var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1043. c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
  1044. w0 &= 0x3ffffff;
  1045. /* k = 1 */
  1046. lo = Math.imul(al1, bl0);
  1047. mid = Math.imul(al1, bh0);
  1048. mid = (mid + Math.imul(ah1, bl0)) | 0;
  1049. hi = Math.imul(ah1, bh0);
  1050. lo = (lo + Math.imul(al0, bl1)) | 0;
  1051. mid = (mid + Math.imul(al0, bh1)) | 0;
  1052. mid = (mid + Math.imul(ah0, bl1)) | 0;
  1053. hi = (hi + Math.imul(ah0, bh1)) | 0;
  1054. var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1055. c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
  1056. w1 &= 0x3ffffff;
  1057. /* k = 2 */
  1058. lo = Math.imul(al2, bl0);
  1059. mid = Math.imul(al2, bh0);
  1060. mid = (mid + Math.imul(ah2, bl0)) | 0;
  1061. hi = Math.imul(ah2, bh0);
  1062. lo = (lo + Math.imul(al1, bl1)) | 0;
  1063. mid = (mid + Math.imul(al1, bh1)) | 0;
  1064. mid = (mid + Math.imul(ah1, bl1)) | 0;
  1065. hi = (hi + Math.imul(ah1, bh1)) | 0;
  1066. lo = (lo + Math.imul(al0, bl2)) | 0;
  1067. mid = (mid + Math.imul(al0, bh2)) | 0;
  1068. mid = (mid + Math.imul(ah0, bl2)) | 0;
  1069. hi = (hi + Math.imul(ah0, bh2)) | 0;
  1070. var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1071. c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
  1072. w2 &= 0x3ffffff;
  1073. /* k = 3 */
  1074. lo = Math.imul(al3, bl0);
  1075. mid = Math.imul(al3, bh0);
  1076. mid = (mid + Math.imul(ah3, bl0)) | 0;
  1077. hi = Math.imul(ah3, bh0);
  1078. lo = (lo + Math.imul(al2, bl1)) | 0;
  1079. mid = (mid + Math.imul(al2, bh1)) | 0;
  1080. mid = (mid + Math.imul(ah2, bl1)) | 0;
  1081. hi = (hi + Math.imul(ah2, bh1)) | 0;
  1082. lo = (lo + Math.imul(al1, bl2)) | 0;
  1083. mid = (mid + Math.imul(al1, bh2)) | 0;
  1084. mid = (mid + Math.imul(ah1, bl2)) | 0;
  1085. hi = (hi + Math.imul(ah1, bh2)) | 0;
  1086. lo = (lo + Math.imul(al0, bl3)) | 0;
  1087. mid = (mid + Math.imul(al0, bh3)) | 0;
  1088. mid = (mid + Math.imul(ah0, bl3)) | 0;
  1089. hi = (hi + Math.imul(ah0, bh3)) | 0;
  1090. var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1091. c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
  1092. w3 &= 0x3ffffff;
  1093. /* k = 4 */
  1094. lo = Math.imul(al4, bl0);
  1095. mid = Math.imul(al4, bh0);
  1096. mid = (mid + Math.imul(ah4, bl0)) | 0;
  1097. hi = Math.imul(ah4, bh0);
  1098. lo = (lo + Math.imul(al3, bl1)) | 0;
  1099. mid = (mid + Math.imul(al3, bh1)) | 0;
  1100. mid = (mid + Math.imul(ah3, bl1)) | 0;
  1101. hi = (hi + Math.imul(ah3, bh1)) | 0;
  1102. lo = (lo + Math.imul(al2, bl2)) | 0;
  1103. mid = (mid + Math.imul(al2, bh2)) | 0;
  1104. mid = (mid + Math.imul(ah2, bl2)) | 0;
  1105. hi = (hi + Math.imul(ah2, bh2)) | 0;
  1106. lo = (lo + Math.imul(al1, bl3)) | 0;
  1107. mid = (mid + Math.imul(al1, bh3)) | 0;
  1108. mid = (mid + Math.imul(ah1, bl3)) | 0;
  1109. hi = (hi + Math.imul(ah1, bh3)) | 0;
  1110. lo = (lo + Math.imul(al0, bl4)) | 0;
  1111. mid = (mid + Math.imul(al0, bh4)) | 0;
  1112. mid = (mid + Math.imul(ah0, bl4)) | 0;
  1113. hi = (hi + Math.imul(ah0, bh4)) | 0;
  1114. var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1115. c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
  1116. w4 &= 0x3ffffff;
  1117. /* k = 5 */
  1118. lo = Math.imul(al5, bl0);
  1119. mid = Math.imul(al5, bh0);
  1120. mid = (mid + Math.imul(ah5, bl0)) | 0;
  1121. hi = Math.imul(ah5, bh0);
  1122. lo = (lo + Math.imul(al4, bl1)) | 0;
  1123. mid = (mid + Math.imul(al4, bh1)) | 0;
  1124. mid = (mid + Math.imul(ah4, bl1)) | 0;
  1125. hi = (hi + Math.imul(ah4, bh1)) | 0;
  1126. lo = (lo + Math.imul(al3, bl2)) | 0;
  1127. mid = (mid + Math.imul(al3, bh2)) | 0;
  1128. mid = (mid + Math.imul(ah3, bl2)) | 0;
  1129. hi = (hi + Math.imul(ah3, bh2)) | 0;
  1130. lo = (lo + Math.imul(al2, bl3)) | 0;
  1131. mid = (mid + Math.imul(al2, bh3)) | 0;
  1132. mid = (mid + Math.imul(ah2, bl3)) | 0;
  1133. hi = (hi + Math.imul(ah2, bh3)) | 0;
  1134. lo = (lo + Math.imul(al1, bl4)) | 0;
  1135. mid = (mid + Math.imul(al1, bh4)) | 0;
  1136. mid = (mid + Math.imul(ah1, bl4)) | 0;
  1137. hi = (hi + Math.imul(ah1, bh4)) | 0;
  1138. lo = (lo + Math.imul(al0, bl5)) | 0;
  1139. mid = (mid + Math.imul(al0, bh5)) | 0;
  1140. mid = (mid + Math.imul(ah0, bl5)) | 0;
  1141. hi = (hi + Math.imul(ah0, bh5)) | 0;
  1142. var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1143. c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
  1144. w5 &= 0x3ffffff;
  1145. /* k = 6 */
  1146. lo = Math.imul(al6, bl0);
  1147. mid = Math.imul(al6, bh0);
  1148. mid = (mid + Math.imul(ah6, bl0)) | 0;
  1149. hi = Math.imul(ah6, bh0);
  1150. lo = (lo + Math.imul(al5, bl1)) | 0;
  1151. mid = (mid + Math.imul(al5, bh1)) | 0;
  1152. mid = (mid + Math.imul(ah5, bl1)) | 0;
  1153. hi = (hi + Math.imul(ah5, bh1)) | 0;
  1154. lo = (lo + Math.imul(al4, bl2)) | 0;
  1155. mid = (mid + Math.imul(al4, bh2)) | 0;
  1156. mid = (mid + Math.imul(ah4, bl2)) | 0;
  1157. hi = (hi + Math.imul(ah4, bh2)) | 0;
  1158. lo = (lo + Math.imul(al3, bl3)) | 0;
  1159. mid = (mid + Math.imul(al3, bh3)) | 0;
  1160. mid = (mid + Math.imul(ah3, bl3)) | 0;
  1161. hi = (hi + Math.imul(ah3, bh3)) | 0;
  1162. lo = (lo + Math.imul(al2, bl4)) | 0;
  1163. mid = (mid + Math.imul(al2, bh4)) | 0;
  1164. mid = (mid + Math.imul(ah2, bl4)) | 0;
  1165. hi = (hi + Math.imul(ah2, bh4)) | 0;
  1166. lo = (lo + Math.imul(al1, bl5)) | 0;
  1167. mid = (mid + Math.imul(al1, bh5)) | 0;
  1168. mid = (mid + Math.imul(ah1, bl5)) | 0;
  1169. hi = (hi + Math.imul(ah1, bh5)) | 0;
  1170. lo = (lo + Math.imul(al0, bl6)) | 0;
  1171. mid = (mid + Math.imul(al0, bh6)) | 0;
  1172. mid = (mid + Math.imul(ah0, bl6)) | 0;
  1173. hi = (hi + Math.imul(ah0, bh6)) | 0;
  1174. var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1175. c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
  1176. w6 &= 0x3ffffff;
  1177. /* k = 7 */
  1178. lo = Math.imul(al7, bl0);
  1179. mid = Math.imul(al7, bh0);
  1180. mid = (mid + Math.imul(ah7, bl0)) | 0;
  1181. hi = Math.imul(ah7, bh0);
  1182. lo = (lo + Math.imul(al6, bl1)) | 0;
  1183. mid = (mid + Math.imul(al6, bh1)) | 0;
  1184. mid = (mid + Math.imul(ah6, bl1)) | 0;
  1185. hi = (hi + Math.imul(ah6, bh1)) | 0;
  1186. lo = (lo + Math.imul(al5, bl2)) | 0;
  1187. mid = (mid + Math.imul(al5, bh2)) | 0;
  1188. mid = (mid + Math.imul(ah5, bl2)) | 0;
  1189. hi = (hi + Math.imul(ah5, bh2)) | 0;
  1190. lo = (lo + Math.imul(al4, bl3)) | 0;
  1191. mid = (mid + Math.imul(al4, bh3)) | 0;
  1192. mid = (mid + Math.imul(ah4, bl3)) | 0;
  1193. hi = (hi + Math.imul(ah4, bh3)) | 0;
  1194. lo = (lo + Math.imul(al3, bl4)) | 0;
  1195. mid = (mid + Math.imul(al3, bh4)) | 0;
  1196. mid = (mid + Math.imul(ah3, bl4)) | 0;
  1197. hi = (hi + Math.imul(ah3, bh4)) | 0;
  1198. lo = (lo + Math.imul(al2, bl5)) | 0;
  1199. mid = (mid + Math.imul(al2, bh5)) | 0;
  1200. mid = (mid + Math.imul(ah2, bl5)) | 0;
  1201. hi = (hi + Math.imul(ah2, bh5)) | 0;
  1202. lo = (lo + Math.imul(al1, bl6)) | 0;
  1203. mid = (mid + Math.imul(al1, bh6)) | 0;
  1204. mid = (mid + Math.imul(ah1, bl6)) | 0;
  1205. hi = (hi + Math.imul(ah1, bh6)) | 0;
  1206. lo = (lo + Math.imul(al0, bl7)) | 0;
  1207. mid = (mid + Math.imul(al0, bh7)) | 0;
  1208. mid = (mid + Math.imul(ah0, bl7)) | 0;
  1209. hi = (hi + Math.imul(ah0, bh7)) | 0;
  1210. var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1211. c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
  1212. w7 &= 0x3ffffff;
  1213. /* k = 8 */
  1214. lo = Math.imul(al8, bl0);
  1215. mid = Math.imul(al8, bh0);
  1216. mid = (mid + Math.imul(ah8, bl0)) | 0;
  1217. hi = Math.imul(ah8, bh0);
  1218. lo = (lo + Math.imul(al7, bl1)) | 0;
  1219. mid = (mid + Math.imul(al7, bh1)) | 0;
  1220. mid = (mid + Math.imul(ah7, bl1)) | 0;
  1221. hi = (hi + Math.imul(ah7, bh1)) | 0;
  1222. lo = (lo + Math.imul(al6, bl2)) | 0;
  1223. mid = (mid + Math.imul(al6, bh2)) | 0;
  1224. mid = (mid + Math.imul(ah6, bl2)) | 0;
  1225. hi = (hi + Math.imul(ah6, bh2)) | 0;
  1226. lo = (lo + Math.imul(al5, bl3)) | 0;
  1227. mid = (mid + Math.imul(al5, bh3)) | 0;
  1228. mid = (mid + Math.imul(ah5, bl3)) | 0;
  1229. hi = (hi + Math.imul(ah5, bh3)) | 0;
  1230. lo = (lo + Math.imul(al4, bl4)) | 0;
  1231. mid = (mid + Math.imul(al4, bh4)) | 0;
  1232. mid = (mid + Math.imul(ah4, bl4)) | 0;
  1233. hi = (hi + Math.imul(ah4, bh4)) | 0;
  1234. lo = (lo + Math.imul(al3, bl5)) | 0;
  1235. mid = (mid + Math.imul(al3, bh5)) | 0;
  1236. mid = (mid + Math.imul(ah3, bl5)) | 0;
  1237. hi = (hi + Math.imul(ah3, bh5)) | 0;
  1238. lo = (lo + Math.imul(al2, bl6)) | 0;
  1239. mid = (mid + Math.imul(al2, bh6)) | 0;
  1240. mid = (mid + Math.imul(ah2, bl6)) | 0;
  1241. hi = (hi + Math.imul(ah2, bh6)) | 0;
  1242. lo = (lo + Math.imul(al1, bl7)) | 0;
  1243. mid = (mid + Math.imul(al1, bh7)) | 0;
  1244. mid = (mid + Math.imul(ah1, bl7)) | 0;
  1245. hi = (hi + Math.imul(ah1, bh7)) | 0;
  1246. lo = (lo + Math.imul(al0, bl8)) | 0;
  1247. mid = (mid + Math.imul(al0, bh8)) | 0;
  1248. mid = (mid + Math.imul(ah0, bl8)) | 0;
  1249. hi = (hi + Math.imul(ah0, bh8)) | 0;
  1250. var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1251. c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
  1252. w8 &= 0x3ffffff;
  1253. /* k = 9 */
  1254. lo = Math.imul(al9, bl0);
  1255. mid = Math.imul(al9, bh0);
  1256. mid = (mid + Math.imul(ah9, bl0)) | 0;
  1257. hi = Math.imul(ah9, bh0);
  1258. lo = (lo + Math.imul(al8, bl1)) | 0;
  1259. mid = (mid + Math.imul(al8, bh1)) | 0;
  1260. mid = (mid + Math.imul(ah8, bl1)) | 0;
  1261. hi = (hi + Math.imul(ah8, bh1)) | 0;
  1262. lo = (lo + Math.imul(al7, bl2)) | 0;
  1263. mid = (mid + Math.imul(al7, bh2)) | 0;
  1264. mid = (mid + Math.imul(ah7, bl2)) | 0;
  1265. hi = (hi + Math.imul(ah7, bh2)) | 0;
  1266. lo = (lo + Math.imul(al6, bl3)) | 0;
  1267. mid = (mid + Math.imul(al6, bh3)) | 0;
  1268. mid = (mid + Math.imul(ah6, bl3)) | 0;
  1269. hi = (hi + Math.imul(ah6, bh3)) | 0;
  1270. lo = (lo + Math.imul(al5, bl4)) | 0;
  1271. mid = (mid + Math.imul(al5, bh4)) | 0;
  1272. mid = (mid + Math.imul(ah5, bl4)) | 0;
  1273. hi = (hi + Math.imul(ah5, bh4)) | 0;
  1274. lo = (lo + Math.imul(al4, bl5)) | 0;
  1275. mid = (mid + Math.imul(al4, bh5)) | 0;
  1276. mid = (mid + Math.imul(ah4, bl5)) | 0;
  1277. hi = (hi + Math.imul(ah4, bh5)) | 0;
  1278. lo = (lo + Math.imul(al3, bl6)) | 0;
  1279. mid = (mid + Math.imul(al3, bh6)) | 0;
  1280. mid = (mid + Math.imul(ah3, bl6)) | 0;
  1281. hi = (hi + Math.imul(ah3, bh6)) | 0;
  1282. lo = (lo + Math.imul(al2, bl7)) | 0;
  1283. mid = (mid + Math.imul(al2, bh7)) | 0;
  1284. mid = (mid + Math.imul(ah2, bl7)) | 0;
  1285. hi = (hi + Math.imul(ah2, bh7)) | 0;
  1286. lo = (lo + Math.imul(al1, bl8)) | 0;
  1287. mid = (mid + Math.imul(al1, bh8)) | 0;
  1288. mid = (mid + Math.imul(ah1, bl8)) | 0;
  1289. hi = (hi + Math.imul(ah1, bh8)) | 0;
  1290. lo = (lo + Math.imul(al0, bl9)) | 0;
  1291. mid = (mid + Math.imul(al0, bh9)) | 0;
  1292. mid = (mid + Math.imul(ah0, bl9)) | 0;
  1293. hi = (hi + Math.imul(ah0, bh9)) | 0;
  1294. var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1295. c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
  1296. w9 &= 0x3ffffff;
  1297. /* k = 10 */
  1298. lo = Math.imul(al9, bl1);
  1299. mid = Math.imul(al9, bh1);
  1300. mid = (mid + Math.imul(ah9, bl1)) | 0;
  1301. hi = Math.imul(ah9, bh1);
  1302. lo = (lo + Math.imul(al8, bl2)) | 0;
  1303. mid = (mid + Math.imul(al8, bh2)) | 0;
  1304. mid = (mid + Math.imul(ah8, bl2)) | 0;
  1305. hi = (hi + Math.imul(ah8, bh2)) | 0;
  1306. lo = (lo + Math.imul(al7, bl3)) | 0;
  1307. mid = (mid + Math.imul(al7, bh3)) | 0;
  1308. mid = (mid + Math.imul(ah7, bl3)) | 0;
  1309. hi = (hi + Math.imul(ah7, bh3)) | 0;
  1310. lo = (lo + Math.imul(al6, bl4)) | 0;
  1311. mid = (mid + Math.imul(al6, bh4)) | 0;
  1312. mid = (mid + Math.imul(ah6, bl4)) | 0;
  1313. hi = (hi + Math.imul(ah6, bh4)) | 0;
  1314. lo = (lo + Math.imul(al5, bl5)) | 0;
  1315. mid = (mid + Math.imul(al5, bh5)) | 0;
  1316. mid = (mid + Math.imul(ah5, bl5)) | 0;
  1317. hi = (hi + Math.imul(ah5, bh5)) | 0;
  1318. lo = (lo + Math.imul(al4, bl6)) | 0;
  1319. mid = (mid + Math.imul(al4, bh6)) | 0;
  1320. mid = (mid + Math.imul(ah4, bl6)) | 0;
  1321. hi = (hi + Math.imul(ah4, bh6)) | 0;
  1322. lo = (lo + Math.imul(al3, bl7)) | 0;
  1323. mid = (mid + Math.imul(al3, bh7)) | 0;
  1324. mid = (mid + Math.imul(ah3, bl7)) | 0;
  1325. hi = (hi + Math.imul(ah3, bh7)) | 0;
  1326. lo = (lo + Math.imul(al2, bl8)) | 0;
  1327. mid = (mid + Math.imul(al2, bh8)) | 0;
  1328. mid = (mid + Math.imul(ah2, bl8)) | 0;
  1329. hi = (hi + Math.imul(ah2, bh8)) | 0;
  1330. lo = (lo + Math.imul(al1, bl9)) | 0;
  1331. mid = (mid + Math.imul(al1, bh9)) | 0;
  1332. mid = (mid + Math.imul(ah1, bl9)) | 0;
  1333. hi = (hi + Math.imul(ah1, bh9)) | 0;
  1334. var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1335. c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
  1336. w10 &= 0x3ffffff;
  1337. /* k = 11 */
  1338. lo = Math.imul(al9, bl2);
  1339. mid = Math.imul(al9, bh2);
  1340. mid = (mid + Math.imul(ah9, bl2)) | 0;
  1341. hi = Math.imul(ah9, bh2);
  1342. lo = (lo + Math.imul(al8, bl3)) | 0;
  1343. mid = (mid + Math.imul(al8, bh3)) | 0;
  1344. mid = (mid + Math.imul(ah8, bl3)) | 0;
  1345. hi = (hi + Math.imul(ah8, bh3)) | 0;
  1346. lo = (lo + Math.imul(al7, bl4)) | 0;
  1347. mid = (mid + Math.imul(al7, bh4)) | 0;
  1348. mid = (mid + Math.imul(ah7, bl4)) | 0;
  1349. hi = (hi + Math.imul(ah7, bh4)) | 0;
  1350. lo = (lo + Math.imul(al6, bl5)) | 0;
  1351. mid = (mid + Math.imul(al6, bh5)) | 0;
  1352. mid = (mid + Math.imul(ah6, bl5)) | 0;
  1353. hi = (hi + Math.imul(ah6, bh5)) | 0;
  1354. lo = (lo + Math.imul(al5, bl6)) | 0;
  1355. mid = (mid + Math.imul(al5, bh6)) | 0;
  1356. mid = (mid + Math.imul(ah5, bl6)) | 0;
  1357. hi = (hi + Math.imul(ah5, bh6)) | 0;
  1358. lo = (lo + Math.imul(al4, bl7)) | 0;
  1359. mid = (mid + Math.imul(al4, bh7)) | 0;
  1360. mid = (mid + Math.imul(ah4, bl7)) | 0;
  1361. hi = (hi + Math.imul(ah4, bh7)) | 0;
  1362. lo = (lo + Math.imul(al3, bl8)) | 0;
  1363. mid = (mid + Math.imul(al3, bh8)) | 0;
  1364. mid = (mid + Math.imul(ah3, bl8)) | 0;
  1365. hi = (hi + Math.imul(ah3, bh8)) | 0;
  1366. lo = (lo + Math.imul(al2, bl9)) | 0;
  1367. mid = (mid + Math.imul(al2, bh9)) | 0;
  1368. mid = (mid + Math.imul(ah2, bl9)) | 0;
  1369. hi = (hi + Math.imul(ah2, bh9)) | 0;
  1370. var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1371. c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
  1372. w11 &= 0x3ffffff;
  1373. /* k = 12 */
  1374. lo = Math.imul(al9, bl3);
  1375. mid = Math.imul(al9, bh3);
  1376. mid = (mid + Math.imul(ah9, bl3)) | 0;
  1377. hi = Math.imul(ah9, bh3);
  1378. lo = (lo + Math.imul(al8, bl4)) | 0;
  1379. mid = (mid + Math.imul(al8, bh4)) | 0;
  1380. mid = (mid + Math.imul(ah8, bl4)) | 0;
  1381. hi = (hi + Math.imul(ah8, bh4)) | 0;
  1382. lo = (lo + Math.imul(al7, bl5)) | 0;
  1383. mid = (mid + Math.imul(al7, bh5)) | 0;
  1384. mid = (mid + Math.imul(ah7, bl5)) | 0;
  1385. hi = (hi + Math.imul(ah7, bh5)) | 0;
  1386. lo = (lo + Math.imul(al6, bl6)) | 0;
  1387. mid = (mid + Math.imul(al6, bh6)) | 0;
  1388. mid = (mid + Math.imul(ah6, bl6)) | 0;
  1389. hi = (hi + Math.imul(ah6, bh6)) | 0;
  1390. lo = (lo + Math.imul(al5, bl7)) | 0;
  1391. mid = (mid + Math.imul(al5, bh7)) | 0;
  1392. mid = (mid + Math.imul(ah5, bl7)) | 0;
  1393. hi = (hi + Math.imul(ah5, bh7)) | 0;
  1394. lo = (lo + Math.imul(al4, bl8)) | 0;
  1395. mid = (mid + Math.imul(al4, bh8)) | 0;
  1396. mid = (mid + Math.imul(ah4, bl8)) | 0;
  1397. hi = (hi + Math.imul(ah4, bh8)) | 0;
  1398. lo = (lo + Math.imul(al3, bl9)) | 0;
  1399. mid = (mid + Math.imul(al3, bh9)) | 0;
  1400. mid = (mid + Math.imul(ah3, bl9)) | 0;
  1401. hi = (hi + Math.imul(ah3, bh9)) | 0;
  1402. var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1403. c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
  1404. w12 &= 0x3ffffff;
  1405. /* k = 13 */
  1406. lo = Math.imul(al9, bl4);
  1407. mid = Math.imul(al9, bh4);
  1408. mid = (mid + Math.imul(ah9, bl4)) | 0;
  1409. hi = Math.imul(ah9, bh4);
  1410. lo = (lo + Math.imul(al8, bl5)) | 0;
  1411. mid = (mid + Math.imul(al8, bh5)) | 0;
  1412. mid = (mid + Math.imul(ah8, bl5)) | 0;
  1413. hi = (hi + Math.imul(ah8, bh5)) | 0;
  1414. lo = (lo + Math.imul(al7, bl6)) | 0;
  1415. mid = (mid + Math.imul(al7, bh6)) | 0;
  1416. mid = (mid + Math.imul(ah7, bl6)) | 0;
  1417. hi = (hi + Math.imul(ah7, bh6)) | 0;
  1418. lo = (lo + Math.imul(al6, bl7)) | 0;
  1419. mid = (mid + Math.imul(al6, bh7)) | 0;
  1420. mid = (mid + Math.imul(ah6, bl7)) | 0;
  1421. hi = (hi + Math.imul(ah6, bh7)) | 0;
  1422. lo = (lo + Math.imul(al5, bl8)) | 0;
  1423. mid = (mid + Math.imul(al5, bh8)) | 0;
  1424. mid = (mid + Math.imul(ah5, bl8)) | 0;
  1425. hi = (hi + Math.imul(ah5, bh8)) | 0;
  1426. lo = (lo + Math.imul(al4, bl9)) | 0;
  1427. mid = (mid + Math.imul(al4, bh9)) | 0;
  1428. mid = (mid + Math.imul(ah4, bl9)) | 0;
  1429. hi = (hi + Math.imul(ah4, bh9)) | 0;
  1430. var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1431. c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
  1432. w13 &= 0x3ffffff;
  1433. /* k = 14 */
  1434. lo = Math.imul(al9, bl5);
  1435. mid = Math.imul(al9, bh5);
  1436. mid = (mid + Math.imul(ah9, bl5)) | 0;
  1437. hi = Math.imul(ah9, bh5);
  1438. lo = (lo + Math.imul(al8, bl6)) | 0;
  1439. mid = (mid + Math.imul(al8, bh6)) | 0;
  1440. mid = (mid + Math.imul(ah8, bl6)) | 0;
  1441. hi = (hi + Math.imul(ah8, bh6)) | 0;
  1442. lo = (lo + Math.imul(al7, bl7)) | 0;
  1443. mid = (mid + Math.imul(al7, bh7)) | 0;
  1444. mid = (mid + Math.imul(ah7, bl7)) | 0;
  1445. hi = (hi + Math.imul(ah7, bh7)) | 0;
  1446. lo = (lo + Math.imul(al6, bl8)) | 0;
  1447. mid = (mid + Math.imul(al6, bh8)) | 0;
  1448. mid = (mid + Math.imul(ah6, bl8)) | 0;
  1449. hi = (hi + Math.imul(ah6, bh8)) | 0;
  1450. lo = (lo + Math.imul(al5, bl9)) | 0;
  1451. mid = (mid + Math.imul(al5, bh9)) | 0;
  1452. mid = (mid + Math.imul(ah5, bl9)) | 0;
  1453. hi = (hi + Math.imul(ah5, bh9)) | 0;
  1454. var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1455. c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
  1456. w14 &= 0x3ffffff;
  1457. /* k = 15 */
  1458. lo = Math.imul(al9, bl6);
  1459. mid = Math.imul(al9, bh6);
  1460. mid = (mid + Math.imul(ah9, bl6)) | 0;
  1461. hi = Math.imul(ah9, bh6);
  1462. lo = (lo + Math.imul(al8, bl7)) | 0;
  1463. mid = (mid + Math.imul(al8, bh7)) | 0;
  1464. mid = (mid + Math.imul(ah8, bl7)) | 0;
  1465. hi = (hi + Math.imul(ah8, bh7)) | 0;
  1466. lo = (lo + Math.imul(al7, bl8)) | 0;
  1467. mid = (mid + Math.imul(al7, bh8)) | 0;
  1468. mid = (mid + Math.imul(ah7, bl8)) | 0;
  1469. hi = (hi + Math.imul(ah7, bh8)) | 0;
  1470. lo = (lo + Math.imul(al6, bl9)) | 0;
  1471. mid = (mid + Math.imul(al6, bh9)) | 0;
  1472. mid = (mid + Math.imul(ah6, bl9)) | 0;
  1473. hi = (hi + Math.imul(ah6, bh9)) | 0;
  1474. var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1475. c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
  1476. w15 &= 0x3ffffff;
  1477. /* k = 16 */
  1478. lo = Math.imul(al9, bl7);
  1479. mid = Math.imul(al9, bh7);
  1480. mid = (mid + Math.imul(ah9, bl7)) | 0;
  1481. hi = Math.imul(ah9, bh7);
  1482. lo = (lo + Math.imul(al8, bl8)) | 0;
  1483. mid = (mid + Math.imul(al8, bh8)) | 0;
  1484. mid = (mid + Math.imul(ah8, bl8)) | 0;
  1485. hi = (hi + Math.imul(ah8, bh8)) | 0;
  1486. lo = (lo + Math.imul(al7, bl9)) | 0;
  1487. mid = (mid + Math.imul(al7, bh9)) | 0;
  1488. mid = (mid + Math.imul(ah7, bl9)) | 0;
  1489. hi = (hi + Math.imul(ah7, bh9)) | 0;
  1490. var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1491. c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
  1492. w16 &= 0x3ffffff;
  1493. /* k = 17 */
  1494. lo = Math.imul(al9, bl8);
  1495. mid = Math.imul(al9, bh8);
  1496. mid = (mid + Math.imul(ah9, bl8)) | 0;
  1497. hi = Math.imul(ah9, bh8);
  1498. lo = (lo + Math.imul(al8, bl9)) | 0;
  1499. mid = (mid + Math.imul(al8, bh9)) | 0;
  1500. mid = (mid + Math.imul(ah8, bl9)) | 0;
  1501. hi = (hi + Math.imul(ah8, bh9)) | 0;
  1502. var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1503. c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
  1504. w17 &= 0x3ffffff;
  1505. /* k = 18 */
  1506. lo = Math.imul(al9, bl9);
  1507. mid = Math.imul(al9, bh9);
  1508. mid = (mid + Math.imul(ah9, bl9)) | 0;
  1509. hi = Math.imul(ah9, bh9);
  1510. var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1511. c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
  1512. w18 &= 0x3ffffff;
  1513. o[0] = w0;
  1514. o[1] = w1;
  1515. o[2] = w2;
  1516. o[3] = w3;
  1517. o[4] = w4;
  1518. o[5] = w5;
  1519. o[6] = w6;
  1520. o[7] = w7;
  1521. o[8] = w8;
  1522. o[9] = w9;
  1523. o[10] = w10;
  1524. o[11] = w11;
  1525. o[12] = w12;
  1526. o[13] = w13;
  1527. o[14] = w14;
  1528. o[15] = w15;
  1529. o[16] = w16;
  1530. o[17] = w17;
  1531. o[18] = w18;
  1532. if (c !== 0) {
  1533. o[19] = c;
  1534. out.length++;
  1535. }
  1536. return out;
  1537. };
  1538. // Polyfill comb
  1539. if (!Math.imul) {
  1540. comb10MulTo = smallMulTo;
  1541. }
  1542. function bigMulTo (self, num, out) {
  1543. out.negative = num.negative ^ self.negative;
  1544. out.length = self.length + num.length;
  1545. var carry = 0;
  1546. var hncarry = 0;
  1547. for (var k = 0; k < out.length - 1; k++) {
  1548. // Sum all words with the same `i + j = k` and accumulate `ncarry`,
  1549. // note that ncarry could be >= 0x3ffffff
  1550. var ncarry = hncarry;
  1551. hncarry = 0;
  1552. var rword = carry & 0x3ffffff;
  1553. var maxJ = Math.min(k, num.length - 1);
  1554. for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
  1555. var i = k - j;
  1556. var a = self.words[i] | 0;
  1557. var b = num.words[j] | 0;
  1558. var r = a * b;
  1559. var lo = r & 0x3ffffff;
  1560. ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
  1561. lo = (lo + rword) | 0;
  1562. rword = lo & 0x3ffffff;
  1563. ncarry = (ncarry + (lo >>> 26)) | 0;
  1564. hncarry += ncarry >>> 26;
  1565. ncarry &= 0x3ffffff;
  1566. }
  1567. out.words[k] = rword;
  1568. carry = ncarry;
  1569. ncarry = hncarry;
  1570. }
  1571. if (carry !== 0) {
  1572. out.words[k] = carry;
  1573. } else {
  1574. out.length--;
  1575. }
  1576. return out._strip();
  1577. }
  1578. function jumboMulTo (self, num, out) {
  1579. // Temporary disable, see https://github.com/indutny/bn.js/issues/211
  1580. // var fftm = new FFTM();
  1581. // return fftm.mulp(self, num, out);
  1582. return bigMulTo(self, num, out);
  1583. }
  1584. BN.prototype.mulTo = function mulTo (num, out) {
  1585. var res;
  1586. var len = this.length + num.length;
  1587. if (this.length === 10 && num.length === 10) {
  1588. res = comb10MulTo(this, num, out);
  1589. } else if (len < 63) {
  1590. res = smallMulTo(this, num, out);
  1591. } else if (len < 1024) {
  1592. res = bigMulTo(this, num, out);
  1593. } else {
  1594. res = jumboMulTo(this, num, out);
  1595. }
  1596. return res;
  1597. };
  1598. // Cooley-Tukey algorithm for FFT
  1599. // slightly revisited to rely on looping instead of recursion
  1600. function FFTM (x, y) {
  1601. this.x = x;
  1602. this.y = y;
  1603. }
  1604. FFTM.prototype.makeRBT = function makeRBT (N) {
  1605. var t = new Array(N);
  1606. var l = BN.prototype._countBits(N) - 1;
  1607. for (var i = 0; i < N; i++) {
  1608. t[i] = this.revBin(i, l, N);
  1609. }
  1610. return t;
  1611. };
  1612. // Returns binary-reversed representation of `x`
  1613. FFTM.prototype.revBin = function revBin (x, l, N) {
  1614. if (x === 0 || x === N - 1) return x;
  1615. var rb = 0;
  1616. for (var i = 0; i < l; i++) {
  1617. rb |= (x & 1) << (l - i - 1);
  1618. x >>= 1;
  1619. }
  1620. return rb;
  1621. };
  1622. // Performs "tweedling" phase, therefore 'emulating'
  1623. // behaviour of the recursive algorithm
  1624. FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
  1625. for (var i = 0; i < N; i++) {
  1626. rtws[i] = rws[rbt[i]];
  1627. itws[i] = iws[rbt[i]];
  1628. }
  1629. };
  1630. FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
  1631. this.permute(rbt, rws, iws, rtws, itws, N);
  1632. for (var s = 1; s < N; s <<= 1) {
  1633. var l = s << 1;
  1634. var rtwdf = Math.cos(2 * Math.PI / l);
  1635. var itwdf = Math.sin(2 * Math.PI / l);
  1636. for (var p = 0; p < N; p += l) {
  1637. var rtwdf_ = rtwdf;
  1638. var itwdf_ = itwdf;
  1639. for (var j = 0; j < s; j++) {
  1640. var re = rtws[p + j];
  1641. var ie = itws[p + j];
  1642. var ro = rtws[p + j + s];
  1643. var io = itws[p + j + s];
  1644. var rx = rtwdf_ * ro - itwdf_ * io;
  1645. io = rtwdf_ * io + itwdf_ * ro;
  1646. ro = rx;
  1647. rtws[p + j] = re + ro;
  1648. itws[p + j] = ie + io;
  1649. rtws[p + j + s] = re - ro;
  1650. itws[p + j + s] = ie - io;
  1651. /* jshint maxdepth : false */
  1652. if (j !== l) {
  1653. rx = rtwdf * rtwdf_ - itwdf * itwdf_;
  1654. itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
  1655. rtwdf_ = rx;
  1656. }
  1657. }
  1658. }
  1659. }
  1660. };
  1661. FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
  1662. var N = Math.max(m, n) | 1;
  1663. var odd = N & 1;
  1664. var i = 0;
  1665. for (N = N / 2 | 0; N; N = N >>> 1) {
  1666. i++;
  1667. }
  1668. return 1 << i + 1 + odd;
  1669. };
  1670. FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
  1671. if (N <= 1) return;
  1672. for (var i = 0; i < N / 2; i++) {
  1673. var t = rws[i];
  1674. rws[i] = rws[N - i - 1];
  1675. rws[N - i - 1] = t;
  1676. t = iws[i];
  1677. iws[i] = -iws[N - i - 1];
  1678. iws[N - i - 1] = -t;
  1679. }
  1680. };
  1681. FFTM.prototype.normalize13b = function normalize13b (ws, N) {
  1682. var carry = 0;
  1683. for (var i = 0; i < N / 2; i++) {
  1684. var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
  1685. Math.round(ws[2 * i] / N) +
  1686. carry;
  1687. ws[i] = w & 0x3ffffff;
  1688. if (w < 0x4000000) {
  1689. carry = 0;
  1690. } else {
  1691. carry = w / 0x4000000 | 0;
  1692. }
  1693. }
  1694. return ws;
  1695. };
  1696. FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
  1697. var carry = 0;
  1698. for (var i = 0; i < len; i++) {
  1699. carry = carry + (ws[i] | 0);
  1700. rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
  1701. rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
  1702. }
  1703. // Pad with zeroes
  1704. for (i = 2 * len; i < N; ++i) {
  1705. rws[i] = 0;
  1706. }
  1707. assert(carry === 0);
  1708. assert((carry & ~0x1fff) === 0);
  1709. };
  1710. FFTM.prototype.stub = function stub (N) {
  1711. var ph = new Array(N);
  1712. for (var i = 0; i < N; i++) {
  1713. ph[i] = 0;
  1714. }
  1715. return ph;
  1716. };
  1717. FFTM.prototype.mulp = function mulp (x, y, out) {
  1718. var N = 2 * this.guessLen13b(x.length, y.length);
  1719. var rbt = this.makeRBT(N);
  1720. var _ = this.stub(N);
  1721. var rws = new Array(N);
  1722. var rwst = new Array(N);
  1723. var iwst = new Array(N);
  1724. var nrws = new Array(N);
  1725. var nrwst = new Array(N);
  1726. var niwst = new Array(N);
  1727. var rmws = out.words;
  1728. rmws.length = N;
  1729. this.convert13b(x.words, x.length, rws, N);
  1730. this.convert13b(y.words, y.length, nrws, N);
  1731. this.transform(rws, _, rwst, iwst, N, rbt);
  1732. this.transform(nrws, _, nrwst, niwst, N, rbt);
  1733. for (var i = 0; i < N; i++) {
  1734. var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
  1735. iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
  1736. rwst[i] = rx;
  1737. }
  1738. this.conjugate(rwst, iwst, N);
  1739. this.transform(rwst, iwst, rmws, _, N, rbt);
  1740. this.conjugate(rmws, _, N);
  1741. this.normalize13b(rmws, N);
  1742. out.negative = x.negative ^ y.negative;
  1743. out.length = x.length + y.length;
  1744. return out._strip();
  1745. };
  1746. // Multiply `this` by `num`
  1747. BN.prototype.mul = function mul (num) {
  1748. var out = new BN(null);
  1749. out.words = new Array(this.length + num.length);
  1750. return this.mulTo(num, out);
  1751. };
  1752. // Multiply employing FFT
  1753. BN.prototype.mulf = function mulf (num) {
  1754. var out = new BN(null);
  1755. out.words = new Array(this.length + num.length);
  1756. return jumboMulTo(this, num, out);
  1757. };
  1758. // In-place Multiplication
  1759. BN.prototype.imul = function imul (num) {
  1760. return this.clone().mulTo(num, this);
  1761. };
  1762. BN.prototype.imuln = function imuln (num) {
  1763. var isNegNum = num < 0;
  1764. if (isNegNum) num = -num;
  1765. assert(typeof num === 'number');
  1766. assert(num < 0x4000000);
  1767. // Carry
  1768. var carry = 0;
  1769. for (var i = 0; i < this.length; i++) {
  1770. var w = (this.words[i] | 0) * num;
  1771. var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
  1772. carry >>= 26;
  1773. carry += (w / 0x4000000) | 0;
  1774. // NOTE: lo is 27bit maximum
  1775. carry += lo >>> 26;
  1776. this.words[i] = lo & 0x3ffffff;
  1777. }
  1778. if (carry !== 0) {
  1779. this.words[i] = carry;
  1780. this.length++;
  1781. }
  1782. this.length = num === 0 ? 1 : this.length;
  1783. return isNegNum ? this.ineg() : this;
  1784. };
  1785. BN.prototype.muln = function muln (num) {
  1786. return this.clone().imuln(num);
  1787. };
  1788. // `this` * `this`
  1789. BN.prototype.sqr = function sqr () {
  1790. return this.mul(this);
  1791. };
  1792. // `this` * `this` in-place
  1793. BN.prototype.isqr = function isqr () {
  1794. return this.imul(this.clone());
  1795. };
  1796. // Math.pow(`this`, `num`)
  1797. BN.prototype.pow = function pow (num) {
  1798. var w = toBitArray(num);
  1799. if (w.length === 0) return new BN(1);
  1800. // Skip leading zeroes
  1801. var res = this;
  1802. for (var i = 0; i < w.length; i++, res = res.sqr()) {
  1803. if (w[i] !== 0) break;
  1804. }
  1805. if (++i < w.length) {
  1806. for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
  1807. if (w[i] === 0) continue;
  1808. res = res.mul(q);
  1809. }
  1810. }
  1811. return res;
  1812. };
  1813. // Shift-left in-place
  1814. BN.prototype.iushln = function iushln (bits) {
  1815. assert(typeof bits === 'number' && bits >= 0);
  1816. var r = bits % 26;
  1817. var s = (bits - r) / 26;
  1818. var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
  1819. var i;
  1820. if (r !== 0) {
  1821. var carry = 0;
  1822. for (i = 0; i < this.length; i++) {
  1823. var newCarry = this.words[i] & carryMask;
  1824. var c = ((this.words[i] | 0) - newCarry) << r;
  1825. this.words[i] = c | carry;
  1826. carry = newCarry >>> (26 - r);
  1827. }
  1828. if (carry) {
  1829. this.words[i] = carry;
  1830. this.length++;
  1831. }
  1832. }
  1833. if (s !== 0) {
  1834. for (i = this.length - 1; i >= 0; i--) {
  1835. this.words[i + s] = this.words[i];
  1836. }
  1837. for (i = 0; i < s; i++) {
  1838. this.words[i] = 0;
  1839. }
  1840. this.length += s;
  1841. }
  1842. return this._strip();
  1843. };
  1844. BN.prototype.ishln = function ishln (bits) {
  1845. // TODO(indutny): implement me
  1846. assert(this.negative === 0);
  1847. return this.iushln(bits);
  1848. };
  1849. // Shift-right in-place
  1850. // NOTE: `hint` is a lowest bit before trailing zeroes
  1851. // NOTE: if `extended` is present - it will be filled with destroyed bits
  1852. BN.prototype.iushrn = function iushrn (bits, hint, extended) {
  1853. assert(typeof bits === 'number' && bits >= 0);
  1854. var h;
  1855. if (hint) {
  1856. h = (hint - (hint % 26)) / 26;
  1857. } else {
  1858. h = 0;
  1859. }
  1860. var r = bits % 26;
  1861. var s = Math.min((bits - r) / 26, this.length);
  1862. var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
  1863. var maskedWords = extended;
  1864. h -= s;
  1865. h = Math.max(0, h);
  1866. // Extended mode, copy masked part
  1867. if (maskedWords) {
  1868. for (var i = 0; i < s; i++) {
  1869. maskedWords.words[i] = this.words[i];
  1870. }
  1871. maskedWords.length = s;
  1872. }
  1873. if (s === 0) {
  1874. // No-op, we should not move anything at all
  1875. } else if (this.length > s) {
  1876. this.length -= s;
  1877. for (i = 0; i < this.length; i++) {
  1878. this.words[i] = this.words[i + s];
  1879. }
  1880. } else {
  1881. this.words[0] = 0;
  1882. this.length = 1;
  1883. }
  1884. var carry = 0;
  1885. for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
  1886. var word = this.words[i] | 0;
  1887. this.words[i] = (carry << (26 - r)) | (word >>> r);
  1888. carry = word & mask;
  1889. }
  1890. // Push carried bits as a mask
  1891. if (maskedWords && carry !== 0) {
  1892. maskedWords.words[maskedWords.length++] = carry;
  1893. }
  1894. if (this.length === 0) {
  1895. this.words[0] = 0;
  1896. this.length = 1;
  1897. }
  1898. return this._strip();
  1899. };
  1900. BN.prototype.ishrn = function ishrn (bits, hint, extended) {
  1901. // TODO(indutny): implement me
  1902. assert(this.negative === 0);
  1903. return this.iushrn(bits, hint, extended);
  1904. };
  1905. // Shift-left
  1906. BN.prototype.shln = function shln (bits) {
  1907. return this.clone().ishln(bits);
  1908. };
  1909. BN.prototype.ushln = function ushln (bits) {
  1910. return this.clone().iushln(bits);
  1911. };
  1912. // Shift-right
  1913. BN.prototype.shrn = function shrn (bits) {
  1914. return this.clone().ishrn(bits);
  1915. };
  1916. BN.prototype.ushrn = function ushrn (bits) {
  1917. return this.clone().iushrn(bits);
  1918. };
  1919. // Test if n bit is set
  1920. BN.prototype.testn = function testn (bit) {
  1921. assert(typeof bit === 'number' && bit >= 0);
  1922. var r = bit % 26;
  1923. var s = (bit - r) / 26;
  1924. var q = 1 << r;
  1925. // Fast case: bit is much higher than all existing words
  1926. if (this.length <= s) return false;
  1927. // Check bit and return
  1928. var w = this.words[s];
  1929. return !!(w & q);
  1930. };
  1931. // Return only lowers bits of number (in-place)
  1932. BN.prototype.imaskn = function imaskn (bits) {
  1933. assert(typeof bits === 'number' && bits >= 0);
  1934. var r = bits % 26;
  1935. var s = (bits - r) / 26;
  1936. assert(this.negative === 0, 'imaskn works only with positive numbers');
  1937. if (this.length <= s) {
  1938. return this;
  1939. }
  1940. if (r !== 0) {
  1941. s++;
  1942. }
  1943. this.length = Math.min(s, this.length);
  1944. if (r !== 0) {
  1945. var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
  1946. this.words[this.length - 1] &= mask;
  1947. }
  1948. return this._strip();
  1949. };
  1950. // Return only lowers bits of number
  1951. BN.prototype.maskn = function maskn (bits) {
  1952. return this.clone().imaskn(bits);
  1953. };
  1954. // Add plain number `num` to `this`
  1955. BN.prototype.iaddn = function iaddn (num) {
  1956. assert(typeof num === 'number');
  1957. assert(num < 0x4000000);
  1958. if (num < 0) return this.isubn(-num);
  1959. // Possible sign change
  1960. if (this.negative !== 0) {
  1961. if (this.length === 1 && (this.words[0] | 0) <= num) {
  1962. this.words[0] = num - (this.words[0] | 0);
  1963. this.negative = 0;
  1964. return this;
  1965. }
  1966. this.negative = 0;
  1967. this.isubn(num);
  1968. this.negative = 1;
  1969. return this;
  1970. }
  1971. // Add without checks
  1972. return this._iaddn(num);
  1973. };
  1974. BN.prototype._iaddn = function _iaddn (num) {
  1975. this.words[0] += num;
  1976. // Carry
  1977. for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
  1978. this.words[i] -= 0x4000000;
  1979. if (i === this.length - 1) {
  1980. this.words[i + 1] = 1;
  1981. } else {
  1982. this.words[i + 1]++;
  1983. }
  1984. }
  1985. this.length = Math.max(this.length, i + 1);
  1986. return this;
  1987. };
  1988. // Subtract plain number `num` from `this`
  1989. BN.prototype.isubn = function isubn (num) {
  1990. assert(typeof num === 'number');
  1991. assert(num < 0x4000000);
  1992. if (num < 0) return this.iaddn(-num);
  1993. if (this.negative !== 0) {
  1994. this.negative = 0;
  1995. this.iaddn(num);
  1996. this.negative = 1;
  1997. return this;
  1998. }
  1999. this.words[0] -= num;
  2000. if (this.length === 1 && this.words[0] < 0) {
  2001. this.words[0] = -this.words[0];
  2002. this.negative = 1;
  2003. } else {
  2004. // Carry
  2005. for (var i = 0; i < this.length && this.words[i] < 0; i++) {
  2006. this.words[i] += 0x4000000;
  2007. this.words[i + 1] -= 1;
  2008. }
  2009. }
  2010. return this._strip();
  2011. };
  2012. BN.prototype.addn = function addn (num) {
  2013. return this.clone().iaddn(num);
  2014. };
  2015. BN.prototype.subn = function subn (num) {
  2016. return this.clone().isubn(num);
  2017. };
  2018. BN.prototype.iabs = function iabs () {
  2019. this.negative = 0;
  2020. return this;
  2021. };
  2022. BN.prototype.abs = function abs () {
  2023. return this.clone().iabs();
  2024. };
  2025. BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
  2026. var len = num.length + shift;
  2027. var i;
  2028. this._expand(len);
  2029. var w;
  2030. var carry = 0;
  2031. for (i = 0; i < num.length; i++) {
  2032. w = (this.words[i + shift] | 0) + carry;
  2033. var right = (num.words[i] | 0) * mul;
  2034. w -= right & 0x3ffffff;
  2035. carry = (w >> 26) - ((right / 0x4000000) | 0);
  2036. this.words[i + shift] = w & 0x3ffffff;
  2037. }
  2038. for (; i < this.length - shift; i++) {
  2039. w = (this.words[i + shift] | 0) + carry;
  2040. carry = w >> 26;
  2041. this.words[i + shift] = w & 0x3ffffff;
  2042. }
  2043. if (carry === 0) return this._strip();
  2044. // Subtraction overflow
  2045. assert(carry === -1);
  2046. carry = 0;
  2047. for (i = 0; i < this.length; i++) {
  2048. w = -(this.words[i] | 0) + carry;
  2049. carry = w >> 26;
  2050. this.words[i] = w & 0x3ffffff;
  2051. }
  2052. this.negative = 1;
  2053. return this._strip();
  2054. };
  2055. BN.prototype._wordDiv = function _wordDiv (num, mode) {
  2056. var shift = this.length - num.length;
  2057. var a = this.clone();
  2058. var b = num;
  2059. // Normalize
  2060. var bhi = b.words[b.length - 1] | 0;
  2061. var bhiBits = this._countBits(bhi);
  2062. shift = 26 - bhiBits;
  2063. if (shift !== 0) {
  2064. b = b.ushln(shift);
  2065. a.iushln(shift);
  2066. bhi = b.words[b.length - 1] | 0;
  2067. }
  2068. // Initialize quotient
  2069. var m = a.length - b.length;
  2070. var q;
  2071. if (mode !== 'mod') {
  2072. q = new BN(null);
  2073. q.length = m + 1;
  2074. q.words = new Array(q.length);
  2075. for (var i = 0; i < q.length; i++) {
  2076. q.words[i] = 0;
  2077. }
  2078. }
  2079. var diff = a.clone()._ishlnsubmul(b, 1, m);
  2080. if (diff.negative === 0) {
  2081. a = diff;
  2082. if (q) {
  2083. q.words[m] = 1;
  2084. }
  2085. }
  2086. for (var j = m - 1; j >= 0; j--) {
  2087. var qj = (a.words[b.length + j] | 0) * 0x4000000 +
  2088. (a.words[b.length + j - 1] | 0);
  2089. // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
  2090. // (0x7ffffff)
  2091. qj = Math.min((qj / bhi) | 0, 0x3ffffff);
  2092. a._ishlnsubmul(b, qj, j);
  2093. while (a.negative !== 0) {
  2094. qj--;
  2095. a.negative = 0;
  2096. a._ishlnsubmul(b, 1, j);
  2097. if (!a.isZero()) {
  2098. a.negative ^= 1;
  2099. }
  2100. }
  2101. if (q) {
  2102. q.words[j] = qj;
  2103. }
  2104. }
  2105. if (q) {
  2106. q._strip();
  2107. }
  2108. a._strip();
  2109. // Denormalize
  2110. if (mode !== 'div' && shift !== 0) {
  2111. a.iushrn(shift);
  2112. }
  2113. return {
  2114. div: q || null,
  2115. mod: a
  2116. };
  2117. };
  2118. // NOTE: 1) `mode` can be set to `mod` to request mod only,
  2119. // to `div` to request div only, or be absent to
  2120. // request both div & mod
  2121. // 2) `positive` is true if unsigned mod is requested
  2122. BN.prototype.divmod = function divmod (num, mode, positive) {
  2123. assert(!num.isZero());
  2124. if (this.isZero()) {
  2125. return {
  2126. div: new BN(0),
  2127. mod: new BN(0)
  2128. };
  2129. }
  2130. var div, mod, res;
  2131. if (this.negative !== 0 && num.negative === 0) {
  2132. res = this.neg().divmod(num, mode);
  2133. if (mode !== 'mod') {
  2134. div = res.div.neg();
  2135. }
  2136. if (mode !== 'div') {
  2137. mod = res.mod.neg();
  2138. if (positive && mod.negative !== 0) {
  2139. mod.iadd(num);
  2140. }
  2141. }
  2142. return {
  2143. div: div,
  2144. mod: mod
  2145. };
  2146. }
  2147. if (this.negative === 0 && num.negative !== 0) {
  2148. res = this.divmod(num.neg(), mode);
  2149. if (mode !== 'mod') {
  2150. div = res.div.neg();
  2151. }
  2152. return {
  2153. div: div,
  2154. mod: res.mod
  2155. };
  2156. }
  2157. if ((this.negative & num.negative) !== 0) {
  2158. res = this.neg().divmod(num.neg(), mode);
  2159. if (mode !== 'div') {
  2160. mod = res.mod.neg();
  2161. if (positive && mod.negative !== 0) {
  2162. mod.isub(num);
  2163. }
  2164. }
  2165. return {
  2166. div: res.div,
  2167. mod: mod
  2168. };
  2169. }
  2170. // Both numbers are positive at this point
  2171. // Strip both numbers to approximate shift value
  2172. if (num.length > this.length || this.cmp(num) < 0) {
  2173. return {
  2174. div: new BN(0),
  2175. mod: this
  2176. };
  2177. }
  2178. // Very short reduction
  2179. if (num.length === 1) {
  2180. if (mode === 'div') {
  2181. return {
  2182. div: this.divn(num.words[0]),
  2183. mod: null
  2184. };
  2185. }
  2186. if (mode === 'mod') {
  2187. return {
  2188. div: null,
  2189. mod: new BN(this.modrn(num.words[0]))
  2190. };
  2191. }
  2192. return {
  2193. div: this.divn(num.words[0]),
  2194. mod: new BN(this.modrn(num.words[0]))
  2195. };
  2196. }
  2197. return this._wordDiv(num, mode);
  2198. };
  2199. // Find `this` / `num`
  2200. BN.prototype.div = function div (num) {
  2201. return this.divmod(num, 'div', false).div;
  2202. };
  2203. // Find `this` % `num`
  2204. BN.prototype.mod = function mod (num) {
  2205. return this.divmod(num, 'mod', false).mod;
  2206. };
  2207. BN.prototype.umod = function umod (num) {
  2208. return this.divmod(num, 'mod', true).mod;
  2209. };
  2210. // Find Round(`this` / `num`)
  2211. BN.prototype.divRound = function divRound (num) {
  2212. var dm = this.divmod(num);
  2213. // Fast case - exact division
  2214. if (dm.mod.isZero()) return dm.div;
  2215. var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
  2216. var half = num.ushrn(1);
  2217. var r2 = num.andln(1);
  2218. var cmp = mod.cmp(half);
  2219. // Round down
  2220. if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;
  2221. // Round up
  2222. return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
  2223. };
  2224. BN.prototype.modrn = function modrn (num) {
  2225. var isNegNum = num < 0;
  2226. if (isNegNum) num = -num;
  2227. assert(num <= 0x3ffffff);
  2228. var p = (1 << 26) % num;
  2229. var acc = 0;
  2230. for (var i = this.length - 1; i >= 0; i--) {
  2231. acc = (p * acc + (this.words[i] | 0)) % num;
  2232. }
  2233. return isNegNum ? -acc : acc;
  2234. };
  2235. // WARNING: DEPRECATED
  2236. BN.prototype.modn = function modn (num) {
  2237. return this.modrn(num);
  2238. };
  2239. // In-place division by number
  2240. BN.prototype.idivn = function idivn (num) {
  2241. var isNegNum = num < 0;
  2242. if (isNegNum) num = -num;
  2243. assert(num <= 0x3ffffff);
  2244. var carry = 0;
  2245. for (var i = this.length - 1; i >= 0; i--) {
  2246. var w = (this.words[i] | 0) + carry * 0x4000000;
  2247. this.words[i] = (w / num) | 0;
  2248. carry = w % num;
  2249. }
  2250. this._strip();
  2251. return isNegNum ? this.ineg() : this;
  2252. };
  2253. BN.prototype.divn = function divn (num) {
  2254. return this.clone().idivn(num);
  2255. };
  2256. BN.prototype.egcd = function egcd (p) {
  2257. assert(p.negative === 0);
  2258. assert(!p.isZero());
  2259. var x = this;
  2260. var y = p.clone();
  2261. if (x.negative !== 0) {
  2262. x = x.umod(p);
  2263. } else {
  2264. x = x.clone();
  2265. }
  2266. // A * x + B * y = x
  2267. var A = new BN(1);
  2268. var B = new BN(0);
  2269. // C * x + D * y = y
  2270. var C = new BN(0);
  2271. var D = new BN(1);
  2272. var g = 0;
  2273. while (x.isEven() && y.isEven()) {
  2274. x.iushrn(1);
  2275. y.iushrn(1);
  2276. ++g;
  2277. }
  2278. var yp = y.clone();
  2279. var xp = x.clone();
  2280. while (!x.isZero()) {
  2281. for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
  2282. if (i > 0) {
  2283. x.iushrn(i);
  2284. while (i-- > 0) {
  2285. if (A.isOdd() || B.isOdd()) {
  2286. A.iadd(yp);
  2287. B.isub(xp);
  2288. }
  2289. A.iushrn(1);
  2290. B.iushrn(1);
  2291. }
  2292. }
  2293. for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
  2294. if (j > 0) {
  2295. y.iushrn(j);
  2296. while (j-- > 0) {
  2297. if (C.isOdd() || D.isOdd()) {
  2298. C.iadd(yp);
  2299. D.isub(xp);
  2300. }
  2301. C.iushrn(1);
  2302. D.iushrn(1);
  2303. }
  2304. }
  2305. if (x.cmp(y) >= 0) {
  2306. x.isub(y);
  2307. A.isub(C);
  2308. B.isub(D);
  2309. } else {
  2310. y.isub(x);
  2311. C.isub(A);
  2312. D.isub(B);
  2313. }
  2314. }
  2315. return {
  2316. a: C,
  2317. b: D,
  2318. gcd: y.iushln(g)
  2319. };
  2320. };
  2321. // This is reduced incarnation of the binary EEA
  2322. // above, designated to invert members of the
  2323. // _prime_ fields F(p) at a maximal speed
  2324. BN.prototype._invmp = function _invmp (p) {
  2325. assert(p.negative === 0);
  2326. assert(!p.isZero());
  2327. var a = this;
  2328. var b = p.clone();
  2329. if (a.negative !== 0) {
  2330. a = a.umod(p);
  2331. } else {
  2332. a = a.clone();
  2333. }
  2334. var x1 = new BN(1);
  2335. var x2 = new BN(0);
  2336. var delta = b.clone();
  2337. while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
  2338. for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
  2339. if (i > 0) {
  2340. a.iushrn(i);
  2341. while (i-- > 0) {
  2342. if (x1.isOdd()) {
  2343. x1.iadd(delta);
  2344. }
  2345. x1.iushrn(1);
  2346. }
  2347. }
  2348. for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
  2349. if (j > 0) {
  2350. b.iushrn(j);
  2351. while (j-- > 0) {
  2352. if (x2.isOdd()) {
  2353. x2.iadd(delta);
  2354. }
  2355. x2.iushrn(1);
  2356. }
  2357. }
  2358. if (a.cmp(b) >= 0) {
  2359. a.isub(b);
  2360. x1.isub(x2);
  2361. } else {
  2362. b.isub(a);
  2363. x2.isub(x1);
  2364. }
  2365. }
  2366. var res;
  2367. if (a.cmpn(1) === 0) {
  2368. res = x1;
  2369. } else {
  2370. res = x2;
  2371. }
  2372. if (res.cmpn(0) < 0) {
  2373. res.iadd(p);
  2374. }
  2375. return res;
  2376. };
  2377. BN.prototype.gcd = function gcd (num) {
  2378. if (this.isZero()) return num.abs();
  2379. if (num.isZero()) return this.abs();
  2380. var a = this.clone();
  2381. var b = num.clone();
  2382. a.negative = 0;
  2383. b.negative = 0;
  2384. // Remove common factor of two
  2385. for (var shift = 0; a.isEven() && b.isEven(); shift++) {
  2386. a.iushrn(1);
  2387. b.iushrn(1);
  2388. }
  2389. do {
  2390. while (a.isEven()) {
  2391. a.iushrn(1);
  2392. }
  2393. while (b.isEven()) {
  2394. b.iushrn(1);
  2395. }
  2396. var r = a.cmp(b);
  2397. if (r < 0) {
  2398. // Swap `a` and `b` to make `a` always bigger than `b`
  2399. var t = a;
  2400. a = b;
  2401. b = t;
  2402. } else if (r === 0 || b.cmpn(1) === 0) {
  2403. break;
  2404. }
  2405. a.isub(b);
  2406. } while (true);
  2407. return b.iushln(shift);
  2408. };
  2409. // Invert number in the field F(num)
  2410. BN.prototype.invm = function invm (num) {
  2411. return this.egcd(num).a.umod(num);
  2412. };
  2413. BN.prototype.isEven = function isEven () {
  2414. return (this.words[0] & 1) === 0;
  2415. };
  2416. BN.prototype.isOdd = function isOdd () {
  2417. return (this.words[0] & 1) === 1;
  2418. };
  2419. // And first word and num
  2420. BN.prototype.andln = function andln (num) {
  2421. return this.words[0] & num;
  2422. };
  2423. // Increment at the bit position in-line
  2424. BN.prototype.bincn = function bincn (bit) {
  2425. assert(typeof bit === 'number');
  2426. var r = bit % 26;
  2427. var s = (bit - r) / 26;
  2428. var q = 1 << r;
  2429. // Fast case: bit is much higher than all existing words
  2430. if (this.length <= s) {
  2431. this._expand(s + 1);
  2432. this.words[s] |= q;
  2433. return this;
  2434. }
  2435. // Add bit and propagate, if needed
  2436. var carry = q;
  2437. for (var i = s; carry !== 0 && i < this.length; i++) {
  2438. var w = this.words[i] | 0;
  2439. w += carry;
  2440. carry = w >>> 26;
  2441. w &= 0x3ffffff;
  2442. this.words[i] = w;
  2443. }
  2444. if (carry !== 0) {
  2445. this.words[i] = carry;
  2446. this.length++;
  2447. }
  2448. return this;
  2449. };
  2450. BN.prototype.isZero = function isZero () {
  2451. return this.length === 1 && this.words[0] === 0;
  2452. };
  2453. BN.prototype.cmpn = function cmpn (num) {
  2454. var negative = num < 0;
  2455. if (this.negative !== 0 && !negative) return -1;
  2456. if (this.negative === 0 && negative) return 1;
  2457. this._strip();
  2458. var res;
  2459. if (this.length > 1) {
  2460. res = 1;
  2461. } else {
  2462. if (negative) {
  2463. num = -num;
  2464. }
  2465. assert(num <= 0x3ffffff, 'Number is too big');
  2466. var w = this.words[0] | 0;
  2467. res = w === num ? 0 : w < num ? -1 : 1;
  2468. }
  2469. if (this.negative !== 0) return -res | 0;
  2470. return res;
  2471. };
  2472. // Compare two numbers and return:
  2473. // 1 - if `this` > `num`
  2474. // 0 - if `this` == `num`
  2475. // -1 - if `this` < `num`
  2476. BN.prototype.cmp = function cmp (num) {
  2477. if (this.negative !== 0 && num.negative === 0) return -1;
  2478. if (this.negative === 0 && num.negative !== 0) return 1;
  2479. var res = this.ucmp(num);
  2480. if (this.negative !== 0) return -res | 0;
  2481. return res;
  2482. };
  2483. // Unsigned comparison
  2484. BN.prototype.ucmp = function ucmp (num) {
  2485. // At this point both numbers have the same sign
  2486. if (this.length > num.length) return 1;
  2487. if (this.length < num.length) return -1;
  2488. var res = 0;
  2489. for (var i = this.length - 1; i >= 0; i--) {
  2490. var a = this.words[i] | 0;
  2491. var b = num.words[i] | 0;
  2492. if (a === b) continue;
  2493. if (a < b) {
  2494. res = -1;
  2495. } else if (a > b) {
  2496. res = 1;
  2497. }
  2498. break;
  2499. }
  2500. return res;
  2501. };
  2502. BN.prototype.gtn = function gtn (num) {
  2503. return this.cmpn(num) === 1;
  2504. };
  2505. BN.prototype.gt = function gt (num) {
  2506. return this.cmp(num) === 1;
  2507. };
  2508. BN.prototype.gten = function gten (num) {
  2509. return this.cmpn(num) >= 0;
  2510. };
  2511. BN.prototype.gte = function gte (num) {
  2512. return this.cmp(num) >= 0;
  2513. };
  2514. BN.prototype.ltn = function ltn (num) {
  2515. return this.cmpn(num) === -1;
  2516. };
  2517. BN.prototype.lt = function lt (num) {
  2518. return this.cmp(num) === -1;
  2519. };
  2520. BN.prototype.lten = function lten (num) {
  2521. return this.cmpn(num) <= 0;
  2522. };
  2523. BN.prototype.lte = function lte (num) {
  2524. return this.cmp(num) <= 0;
  2525. };
  2526. BN.prototype.eqn = function eqn (num) {
  2527. return this.cmpn(num) === 0;
  2528. };
  2529. BN.prototype.eq = function eq (num) {
  2530. return this.cmp(num) === 0;
  2531. };
  2532. //
  2533. // A reduce context, could be using montgomery or something better, depending
  2534. // on the `m` itself.
  2535. //
  2536. BN.red = function red (num) {
  2537. return new Red(num);
  2538. };
  2539. BN.prototype.toRed = function toRed (ctx) {
  2540. assert(!this.red, 'Already a number in reduction context');
  2541. assert(this.negative === 0, 'red works only with positives');
  2542. return ctx.convertTo(this)._forceRed(ctx);
  2543. };
  2544. BN.prototype.fromRed = function fromRed () {
  2545. assert(this.red, 'fromRed works only with numbers in reduction context');
  2546. return this.red.convertFrom(this);
  2547. };
  2548. BN.prototype._forceRed = function _forceRed (ctx) {
  2549. this.red = ctx;
  2550. return this;
  2551. };
  2552. BN.prototype.forceRed = function forceRed (ctx) {
  2553. assert(!this.red, 'Already a number in reduction context');
  2554. return this._forceRed(ctx);
  2555. };
  2556. BN.prototype.redAdd = function redAdd (num) {
  2557. assert(this.red, 'redAdd works only with red numbers');
  2558. return this.red.add(this, num);
  2559. };
  2560. BN.prototype.redIAdd = function redIAdd (num) {
  2561. assert(this.red, 'redIAdd works only with red numbers');
  2562. return this.red.iadd(this, num);
  2563. };
  2564. BN.prototype.redSub = function redSub (num) {
  2565. assert(this.red, 'redSub works only with red numbers');
  2566. return this.red.sub(this, num);
  2567. };
  2568. BN.prototype.redISub = function redISub (num) {
  2569. assert(this.red, 'redISub works only with red numbers');
  2570. return this.red.isub(this, num);
  2571. };
  2572. BN.prototype.redShl = function redShl (num) {
  2573. assert(this.red, 'redShl works only with red numbers');
  2574. return this.red.shl(this, num);
  2575. };
  2576. BN.prototype.redMul = function redMul (num) {
  2577. assert(this.red, 'redMul works only with red numbers');
  2578. this.red._verify2(this, num);
  2579. return this.red.mul(this, num);
  2580. };
  2581. BN.prototype.redIMul = function redIMul (num) {
  2582. assert(this.red, 'redMul works only with red numbers');
  2583. this.red._verify2(this, num);
  2584. return this.red.imul(this, num);
  2585. };
  2586. BN.prototype.redSqr = function redSqr () {
  2587. assert(this.red, 'redSqr works only with red numbers');
  2588. this.red._verify1(this);
  2589. return this.red.sqr(this);
  2590. };
  2591. BN.prototype.redISqr = function redISqr () {
  2592. assert(this.red, 'redISqr works only with red numbers');
  2593. this.red._verify1(this);
  2594. return this.red.isqr(this);
  2595. };
  2596. // Square root over p
  2597. BN.prototype.redSqrt = function redSqrt () {
  2598. assert(this.red, 'redSqrt works only with red numbers');
  2599. this.red._verify1(this);
  2600. return this.red.sqrt(this);
  2601. };
  2602. BN.prototype.redInvm = function redInvm () {
  2603. assert(this.red, 'redInvm works only with red numbers');
  2604. this.red._verify1(this);
  2605. return this.red.invm(this);
  2606. };
  2607. // Return negative clone of `this` % `red modulo`
  2608. BN.prototype.redNeg = function redNeg () {
  2609. assert(this.red, 'redNeg works only with red numbers');
  2610. this.red._verify1(this);
  2611. return this.red.neg(this);
  2612. };
  2613. BN.prototype.redPow = function redPow (num) {
  2614. assert(this.red && !num.red, 'redPow(normalNum)');
  2615. this.red._verify1(this);
  2616. return this.red.pow(this, num);
  2617. };
  2618. // Prime numbers with efficient reduction
  2619. var primes = {
  2620. k256: null,
  2621. p224: null,
  2622. p192: null,
  2623. p25519: null
  2624. };
  2625. // Pseudo-Mersenne prime
  2626. function MPrime (name, p) {
  2627. // P = 2 ^ N - K
  2628. this.name = name;
  2629. this.p = new BN(p, 16);
  2630. this.n = this.p.bitLength();
  2631. this.k = new BN(1).iushln(this.n).isub(this.p);
  2632. this.tmp = this._tmp();
  2633. }
  2634. MPrime.prototype._tmp = function _tmp () {
  2635. var tmp = new BN(null);
  2636. tmp.words = new Array(Math.ceil(this.n / 13));
  2637. return tmp;
  2638. };
  2639. MPrime.prototype.ireduce = function ireduce (num) {
  2640. // Assumes that `num` is less than `P^2`
  2641. // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
  2642. var r = num;
  2643. var rlen;
  2644. do {
  2645. this.split(r, this.tmp);
  2646. r = this.imulK(r);
  2647. r = r.iadd(this.tmp);
  2648. rlen = r.bitLength();
  2649. } while (rlen > this.n);
  2650. var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
  2651. if (cmp === 0) {
  2652. r.words[0] = 0;
  2653. r.length = 1;
  2654. } else if (cmp > 0) {
  2655. r.isub(this.p);
  2656. } else {
  2657. if (r.strip !== undefined) {
  2658. // r is a BN v4 instance
  2659. r.strip();
  2660. } else {
  2661. // r is a BN v5 instance
  2662. r._strip();
  2663. }
  2664. }
  2665. return r;
  2666. };
  2667. MPrime.prototype.split = function split (input, out) {
  2668. input.iushrn(this.n, 0, out);
  2669. };
  2670. MPrime.prototype.imulK = function imulK (num) {
  2671. return num.imul(this.k);
  2672. };
  2673. function K256 () {
  2674. MPrime.call(
  2675. this,
  2676. 'k256',
  2677. 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
  2678. }
  2679. inherits(K256, MPrime);
  2680. K256.prototype.split = function split (input, output) {
  2681. // 256 = 9 * 26 + 22
  2682. var mask = 0x3fffff;
  2683. var outLen = Math.min(input.length, 9);
  2684. for (var i = 0; i < outLen; i++) {
  2685. output.words[i] = input.words[i];
  2686. }
  2687. output.length = outLen;
  2688. if (input.length <= 9) {
  2689. input.words[0] = 0;
  2690. input.length = 1;
  2691. return;
  2692. }
  2693. // Shift by 9 limbs
  2694. var prev = input.words[9];
  2695. output.words[output.length++] = prev & mask;
  2696. for (i = 10; i < input.length; i++) {
  2697. var next = input.words[i] | 0;
  2698. input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
  2699. prev = next;
  2700. }
  2701. prev >>>= 22;
  2702. input.words[i - 10] = prev;
  2703. if (prev === 0 && input.length > 10) {
  2704. input.length -= 10;
  2705. } else {
  2706. input.length -= 9;
  2707. }
  2708. };
  2709. K256.prototype.imulK = function imulK (num) {
  2710. // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
  2711. num.words[num.length] = 0;
  2712. num.words[num.length + 1] = 0;
  2713. num.length += 2;
  2714. // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
  2715. var lo = 0;
  2716. for (var i = 0; i < num.length; i++) {
  2717. var w = num.words[i] | 0;
  2718. lo += w * 0x3d1;
  2719. num.words[i] = lo & 0x3ffffff;
  2720. lo = w * 0x40 + ((lo / 0x4000000) | 0);
  2721. }
  2722. // Fast length reduction
  2723. if (num.words[num.length - 1] === 0) {
  2724. num.length--;
  2725. if (num.words[num.length - 1] === 0) {
  2726. num.length--;
  2727. }
  2728. }
  2729. return num;
  2730. };
  2731. function P224 () {
  2732. MPrime.call(
  2733. this,
  2734. 'p224',
  2735. 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
  2736. }
  2737. inherits(P224, MPrime);
  2738. function P192 () {
  2739. MPrime.call(
  2740. this,
  2741. 'p192',
  2742. 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
  2743. }
  2744. inherits(P192, MPrime);
  2745. function P25519 () {
  2746. // 2 ^ 255 - 19
  2747. MPrime.call(
  2748. this,
  2749. '25519',
  2750. '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
  2751. }
  2752. inherits(P25519, MPrime);
  2753. P25519.prototype.imulK = function imulK (num) {
  2754. // K = 0x13
  2755. var carry = 0;
  2756. for (var i = 0; i < num.length; i++) {
  2757. var hi = (num.words[i] | 0) * 0x13 + carry;
  2758. var lo = hi & 0x3ffffff;
  2759. hi >>>= 26;
  2760. num.words[i] = lo;
  2761. carry = hi;
  2762. }
  2763. if (carry !== 0) {
  2764. num.words[num.length++] = carry;
  2765. }
  2766. return num;
  2767. };
  2768. // Exported mostly for testing purposes, use plain name instead
  2769. BN._prime = function prime (name) {
  2770. // Cached version of prime
  2771. if (primes[name]) return primes[name];
  2772. var prime;
  2773. if (name === 'k256') {
  2774. prime = new K256();
  2775. } else if (name === 'p224') {
  2776. prime = new P224();
  2777. } else if (name === 'p192') {
  2778. prime = new P192();
  2779. } else if (name === 'p25519') {
  2780. prime = new P25519();
  2781. } else {
  2782. throw new Error('Unknown prime ' + name);
  2783. }
  2784. primes[name] = prime;
  2785. return prime;
  2786. };
  2787. //
  2788. // Base reduction engine
  2789. //
  2790. function Red (m) {
  2791. if (typeof m === 'string') {
  2792. var prime = BN._prime(m);
  2793. this.m = prime.p;
  2794. this.prime = prime;
  2795. } else {
  2796. assert(m.gtn(1), 'modulus must be greater than 1');
  2797. this.m = m;
  2798. this.prime = null;
  2799. }
  2800. }
  2801. Red.prototype._verify1 = function _verify1 (a) {
  2802. assert(a.negative === 0, 'red works only with positives');
  2803. assert(a.red, 'red works only with red numbers');
  2804. };
  2805. Red.prototype._verify2 = function _verify2 (a, b) {
  2806. assert((a.negative | b.negative) === 0, 'red works only with positives');
  2807. assert(a.red && a.red === b.red,
  2808. 'red works only with red numbers');
  2809. };
  2810. Red.prototype.imod = function imod (a) {
  2811. if (this.prime) return this.prime.ireduce(a)._forceRed(this);
  2812. move(a, a.umod(this.m)._forceRed(this));
  2813. return a;
  2814. };
  2815. Red.prototype.neg = function neg (a) {
  2816. if (a.isZero()) {
  2817. return a.clone();
  2818. }
  2819. return this.m.sub(a)._forceRed(this);
  2820. };
  2821. Red.prototype.add = function add (a, b) {
  2822. this._verify2(a, b);
  2823. var res = a.add(b);
  2824. if (res.cmp(this.m) >= 0) {
  2825. res.isub(this.m);
  2826. }
  2827. return res._forceRed(this);
  2828. };
  2829. Red.prototype.iadd = function iadd (a, b) {
  2830. this._verify2(a, b);
  2831. var res = a.iadd(b);
  2832. if (res.cmp(this.m) >= 0) {
  2833. res.isub(this.m);
  2834. }
  2835. return res;
  2836. };
  2837. Red.prototype.sub = function sub (a, b) {
  2838. this._verify2(a, b);
  2839. var res = a.sub(b);
  2840. if (res.cmpn(0) < 0) {
  2841. res.iadd(this.m);
  2842. }
  2843. return res._forceRed(this);
  2844. };
  2845. Red.prototype.isub = function isub (a, b) {
  2846. this._verify2(a, b);
  2847. var res = a.isub(b);
  2848. if (res.cmpn(0) < 0) {
  2849. res.iadd(this.m);
  2850. }
  2851. return res;
  2852. };
  2853. Red.prototype.shl = function shl (a, num) {
  2854. this._verify1(a);
  2855. return this.imod(a.ushln(num));
  2856. };
  2857. Red.prototype.imul = function imul (a, b) {
  2858. this._verify2(a, b);
  2859. return this.imod(a.imul(b));
  2860. };
  2861. Red.prototype.mul = function mul (a, b) {
  2862. this._verify2(a, b);
  2863. return this.imod(a.mul(b));
  2864. };
  2865. Red.prototype.isqr = function isqr (a) {
  2866. return this.imul(a, a.clone());
  2867. };
  2868. Red.prototype.sqr = function sqr (a) {
  2869. return this.mul(a, a);
  2870. };
  2871. Red.prototype.sqrt = function sqrt (a) {
  2872. if (a.isZero()) return a.clone();
  2873. var mod3 = this.m.andln(3);
  2874. assert(mod3 % 2 === 1);
  2875. // Fast case
  2876. if (mod3 === 3) {
  2877. var pow = this.m.add(new BN(1)).iushrn(2);
  2878. return this.pow(a, pow);
  2879. }
  2880. // Tonelli-Shanks algorithm (Totally unoptimized and slow)
  2881. //
  2882. // Find Q and S, that Q * 2 ^ S = (P - 1)
  2883. var q = this.m.subn(1);
  2884. var s = 0;
  2885. while (!q.isZero() && q.andln(1) === 0) {
  2886. s++;
  2887. q.iushrn(1);
  2888. }
  2889. assert(!q.isZero());
  2890. var one = new BN(1).toRed(this);
  2891. var nOne = one.redNeg();
  2892. // Find quadratic non-residue
  2893. // NOTE: Max is such because of generalized Riemann hypothesis.
  2894. var lpow = this.m.subn(1).iushrn(1);
  2895. var z = this.m.bitLength();
  2896. z = new BN(2 * z * z).toRed(this);
  2897. while (this.pow(z, lpow).cmp(nOne) !== 0) {
  2898. z.redIAdd(nOne);
  2899. }
  2900. var c = this.pow(z, q);
  2901. var r = this.pow(a, q.addn(1).iushrn(1));
  2902. var t = this.pow(a, q);
  2903. var m = s;
  2904. while (t.cmp(one) !== 0) {
  2905. var tmp = t;
  2906. for (var i = 0; tmp.cmp(one) !== 0; i++) {
  2907. tmp = tmp.redSqr();
  2908. }
  2909. assert(i < m);
  2910. var b = this.pow(c, new BN(1).iushln(m - i - 1));
  2911. r = r.redMul(b);
  2912. c = b.redSqr();
  2913. t = t.redMul(c);
  2914. m = i;
  2915. }
  2916. return r;
  2917. };
  2918. Red.prototype.invm = function invm (a) {
  2919. var inv = a._invmp(this.m);
  2920. if (inv.negative !== 0) {
  2921. inv.negative = 0;
  2922. return this.imod(inv).redNeg();
  2923. } else {
  2924. return this.imod(inv);
  2925. }
  2926. };
  2927. Red.prototype.pow = function pow (a, num) {
  2928. if (num.isZero()) return new BN(1).toRed(this);
  2929. if (num.cmpn(1) === 0) return a.clone();
  2930. var windowSize = 4;
  2931. var wnd = new Array(1 << windowSize);
  2932. wnd[0] = new BN(1).toRed(this);
  2933. wnd[1] = a;
  2934. for (var i = 2; i < wnd.length; i++) {
  2935. wnd[i] = this.mul(wnd[i - 1], a);
  2936. }
  2937. var res = wnd[0];
  2938. var current = 0;
  2939. var currentLen = 0;
  2940. var start = num.bitLength() % 26;
  2941. if (start === 0) {
  2942. start = 26;
  2943. }
  2944. for (i = num.length - 1; i >= 0; i--) {
  2945. var word = num.words[i];
  2946. for (var j = start - 1; j >= 0; j--) {
  2947. var bit = (word >> j) & 1;
  2948. if (res !== wnd[0]) {
  2949. res = this.sqr(res);
  2950. }
  2951. if (bit === 0 && current === 0) {
  2952. currentLen = 0;
  2953. continue;
  2954. }
  2955. current <<= 1;
  2956. current |= bit;
  2957. currentLen++;
  2958. if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
  2959. res = this.mul(res, wnd[current]);
  2960. currentLen = 0;
  2961. current = 0;
  2962. }
  2963. start = 26;
  2964. }
  2965. return res;
  2966. };
  2967. Red.prototype.convertTo = function convertTo (num) {
  2968. var r = num.umod(this.m);
  2969. return r === num ? r.clone() : r;
  2970. };
  2971. Red.prototype.convertFrom = function convertFrom (num) {
  2972. var res = num.clone();
  2973. res.red = null;
  2974. return res;
  2975. };
  2976. //
  2977. // Montgomery method engine
  2978. //
  2979. BN.mont = function mont (num) {
  2980. return new Mont(num);
  2981. };
  2982. function Mont (m) {
  2983. Red.call(this, m);
  2984. this.shift = this.m.bitLength();
  2985. if (this.shift % 26 !== 0) {
  2986. this.shift += 26 - (this.shift % 26);
  2987. }
  2988. this.r = new BN(1).iushln(this.shift);
  2989. this.r2 = this.imod(this.r.sqr());
  2990. this.rinv = this.r._invmp(this.m);
  2991. this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
  2992. this.minv = this.minv.umod(this.r);
  2993. this.minv = this.r.sub(this.minv);
  2994. }
  2995. inherits(Mont, Red);
  2996. Mont.prototype.convertTo = function convertTo (num) {
  2997. return this.imod(num.ushln(this.shift));
  2998. };
  2999. Mont.prototype.convertFrom = function convertFrom (num) {
  3000. var r = this.imod(num.mul(this.rinv));
  3001. r.red = null;
  3002. return r;
  3003. };
  3004. Mont.prototype.imul = function imul (a, b) {
  3005. if (a.isZero() || b.isZero()) {
  3006. a.words[0] = 0;
  3007. a.length = 1;
  3008. return a;
  3009. }
  3010. var t = a.imul(b);
  3011. var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
  3012. var u = t.isub(c).iushrn(this.shift);
  3013. var res = u;
  3014. if (u.cmp(this.m) >= 0) {
  3015. res = u.isub(this.m);
  3016. } else if (u.cmpn(0) < 0) {
  3017. res = u.iadd(this.m);
  3018. }
  3019. return res._forceRed(this);
  3020. };
  3021. Mont.prototype.mul = function mul (a, b) {
  3022. if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
  3023. var t = a.mul(b);
  3024. var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
  3025. var u = t.isub(c).iushrn(this.shift);
  3026. var res = u;
  3027. if (u.cmp(this.m) >= 0) {
  3028. res = u.isub(this.m);
  3029. } else if (u.cmpn(0) < 0) {
  3030. res = u.iadd(this.m);
  3031. }
  3032. return res._forceRed(this);
  3033. };
  3034. Mont.prototype.invm = function invm (a) {
  3035. // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
  3036. var res = this.imod(a._invmp(this.m).mul(this.r2));
  3037. return res._forceRed(this);
  3038. };
  3039. })(typeof module === 'undefined' || module, this);